AWS IoT Greengrass Core にシークレットをデプロイする - 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 にシークレットをデプロイする

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

AWS IoT Greengrass では、パスワードやトークンなどのシークレットをハードコーディングすることなく、Greengrass デバイスからサービスやアプリケーションで認証できます。

AWS Secrets Manager は、シークレットをクラウドに安全に保存して管理するために使用するサービスです。AWS IoT Greengrass では Secrets Manager が Greengrass コアデバイスに拡張されます。これにより、コネクタと Lambda 関数でローカルシークレットを使用して、サービスやアプリケーションとのやり取りを行えます。たとえば、Twilio 通知コネクタは、ローカルに保存された認証トークンを使用します。

シークレットを Greengrass グループ内に統合するには、Secrets Manager シークレットを参照するグループリソースを作成します。このシークレットリソースは ARN に基づいてクラウドシークレットを参照します。シークレットリソースを作成、管理、および使用する方法については、「シークレットリソースを使用する」を参照してください。

AWS IoT Greengrass は転送中や保管時にシークレットを暗号化します。グループのデプロイ時に、AWS IoT Greengrass は Secrets Manager からシークレットを取り出し、暗号化されたローカルコピーを Greengrass コアに作成します。Secrets Manager でクラウドシークレットを更新した後、グループを再デプロイして、更新された値をコアに伝達します。

以下の図では、シークレットを Core にデプロイする大まかなプロセスを示しています。シークレットは転送中および保管時に暗号化されます。

AWS IoT Greengrass が AWS Secrets Manager からシークレットを取り出し、シークレットリソースとしてコアデバイスにデプロイすると、そのシークレットをコネクタと Lambda 関数から使用可能になる。

AWS IoT Greengrass を使用してシークレットをローカルに保存すると、以下の利点があります。

  • コードから分離 (ハードコードされない)。これにより、一元管理された認証情報がサポートされ、機密データを侵害のリスクから守ることができます。

  • オフラインシナリオで利用可能。コネクタと関数はインターネットから切断された状態でローカルサービスとソフトウェアに安全にアクセスできます。

  • シークレットへのアクセスをコントロール。グループの承認されたコネクタと関数のみがシークレットにアクセスできます。AWS IoT Greengrass はプライベートキー暗号を使用してシークレットを保護します。シークレットは転送中および保管時に暗号化されます。詳細については、「シークレットの暗号化」を参照してください。

  • 更新をコントロール。Secrets Manager でシークレットを更新した後、Greengrass グループを再デプロイして、シークレットのローカルコピーを更新します。詳細については、「シークレットの作成と管理」を参照してください。

    重要

    AWS IoT Greengrass では、クラウドバージョンの更新に伴ってローカルシークレットの値が自動的には更新されません。ローカル値を更新するには、グループを再デプロイする必要があります。

シークレットの暗号化

AWS IoT Greengrass は転送中と保管時のシークレットを暗号化します。

重要

ユーザー定義の Lambda 関数がシークレットを安全に処理することと、シークレットに格納されている機密データをログに記録しないことを確認してください。詳細については、「AWS Secrets Manager ユーザーガイド」の「Lambda 関数のログ記録とデバッグのリスクを軽減する」を参照してください。このドキュメントでは特に回転関数について言及していますが、こうした推奨事項は Greengrass Lambda 関数にも適用されます。

転送時の暗号化

AWS IoT Greengrass は、Transport Layer Security (TLS ) を使用して、インターネットとローカルネットワーク上のすべての通信を暗号化します。これにより、転送中のシークレットが保護されます。この保護は、シークレットが Secrets Manager から取得されてコアにデプロイされるときに行われます。サポートされている TLS 暗号スイートについては、「TLS 暗号スイートのサポート」を参照してください。

保管時の暗号化

