AWS IoT Greengrass のデバイス認証と認可 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 は機能更新を受信しなくなり、2023 年 6 月 30 日までセキュリティパッチとバグ修正のみ受信します。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。重要な新機能新たなプラットフォームのサポートが追加された AWS IoT Greengrass Version 2 への移行を強くお勧めします。

AWS IoT Greengrass のデバイス認証と認可

AWS IoT Greengrass 環境にあるデバイスは、認証に X.509 証明書を使用し、認可に AWS IoT ポリシーを使用します。証明書とポリシーにより、デバイスは、AWS IoT Core と AWS IoT Greengrass に安全に接続できます。

X.509 証明書は、X.509 パブリックキーインフラストラクチャ規格を使用して、パブリックキーと証明書内の ID を関連付けるための、デジタル証明書です。X.509 証明書は、証明機関(CA)と呼ばれる信頼された団体によって発行されます。CA は、CA 証明書と呼ばれる 1 つ以上の特別な証明書を管理しており、この証明書は X.509 証明書を発行するために使用されます。証明機関にのみ CA 証明書に対するアクセス権限があります。

AWS IoT ポリシーは、AWS IoT デバイスに対して許可される一連のオペレーションを定義します。具体的には、MQTT メッセージの公開やデバイスシャドウの取得など、AWS IoT Core および AWS IoT Greengrass データプレーンオペレーションに対するアクセスを許可するか拒否します。

すべてのデバイスには、AWS IoT Core レジストリのエントリと、AWS IoT ポリシーがアタッチされたアクティブ化された X.509 証明書が必要です。デバイスは、次の 2 つのカテゴリに分類されます。

  • Greengrass コア。Greengrass コアデバイスは、証明書と AWS IoT ポリシーを使用して AWS IoT Core に安全に接続します。また、証明書とポリシーを使用して、AWS IoT Greengrass は Core デバイスに設定情報、Lambda 関数、コネクタ、マネージド型サブスクリプションをデプロイできます。

  • クライアントデバイス。クライアントデバイス (接続されたデバイス、Greengrass デバイス、またはデバイスとも呼ばれる) は、MQTT を介して Greengrass コアに接続するデバイスのことです。証明書とポリシーを使用して AWS IoT Core と AWS IoT Greengrass サービスに接続します。これにより、クライアントデバイスは AWS IoT Greengrass Discovery Service を使用して、コアデバイスを見つけ接続できます。クライアントデバイスは、同じ証明書を使用して AWS IoT Core デバイスゲートウェイとコアデバイスに接続します。また、クライアントデバイスは、コアデバイスとの相互認証に検出情報を使用します。詳細については、「デバイス接続のワークフロー」および「Greengrass コアを使用したデバイス認証の管理」を参照してください。

X.509 証明書

コアとクライアントデバイス間の通信、およびデバイスと AWS IoT Core または AWS IoT Greengrass 間の通信には認証が必要です。この相互認証は、登録された X.509 デバイス証明書と暗号化キーに基づいています。

AWS IoT Greengrass 環境では、デバイスは、次の Transport Layer Security (TLS) 接続に対して、パブリックキーとプライベートキーを持つ証明書を使用します。

  • インターネット上で AWS IoT Core および AWS IoT Greengrass に接続する Greengrass コアの AWS IoT クライアントコンポーネント。

  • インターネット上でコア検出情報を取得するために、AWS IoT Greengrass に接続するクライアントデバイス。

  • ローカルネットワークを介してグループ内のクライアントデバイスに接続する Greengrass コアにある MQTT サーバーコンポーネント。

AWS IoT Greengrass Core デバイスでは、証明書が 2 つの場所に保存されます。

  • /greengrass-root/certs のコアデバイス証明書。通常、コアデバイス証明書の名前は hash.cert.pem です (例えば、86c84488a5.cert.pem)。この証明書は、コアが AWS IoT Core および AWS IoT Greengrass サービスに接続するとき、相互認証のために AWS IoT クライアントによって使用されます。

  • /greengrass-root/ggc/var/state/server の MQTT サーバー証明書。MQTT サーバー証明書の名前は server.crt です。この証明書は、ローカル MQTT サーバー (Greengrass コア上) と Greengrass デバイスとの間で相互認証に使用されます。

    注記

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

詳細については、「AWS IoT Greengrass Core セキュリティプリンシパル」を参照してください。

