ハードウェアセキュリティ統合 - AWS IoT Greengrass

2023 年 6 月 30 日に AWS IoT Greengrass Version 1 は延長ライフサイクルフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日付以降、AWS IoT Greengrass V1 の機能、拡張機能、バグ修正、またはセキュリティパッチを提供するアップデートはリリースされません。AWS IoT Greengrass V1 で稼働中のデバイスは中断されず、引き続き動作し、クラウドに接続できます。重要な新機能新たなプラットフォームのサポートが追加された AWS IoT Greengrass Version 2 への移行を強くお勧めします。

ハードウェアセキュリティ統合

この機能は AWS IoT Greengrass Core v1.7 以降で使用できます。

AWS IoT Greengrass は、プライベートキーの安全な保存とオフロードのために PKCS#11 インターフェイスを介したハードウェアセキュリティモジュール (HSM) の使用をサポートしています。これにより、ソフトウェアでキーが漏洩したり複製されたりするのを防ぎます。プライベートキーは、HSM、Trusted Platform Modules (TPM)、その他の暗号化要素などのハードウェアモジュールに安全に保存できます。

AWS Partner Device Catalog で、この機能に適合するデバイスを検索します。

以下の図では、AWS IoT Greengrass コアのハードウェアセキュリティアーキテクチャーを示しています。

AWS IoT Greengrass Core architecture with hardware security and message routing to AWS IoT Core and local devices.

標準インストールでは、AWS IoT Greengrass は 2 つのプライベートキーを使用します。1 つのキーは、Greengrass Core と AWS IoT Core の接続時の Transport Layer Security (TLS) ハンドシェイク中に、AWS IoT クライアント (IoT client) コンポーネントが使用します。(このキーは Core プライベートキーとも呼ばれます)。もう 1 つのキーは、Greengrass デバイスと Greengrass Core との通信を可能にするために、ローカル MQTT サーバーが使用します。両方のコンポーネントにハードウェアセキュリティを使用する場合は、共有のプライベートキーを使用しても、個別のプライベートキーを使用してもかまいません。詳細については、「AWS IoT Greengrass ハードウェアセキュリティに関するプロビジョニング慣行」を参照してください。

注記

標準インストールでは、ローカルシームレットマネージャは暗号化目的で IoT クライアントキーも使用しますが、独自のプライベートキーを使用することもできます。この場合、最小長 の 2048 ビットの RSA キーを使用する必要があります。詳細については、「シークレット暗号化用のプライベートキーを指定する」を参照してください。

要件

Greengrass Core のハードウェアセキュリティを設定する前に、以下のものが必要です。

  • IoT クライアント、ローカル MQTT サーバー、およびローカルサービスマネージャコンポーネント用のターゲットプライベートキー設定をサポートするハードウェアセキュリティモジュール (HSM)。この設定には、コンポーネントでキーを共有するかどうかの設定に応じて、1 つ、2 つ、あるいは3 つのハードウェアベースのプライベートキーを含めることができます。プライベートキーのサポートの詳細については、「AWS IoT Greengrass Core セキュリティプリンシパル」を参照してください。

    • RSA キーでは: RSA-2048 キーサイズ (またはそれ以上) および PKCS#1 v1.5 署名スキーム。

    • EC キーでは: NIST P-256 または NIST P-384 curve。

    注記

    AWS Partner Device Catalog で、この機能に適合するデバイスを検索します。

  • 実行時に (libdl を使用して) ロード可能であり、PKCS#11 関数を提供する PKCS#11 プロバイダーライブラリ。

  • ハードウェアモジュールは、「PKCS#11 仕様」で定義されているスロットラベルで解決できる必要があります。

  • ベンダー提供のプロビジョニングツールを使用して、プライベートキーを生成して HSM にロードする必要があります。

  • プライベートキーはオブジェクトラベルで解決できる必要があります。

  • Core デバイス証明書。これは、プライベートキーに対応する IoT クライアント証明書です。

  • Greengrass OTA Update Agent を使用している場合は、OpenSSL libp11 PKCS#11 ラッパーライブラリをインストールする必要があります。詳細については、「無線通信経由更新のサポートを設定する」を参照してください。