AWS IoT Greengrass は、config.json で指定されているプライベートキーを使用して、Core に保存されているシークレットを暗号化します。このため、ローカルシークレットの保護には、プライベートキーの安全な保存が重要です。AWS 責任共有モデルでは、Core デバイスのプライベートキーの安全な保存を保証するのはお客様の責任です。

AWS IoT Greengrass は、プライベートキーストレージモードとして以下の 2 つをサポートしています。

  • ハードウェアセキュリティモジュールの使用。詳細については、「ハードウェアセキュリティ統合」を参照してください。

    注記

    現在、AWS IoT Greengrass はハードウェアベースのプライベートキーを使用する際にローカルシークレットを暗号化および復号する方法として、PKCS#1 v1.5 パディング方式のみサポートしています。ベンダーが提供する手順に従ってハードウェアベースのプライベートキーを手動で生成する場合は、必ず PKCS#1 v1.5 を選択してください。AWS IoT Greengrass は、OAEP (Optimal Asymmetric Encryption Padding) をサポートしていません。

  • ファイルシステムアクセス許可の使用 (デフォルト)。

プライベートキーは、ローカルシークレットの暗号化用のデータキーを保護するために使用されます。データキーは、グループデプロイごとに更新されます。

AWS IoT Greengrass コアは、プライベートキーにアクセスできる唯一のエンティティです。シークレットリソースに関連付けられている Greengrass コネクタまたは Lambda 関数はコアからシークレットを取得します。

要件

以下に示しているのは、ローカルシークレットをサポートするための要件です。

  • AWS IoT Greengrass Core v1.7 以降を使用している必要があります。

  • ローカルシークレットの値を取得するには、ユーザー定義の Lambda 関数で AWS IoT Greengrass Core SDK v1.3.0 以降を使用する必要があります。

  • ローカルシークレットの暗号化に使用されるプライベートキーは、Greengrass 設定ファイルで指定する必要があります。デフォルトでは、AWS IoT Greengrass はファイルシステムに保存されている Core プライベートキーを使用します。独自のプライベートキーを指定する場合は、「シークレット暗号化用のプライベートキーを指定する」を参照してください。RSA キータイプのみがサポートされています。

    注記

    現在、AWS IoT Greengrass はハードウェアベースのプライベートキーを使用する際にローカルシークレットを暗号化および復号する方法として、PKCS#1 v1.5 パディング方式のみサポートしています。ベンダーが提供する手順に従ってハードウェアベースのプライベートキーを手動で生成する場合は、必ず PKCS#1 v1.5 を選択してください。AWS IoT Greengrass は、OAEP (Optimal Asymmetric Encryption Padding) をサポートしていません。

  • AWS IoT Greengrass には、シークレットの値を取得するアクセス許可を付与する必要があります。これにより、グループデプロイ中に AWS IoT Greengrass が値を取得できるようになります。デフォルトの Greengrass サービスロールを使用している場合、AWS IoT Greengrass は「greengrass-」で始まる名前の付いたシークレットにすでにアクセスできます。アクセス権限をカスタマイズするには、「シークレットの値を取得することを AWS IoT Greengrass に許可する」を参照してください。

    注記

    アクセス許可をカスタマイズする場合でも、AWS IoT Greengrass がアクセスを許可されるシークレットを識別するために、この命名規則を使用することをお勧めします。コンソールでは、さまざまなアクセス許可を使用してシークレットが読み取られるため、AWS IoT Greengrass に取り出すアクセス許可のないシークレットを選択できます。命名規則を使用すると、デプロイエラーにつながるアクセス許可の競合を回避するのに役立ちます。

シークレット暗号化用のプライベートキーを指定する

この手順では、ローカルシークレット暗号化に使用されるプライベートキーのパスを提供します。ここでは、最少長の 2048 ビットの RSA キーを使用する必要があります。AWS IoT Greengrass コアで使用されるプライベートキーについての詳細は、「AWS IoT Greengrass Core セキュリティプリンシパル」を参照してください。