認証機関 (CA) 証明書

コアデバイスおよびクライアントデバイスは、AWS IoT Core および AWS IoT Greengrass サービスとの認証に使用されるルート CA 証明書をダウンロードします。Amazon ルート CA 1 など、Amazon Trust Services (ATS) のルート CA 証明書を使用することをお勧めします。詳細については、「AWS IoT Core デベロッパーガイド」の「サーバー認証用の CA 証明書」を参照してください。

注記

ルート CA 証明書タイプはエンドポイントと一致する必要があります。ATS ルート CA 証明書を ATS エンドポイントで使用するか (推奨)、VeriSign ルート CA 証明書をレガシーエンドポイントで使用します。レガシーエンドポイントがサポートされるのは、アマゾン ウェブ サービスの一部のリージョンに限られます。詳細については、「サービスエンドポイントはルート CA 証明書タイプと一致する必要があります。」を参照してください。

また、クライアントデバイスでは、Greengrass グループ CA 証明書もダウンロードされます。これは、相互認証中に Greengrass コアにある MQTT サーバー証明書を検証するために使用されます。詳細については、「デバイス接続のワークフロー」を参照してください。MQTT サーバー証明書のデフォルトの有効期限は 7 日間です。

ローカル MQTT サーバーの証明書ローテーション

クライアントデバイスは、ローカルの MQTT サーバー証明書を使用して、Greengrass コアデバイスとの相互認証を行います。デフォルトでは、この証明書の有効期間は 7 日です。この制限期間は、セキュリティのベストプラクティスに基づいています。MQTT サーバー証明書は、クラウド内に保存されているグループ CA 証明書によって署名されます。

証明書のローテーションを実行するには、Greengrass Core デバイスがオンラインになっていて、AWS IoT Greengrass サービスに定期的に直接アクセスできる必要があります。証明書の有効期限が切れると、Core デバイスは AWS IoT Greengrass サービスに接続し、新しい証明書の取得を試みます。接続に成功すると、コアデバイスは新しい MQTT サーバー証明書をダウンロードし、ローカル MQTT サービスを再起動します。この時点で、コアに接続されたすべてのクライアントデバイスは切断されます。有効期限が切れた時点で Core デバイスがオフラインになっていると、代替証明書は送信されません。コアデバイスに接続しようとする新しい試みはすべて拒否されます。既存の接続は影響を受けません。AWS IoT Greengrass サービスへの接続が復元され、新しい MQTT サーバー証明書がダウンロードされるまで、クライアントデバイスはコアに接続できません。

必要に応じて、有効期限は、7 ~ 30 日間の任意の値に設定できます。より頻繁にローテーションを行うには、より頻繁なクラウド接続が必要になります。頻繁にローテーションを行わないと、セキュリティ上の問題が発生する可能性があります。証明書の有効期限を 30 日を超える値に設定する場合は、AWS Support にお問い合わせください。

AWS IoT コンソールでは、グループの [Settings] (設定) ページで証明書を管理できます。AWS IoT Greengrass API では、UpdateGroupCertificateConfiguration アクションを使用できます。

MQTT サーバー証明書の有効期限が切れた場合、証明書の検証はすべて失敗します。クライアントデバイスは失敗を検出し、接続を終了できる必要があります。

データプレーンオペレーションの AWS IoT ポリシー

AWS IoT ポリシーを使用して、AWS IoT Core および AWS IoT Greengrass データプレーンへのアクセスを許可します。AWS IoT Core データプレーンは、デバイス、ユーザー、およびアプリケーションのオペレーション (AWS IoT Core への接続やトピックへのサブスクライブなど) で構成されます。AWS IoT Greengrass データプレーンは、デプロイの取得や接続情報の更新など、Greengrass デバイスのオペレーションで構成されます。

AWS IoT ポリシーは、IAM ポリシーに似た JSON ドキュメントです。これには、次のプロパティを指定する 1 つ以上のポリシーステートメントが含まれます。

  • Effect。アクセスモードを指定するプロパティで、AllowDeny のどちらかになります。

  • Action。ポリシーによって許可または拒否されるアクションのリストです。

  • Resource。アクションが許可または拒否されるリソースのリストです。