また、以下の条件が満たされていることを確認してください。

  • プライベートキーに関連付けられている IoT クライアント証明書は AWS IoT に登録され、有効化されています。これは AWS IoT コンソールの [Manage] (管理) から[All devices] (すべてのデバイス)、[Things] (モノ) の順に選択し、コアのモノの [Certificate] (証明書) タブで確認できます。

  • AWS IoT Greengrass Core ソフトウェア v1.7 以降は、入門チュートリアルのモジュール 2 で説明しているように、コアデバイスにインストールされています。バージョン 1.9 以降は、MQTT サーバー用に EC キーを使用するために必要です。

  • 証明書は Greengrass Core にアタッチされています。AWS IoT コンソールのコアのモノの [Manage] (管理) ページからこれを検証できます。

注記

現在、AWS IoT Greengrass は CA 証明書または IoT クライアント証明書の HSM からの直接ロードをサポートしていません。証明書は、ファイルシステムの Greengrass で読み取り可能な場所に、プレーンテキストファイルとしてロードする必要があります。

AWS IoT Greengrass Core のハードウェアセキュリティ設定

ハードウェアセキュリティは、Greengrass 設定ファイルで設定します。これは、/greengrass-root/config ディレクトリにある config.json ファイルです。

注記

純粋なソフトウェア実装を使用して HSM 設定をセットアップするプロセスについては、「モジュール 7: ハードウェアセキュリティ統合のシミュレーション」を参照してください。

重要

この例のシミュレートされた設定では、セキュリティ上の利点は得られません。例の目的は、ハードウェアベースの HSM を今後使用する場合に備えて、PKCS#11 の仕様について学習し、ソフトウェアの初期テストを行うことです。

AWS IoT Greengrass でハードウェアセキュリティを設定するには、config.jsoncrypto オブジェクトを編集します。

ハードウェアセキュリティを使用する場合は、以下の例に示すように、crypto オブジェクトを使用して、Core 上の PKCS#11 プロバイダーライブラリの証明書、プライベートキー、アセットへのパスを指定します。