AWS IoT Greengrass では、ハードウェアベースあるいはファイルシステムベース (デフォルト) の 2 種類のプライベートキーがサポートされています。詳細については、「シークレットの暗号化」を参照してください。

ファイルシステムのコアプライベートキーを使用するデフォルト設定を変更する場合にのみ以下の手順を実行します。これらの手順は、開始方法チュートリアルのモジュール 2 で説明したようにグループと Core を作成したとします。

  1. /greengrass-root/config ディレクトリにある config.json ファイルを開きます。

    注記

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

  2. crypto.principals.SecretsManager オブジェクトの privateKeyPath プロパティで、プライベートキーのパスを入力します。

    • プライベートキーがファイルシステムに保存されている場合は、キーへの絶対パスを指定します。例:

      "SecretsManager" : { "privateKeyPath" : "file:///somepath/hash.private.key" }
    • プライベートキーがハードウェアセキュリティモジュール (HSM) に保存されている場合は、RFC 7512 PKCS#11 URI スキームを使用してパスを指定します。例:

      "SecretsManager" : { "privateKeyPath" : "pkcs11:object=private-key-label;type=private" }

      詳細については、「AWS IoT Greengrass Core のハードウェアセキュリティ設定」を参照してください。

      注記

      現在、AWS IoT Greengrass はハードウェアベースのプライベートキーを使用する際にローカルシークレットを暗号化および復号する方法として、PKCS#1 v1.5 パディング方式のみサポートしています。ベンダーが提供する手順に従ってハードウェアベースのプライベートキーを手動で生成する場合は、必ず PKCS#1 v1.5 を選択してください。AWS IoT Greengrass は、OAEP (Optimal Asymmetric Encryption Padding) をサポートしていません。

シークレットの値を取得することを AWS IoT Greengrass に許可する

この手順では、AWS IoT Greengrass にシークレットの値の取得を許可するインラインポリシーを、Greengrass サービスロールに追加します。

シークレットへのカスタムアクセス許可を AWS IoT Greengrass に付与する場合に限り、または Greengrass サービスロールに AWSGreengrassResourceAccessRolePolicy 管理ポリシーが含まれていない場合に限り、この手順に従いますAWSGreengrassResourceAccessRolePolicy は、greengrass- で始まる名前のシークレットへのアクセスを許可します。

  1. 以下の CLI コマンドを実行して、Greengrass サービスロールの ARN を取得します。

    aws greengrass get-service-role-for-account --region region

    返された ARN にはロール名が含まれています。

    { "AssociatedAt": "time-stamp", "RoleArn": "arn:aws:iam::account-id:role/service-role/role-name" }

    以下の手順で ARN または名前を使用します。

  2. secretsmanager:GetSecretValue アクションを許可するインラインポリシーを追加します。詳細については、「IAM ユーザーガイド」の「IAM ポリシーの追加と削除」を参照してください。

    シークレットを明示的に指定するかワイルドカード * 命名規則を使用することで、詳細なアクセスを許可できます。バージョニングまたはタグ付けされたシークレットへの条件付きアクセスを許可することもできます。たとえば、以下のポリシーでは、指定したシークレットのみの読み取りを AWS IoT Greengrass に許可しています。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region:account-id:secret:greengrass-SecretA-abc", "arn:aws:secretsmanager:region:account-id:secret:greengrass-SecretB-xyz" ] } ] }
    注記

    お客様が管理する AWS KMS キーを使用してシークレットを暗号化する場合は、Greengrass サービスロールで kms:Decrypt アクションも許可する必要があります。

Secrets Manager の IAM ポリシーの詳細については、「AWS Secrets Manager ユーザーガイド」の「AWS Secrets Manager の認証とアクセスコントロール」および「AWS Secrets Manager の IAM ポリシーまたはシークレットポリシーで使用できるアクション、リソース、コンテキストキー」を参照してください。

関連情報