AWS IoT ポリシーでは * をワイルドカード文字としてサポートし、MQTT ワイルドカード文字 (+ および #) をリテラル文字列として処理します。「*」ワイルドカードの詳細については、「AWS Identity and Access Management ユーザーガイド」の「リソース ARN でのワイルドカードの使用」を参照してください。

詳細については、「AWS IoT Core デベロッパーガイド」の「AWS IoT ポリシー」と「AWS IoT ポリシーアクション」を参照してください。

注記

AWS IoT Core では AWS IoT ポリシーをモノのグループにアタッチして、デバイスのグループの権限を定義することができます。モノのグループポリシーでは、AWS IoT Greengrass データプレーンオペレーションへのアクセスは許可されていません。モノが AWS IoT Greengrass のデータプレーンオペレーションにアクセスするには、モノの証明書にアタッチする AWS IoT ポリシーにアクセス許可を追加する必要があります。

AWS IoT Greengrass ポリシーアクション

Greengrass コアアクション

AWS IoT Greengrass は、Greengrass コアデバイスが AWS IoT ポリシーで使用できる以下のポリシーアクションを定義します。

greengrass:AssumeRoleForGroup

Greengrass Core デバイスが、Token Exchange Service (TES) システム Lambda 関数を使用して認証情報を取得するためのアクセス許可。取得した認証情報に関連付けられているアクセス許可は、設定されたグループロールにアタッチされたポリシーに基づきます。

このアクセス許可は、Greengrass コアデバイスが認証情報を取得しようとしたときにチェックされます (認証情報がローカルにキャッシュされていないと仮定します)。

greengrass:CreateCertificate

Greengrass コアデバイスが独自のサーバー証明書を作成するためのアクセス許可。

このアクセス許可は、Greengrass コアデバイスが証明書を作成するときにチェックされます。Greengrass コアデバイスは、初回実行時、コアの接続情報が変更されたとき、および指定されたローテーション期間にサーバー証明書を作成しようとします。

greengrass:GetConnectivityInfo

Greengrass コアデバイスが、独自の接続情報を取得するためのアクセス許可。

このアクセス許可は、Greengrass コアデバイスが AWS IoT Core から接続情報を取得しようとしたときにチェックされます。

greengrass:GetDeployment

Greengrass コアデバイスがデプロイを取得するためのアクセス許可。

このアクセス許可は、Greengrass コアデバイスがクラウドからデプロイとデプロイステータスを取得しようとしたときにチェックされます。

greengrass:GetDeploymentArtifacts

グループ情報や Lambda 関数などのデプロイアーティファクトを取得するための Greengrass Core デバイスのアクセス許可。

このアクセス許可は、Greengrass コアデバイスがデプロイを受け取り、デプロイアーティファクトを取得しようとしたときにチェックされます。

greengrass:UpdateConnectivityInfo

Greengrass コアデバイスが IP またはホスト名情報を使用して自身の接続情報を更新するためのアクセス許可。

このアクセス許可は、Greengrass コアデバイスがクラウド内の接続情報を更新しようとしたときにチェックされます。

greengrass:UpdateCoreDeploymentStatus

Greengrass コアデバイスがデプロイの状態を更新するためのアクセス許可。

このアクセス許可は、Greengrass コアデバイスがデプロイを受け取り、デプロイメントステータスを更新しようとしたときにチェックされます。

 

Greengrass デバイスのアクション

AWS IoT Greengrass は、クライアントデバイスが AWS IoT ポリシーで使用できる次のポリシーアクションを定義します。

greengrass:Discover

クライアントデバイスが Discovery API を使用してグループのコア接続情報とグループ認証機関を取得するためのアクセス許可。

このアクセス許可は、クライアントデバイスが TLS 相互認証を使用して Discovery API を呼び出すときにチェックされます。

AWS IoT Greengrass コアデバイスの最小限の AWS IoT ポリシー

次のポリシーの例には、コアデバイスの基本的な Greengrass 機能をサポートするのに必要な最小限のアクションが含まれています。

  • ポリシーには、シャドウステータスに使用されるトピックを含む、コアデバイスがメッセージを発行、サブスクライブし、メッセージを受信できる、MQTT トピックとトピックのフィルターが一覧表示されます。Greengrass グループの AWS IoT Core、Lambda 関数、コネクタ、クライアントデバイス間のメッセージ交換をサポートするには、許可するトピックとトピックのフィルターを指定します。詳細については、「AWS IoT Core デベロッパーガイド」の「パブリッシュ/サブスクライブポリシーの例」を参照してください。

  • このポリシーには、AWS IoT Core でコアデバイスのシャドウを取得、更新、削除することを可能にするセクションが含まれます。Greengrass グループ内のクライアントデバイスのシャドウ同期を可能にするには、Resource リスト内のターゲット Amazon リソースネーム (ARN) を指定します (例: arn:aws:iot:region:account-id:thing/device-name)。

  • コアデバイスの AWS IoT ポリシーではモノのポリシー変数 (iot:Connection.Thing.*) の使用はサポートされていません。コアは同じデバイス証明書を使用して AWS IoT Core への複数の接続を行いますが、接続のクライアント ID がコアのモノ名と完全に一致しない可能性があります。

  • greengrass:UpdateCoreDeploymentStatus アクセス許可の場合、Resource ARN の最終セグメントは、コアデバイスの URL エンコード ARN です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:region:account-id:client/core-name-*" ] }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive" ], "Resource": [ "arn:aws:iot:region:account-id:topic/$aws/things/core-name-*" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:region:account-id:topicfilter/$aws/things/core-name-*" ] }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": [ "arn:aws:iot:region:account-id:thing/core-name-*" ] }, { "Effect": "Allow", "Action": [ "greengrass:AssumeRoleForGroup", "greengrass:CreateCertificate" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetDeployment" ], "Resource": [ "arn:aws:greengrass:region:account-id:/greengrass/groups/group-id/deployments/*" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetDeploymentArtifacts" ], "Resource": [ "arn:aws:greengrass:region:account-id:/greengrass/groups/group-id/deployments/*" ] }, { "Effect": "Allow", "Action": [ "greengrass:UpdateCoreDeploymentStatus" ], "Resource": [ "arn:aws:greengrass:region:account-id:/greengrass/groups/group-id/deployments/*/cores/arn%3Aaws%3Aiot%3Aregion%3Aaccount-id%3Athing%2Fcore-name" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetConnectivityInfo", "greengrass:UpdateConnectivityInfo" ], "Resource": [ "arn:aws:iot:region:account-id:thing/core-name-*" ] } ] }