"crypto": { "PKCS11" : { "OpenSSLEngine" : "/path-to-p11-openssl-engine", "P11Provider" : "/path-to-pkcs11-provider-so", "slotLabel" : "crypto-token-name", "slotUserPin" : "crypto-token-user-pin" }, "principals" : { "IoTCertificate" : { "privateKeyPath" : "pkcs11:object=core-private-key-label;type=private", "certificatePath" : "file:///path-to-core-device-certificate" }, "MQTTServerCertificate" : { "privateKeyPath" : "pkcs11:object=server-private-key-label;type=private" }, "SecretsManager" : { "privateKeyPath": "pkcs11:object=core-private-key-label;type=private" } }, "caPath" : "file:///path-to-root-ca"

crypto オブジェクトには、以下のプロパティが含まれています。

フィールド 説明 メモ
caPath

AWS IoT ルート CA への絶対パス。

次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

注記
PKCS11
OpenSSLEngine

オプション。OpenSSL での PKCS#11 のサポートを有効にするための、OpenSSL エンジン .so ファイルへの絶対パス。

ファイルシステム上のファイルへのパスあることが必要です。

ハードウェアセキュリティで Greengrass OTA Update Agent を使用している場合、このプロパティは必須です。詳細については、「無線通信経由更新のサポートを設定する」を参照してください。

P11Provider

PKCS#11 実装の libdl-loadable ライブラリへの絶対パス。

ファイルシステム上のファイルへのパスあることが必要です。

slotLabel

ハードウェアモジュールを識別するために使用されるスロットラベル。

PKCS#11 ラベル仕様に準拠していることが必要です。

slotUserPin

Greengrass Core をモジュールに対して認証するために使用されるユーザー PIN。

設定されたプライベートキーで C_Sign を実行するのに十分なアクセス許可があることが必要です。

principals
IoTCertificate The certificate and private key that the core uses to make requests to AWS IoT.
IoTCertificate  .privateKeyPath

Core プライベートキーへのパス。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。

IoTCertificate  .certificatePath

コアデバイスの証明書への絶対パス。

次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

MQTTServerCertificate

オプション。Core が MQTT サーバーまたはゲートウェイとして機能するために証明書と組み合わせて使用するプライベートキー。

MQTTServerCertificate  .privateKeyPath

ローカル MQTT サーバーのプライベートキーへのパス。

この値を使用して、ローカル MQTT サーバーの独自のプライベートキーを指定します。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。

このプロパティを省略すると、AWS IoT Greengrass は更新設定に基づいてキーを更新します。指定した場合は、お客様がキーを更新する必要があります。

SecretsManager The private key that secures the data key used for encryption. For more information, see AWS IoT Greengrass Core にシークレットをデプロイする.
SecretsManager  .privateKeyPath

ローカル Secrets Manager のプライベートキーへのパス。

RSA キーのみがサポートされています。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。PKCS#1 v1.5 パディング方式を使用してプライベートキーを生成する必要があります。

フィールド 説明 メモ
caPath

AWS IoT ルート CA への絶対パス。

次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

注記
PKCS11
OpenSSLEngine

オプション。OpenSSL での PKCS#11 のサポートを有効にするための、OpenSSL エンジン .so ファイルへの絶対パス。

ファイルシステム上のファイルへのパスあることが必要です。

ハードウェアセキュリティで Greengrass OTA Update Agent を使用している場合、このプロパティは必須です。詳細については、「無線通信経由更新のサポートを設定する」を参照してください。

P11Provider

PKCS#11 実装の libdl-loadable ライブラリへの絶対パス。

ファイルシステム上のファイルへのパスあることが必要です。

slotLabel

ハードウェアモジュールを識別するために使用されるスロットラベル。

PKCS#11 ラベル仕様に準拠していることが必要です。

slotUserPin

Greengrass Core をモジュールに対して認証するために使用されるユーザー PIN。

設定されたプライベートキーで C_Sign を実行するのに十分なアクセス許可があることが必要です。

principals
IoTCertificate The certificate and private key that the core uses to make requests to AWS IoT.
IoTCertificate  .privateKeyPath

Core プライベートキーへのパス。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。

IoTCertificate  .certificatePath

コアデバイスの証明書への絶対パス。

次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

MQTTServerCertificate

オプション。Core が MQTT サーバーまたはゲートウェイとして機能するために証明書と組み合わせて使用するプライベートキー。

MQTTServerCertificate  .privateKeyPath

ローカル MQTT サーバーのプライベートキーへのパス。

この値を使用して、ローカル MQTT サーバーの独自のプライベートキーを指定します。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。

このプロパティを省略すると、AWS IoT Greengrass は更新設定に基づいてキーを更新します。指定した場合は、お客様がキーを更新する必要があります。

SecretsManager The private key that secures the data key used for encryption. For more information, see AWS IoT Greengrass Core にシークレットをデプロイする.
SecretsManager  .privateKeyPath

ローカル Secrets Manager のプライベートキーへのパス。

RSA キーのみがサポートされています。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。PKCS#1 v1.5 パディング方式を使用してプライベートキーを生成する必要があります。

フィールド 説明 メモ
caPath

AWS IoT ルート CA への絶対パス。

次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

注記
PKCS11
OpenSSLEngine

オプション。OpenSSL での PKCS#11 のサポートを有効にするための、OpenSSL エンジン .so ファイルへの絶対パス。

ファイルシステム上のファイルへのパスあることが必要です。

ハードウェアセキュリティで Greengrass OTA Update Agent を使用している場合、このプロパティは必須です。詳細については、「無線通信経由更新のサポートを設定する」を参照してください。

P11Provider

PKCS#11 実装の libdl-loadable ライブラリへの絶対パス。

ファイルシステム上のファイルへのパスあることが必要です。

slotLabel

ハードウェアモジュールを識別するために使用されるスロットラベル。

PKCS#11 ラベル仕様に準拠していることが必要です。

slotUserPin

Greengrass Core をモジュールに対して認証するために使用されるユーザー PIN。

設定されたプライベートキーで C_Sign を実行するのに十分なアクセス許可があることが必要です。

principals
IoTCertificate The certificate and private key that the core uses to make requests to AWS IoT.
IoTCertificate  .privateKeyPath

Core プライベートキーへのパス。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。

IoTCertificate  .certificatePath

コアデバイスの証明書への絶対パス。

次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

MQTTServerCertificate

オプション。Core が MQTT サーバーまたはゲートウェイとして機能するために証明書と組み合わせて使用するプライベートキー。

MQTTServerCertificate  .privateKeyPath

ローカル MQTT サーバーのプライベートキーへのパス。

この値を使用して、ローカル MQTT サーバーの独自のプライベートキーを指定します。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。

このプロパティを省略すると、AWS IoT Greengrass は更新設定に基づいてキーを更新します。指定した場合は、お客様がキーを更新する必要があります。

SecretsManager The private key that secures the data key used for encryption. For more information, see AWS IoT Greengrass Core にシークレットをデプロイする.
SecretsManager  .privateKeyPath

ローカル Secrets Manager のプライベートキーへのパス。

RSA キーのみがサポートされています。

ファイルシステムストレージの場合、次の形式のファイルの URI である必要があります。file:///absolute/path/to/file

HSM ストレージの場合、オブジェクトラベルを指定する RFC 7512 PKCS#11 パスである必要があります。PKCS#1 v1.5 パディング方式を使用してプライベートキーを生成する必要があります。

AWS IoT Greengrass ハードウェアセキュリティに関するプロビジョニング慣行

以下に示しているのは、セキュリティおよびパフォーマンス関連のプロビジョニング慣行です。

セキュリティ

  • 内部ハードウェア乱数ジェネレーターを使用して、HSM に直接プライベートキーを生成します。

    注記

    この機能を使用するように (ハードウェアベンダーから提供されている手順に従って) プライベートキーを設定する場合、AWS IoT Greengrass が現在サポートしているのは、ローカルシークレットの暗号化と復号化用の PKCS1 v1.5 パディングメカニズムのみであることに注意してください。AWS IoT Greengrass は、OAEP (Optimal Asymmetric Encryption Padding) をサポートしていません。

  • エクスポートを禁止するようにプライベートキーを設定します。

  • ハードウェアベンダーが提供するプロビジョニングツールを使用して、ハードウェアで保護されたプライベートキーにより証明書署名リクエスト (CSR) を生成します。次に、AWS IoT コンソールを使用してクライアント証明書を生成します。

注記

HSM でプライベートキーが生成されている場合、キーの更新は適用されません。

パフォーマンス

以下の図では、AWS IoT Greengrass コア上の IoT クライアントコンポーネントとローカル MQTT サーバーを示しています。両方のコンポーネントに HSM 設定を使用する場合は、同じプライベートキーを使用しても、個別のプライベートキーを使用してもかまいません。別のキーを使用する場合は、同じスロットに保存されている必要があります。

注記

AWS IoT Greengrass では HSM に保存するキー数に一切の制限を設けていないため、IoT クライアント、MQTT サーバー、およびシークレットマネージャコンポーネント用のプライベートキーを保存することができます。ただし、一部の HSM のベンダーでは 1 つのスロットに保存できるキーの数に制限を設けていることがあります。

IoT client and MQTT server interacting with AWS IoT Greengrass Core and AWS IoT Core.

一般に、IoT クライアントキーは頻繁には使用されません。これは、AWS IoT Greengrass Core ソフトウェアがクラウドへの長時間の接続を維持するためです。ただし、MQTT サーバーキーは、Greengrass デバイスが Core に接続するたびに使用されます。これらのやり取りはパフォーマンスに直接影響します。

MQTT サーバーキーが HSM に保存されていると、デバイスが接続できる速度は、HSM が実行できる 1 秒あたりの RSA 署名オペレーションの数によって決まります。例えば、HSM が RSA-2048 プライベートキーで RSASSA-PKCS1-v1.5 署名を実行するのに 300 ミリ秒かかる場合、1 秒あたり 3 台のデバイスしか Greengrass Core に接続できません。接続後、HSM は使用されなくなり、標準の AWS IoT Greengrass のクォータが適用されます。

パフォーマンスのボトルネックを軽減するために、MQTT サーバーのプライベートキーを HSM ではなくファイルシステムに保存できます。この設定では、MQTT サーバーは、ハードウェアセキュリティが有効でないかのように動作します。

AWS IoT Greengrass では IoT クライアントおよび MQTT サーバーコンポーネント用に複数のキーストレージ設定がサポートされているため、セキュリティおよびパフォーマンスの要件を最適化することができます。次の表では設定例を示しています。

構成 IoT キー MQTT キー パフォーマンス
HSM 共有キー HSM: キー A HSM: キー A HSM または CPU によって制限
HSM 分離キー HSM: キー A HSM: キー B HSM または CPU によって制限
IoT 専用 HSM HSM: キー A ファイルシステム: キー B CPU によって制限
レガシー ファイルシステム: キー A ファイルシステム: キー B CPU によって制限

MQTT サーバーでファイルシステムベースのキーを使用するように Greengrass Core を設定するには、config.jsonprincipals.MQTTServerCertificate セクションを省略します (または、AWS IoT Greengrass で生成されたデフォルトキーを使用していない場合は、キーへのファイルベースのパスを指定します)。生成される crypto オブジェクトは以下のようになります。

"crypto": { "PKCS11": { "OpenSSLEngine": "...", "P11Provider": "...", "slotLabel": "...", "slotUserPin": "..." }, "principals": { "IoTCertificate": { "privateKeyPath": "...", "certificatePath": "..." }, "SecretsManager": { "privateKeyPath": "..." } }, "caPath" : "..." }

ハードウェアセキュリティ統合用にサポートされている暗号スイート

AWS IoT Greengrass では、コアがハードウェアセキュリティ用に設定されている場合に一連の暗号化スイートをサポートしています。これは、Core がファイルベースのセキュリティを使用するように設定されている場合にサポートされる暗号スイートのサブセットです。詳細については、「TLS 暗号スイートのサポート」を参照してください。

注記

ローカルネットワークを介して Greengrass デバイスから Greengrass コアに接続する場合、TLS 接続を行うためにサポートされた暗号化スイートのいずれかを使用していることを確認してください。

無線通信経由更新のサポートを設定する

ハードウェアセキュリティを使用する場合、AWS IoT Greengrass Core ソフトウェアの無線通信経由 (OTA) 更新を有効にするには、OpenSC libp11 PKCS#11 ラッパーライブラリをインストールし、Greengrass 設定ファイルを編集する必要があります。OTA 更新の詳細については、「AWS IoT Greengrass Core ソフトウェアの OTA 更新」を参照してください。

  1. Greengrass デーモンを停止します。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd stop
    注記

    greengrass-root は、デバイスで AWS IoT Greengrass Core ソフトウェアがインストールされているパスを表します。通常、これは /greengrass ディレクトリです。

  2. OpenSSL エンジンをインストールします。OpenSSL 1.0 または 1.1 がサポートされています。

    sudo apt-get install libengine-pkcs11-openssl
  3. システム上の OpenSSL エンジン (libpkcs11.so) へのパスを見つけます。

    1. インストールされているライブラリのパッケージのリストを取得します。

      sudo dpkg -L libengine-pkcs11-openssl

      libpkcs11.so ファイルは engines ディレクトリにあります。

    2. このファイルへの完全パス (/usr/lib/ssl/engines/libpkcs11.so など) をコピーします。

  4. Greengrass 設定ファイルを開きます。これは、/greengrass-root/config ディレクトリにある config.json ファイルです。

  5. OpenSSLEngine プロパティには、libpkcs11.so ファイルへのパスを入力します。

    { "crypto": { "caPath" : "file:///path-to-root-ca", "PKCS11" : { "OpenSSLEngine" : "/path-to-p11-openssl-engine", "P11Provider" : "/path-to-pkcs11-provider-so", "slotLabel" : "crypto-token-name", "slotUserPin" : "crypto-token-user-pin" }, ... } ... }
    注記

    OpenSSLEngine プロパティが PKCS11 オブジェクトに存在しない場合は、追加します。

  6. Greengrass デーモンを開始します。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd start

以前のバージョンの AWS IoT Greengrass Core ソフトウェアとの下位互換性

ハードウェアセキュリティをサポートしている AWS IoT Greengrass Core ソフトウェアは、v1.6 以前のバージョンで生成された config.json ファイルと完全に下位互換性があります。crypto オブジェクトが config.json 設定ファイルに存在しない場合、AWS IoT Greengrass はファイルベースの coreThing.certPathcoreThing.keyPath、および coreThing.caPath プロパティを使用します。この下位互換性は、config.json で指定されたファイルベースの設定を上書きしない Greengrass OTA 更新に適用されます。

PKCS#11 をサポートしないハードウェア

PKCS#11 ライブラリは通常、ハードウェアベンダーによって提供されるか、オープンソースです。例えば、標準準拠のハードウェア (TPM1.2 など) では、既存のオープンソースソフトウェアを使用できます。ただし、ハードウェアに対応する PKCS#11 ライブラリ実装がない場合、またはカスタム PKCS#11 プロバイダーを作成する場合、統合については AWS エンタープライズサポート担当者までお問い合わせください。

以下も参照してください。