注記

クライアントデバイスの AWS IoT ポリシーでは通常、iot:Connectiot:Publishiot:Receive、および iot:Subscribe アクションに対して同様のアクセス許可が必要になります。

クライアントデバイスが属する Greengrass グループで、コアの接続情報を自動的に検出できるようにするには、クライアントデバイスの AWS IoT ポリシーに greengrass:Discover アクションを含める必要があります。Resource セクションには、Greengrass コアデバイスの ARN ではなく、クライアントデバイスの ARN を指定します。例:

{ "Effect": "Allow", "Action": [ "greengrass:Discover" ], "Resource": [ "arn:aws:iot:region:account-id:thing/device-name" ] }

クライアントデバイスの AWS IoT ポリシーでは通常、iot:GetThingShadowiot:UpdateThingShadow、または iot:DeleteThingShadow アクションに対するアクセス許可は必要ありません。これは、クラインとデバイスのシャドウ同期操作が Greengrass コアで処理されるためです。この場合、コアの AWS IoT ポリシーで、シャドウアクションの Resource セクションに、クライアントデバイスの ARN が含まれていることを確認してください。

 

AWS IoT コンソールでは、コアの証明書にアタッチされたポリシーを表示および編集できます。

  1. ナビゲーションペインの[Manage] (管理)で、[All devices] (すべてのデバイス) を展開してから、[Things] (モノ) を選択します。

  2. コアを選択します。

  3. コアの設定ページで、[Certificates] (証明書) タブを選択します。

  4. [Certificates] (証明書) タブで、証明書を選択します。

  5. 証明書の設定ページで、[ポリシー] を選択し、ポリシーを選択します。

    ポリシーを編集するには、[Edit active version] (アクティブなバージョンの編集) を選択します。

  6. ポリシーを確認し、必要に応じてアクセス許可を追加、削除、または編集します。

  7. 新しいポリシーバージョンをアクティブなバージョンとして設定するには、[Policy version status] (ポリシーバージョンのステータス) で、[Set the edited version as the active version for this policy] (編集したバージョンをこのポリシーのアクティブバージョンとして設定) を選択します。

  8. [Save as new version] (新しいバージョンとして保存) を選択します。