への直接呼び出しの許可 AWS を使用する サービス AWS IoT Core 認証情報プロバイダー - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

への直接呼び出しの許可 AWS を使用する サービス AWS IoT Core 認証情報プロバイダー

デバイスは X.509 証明書を使用して に接続できます AWS IoT Core TLS 相互認証プロトコルを使用する。その他 AWS サービスは証明書ベースの認証をサポートしていませんが、 を使用して呼び出すことができます。 AWS の 認証情報 AWS 署名バージョン 4 の形式署名バージョン 4 アルゴリズムは通常、発信者がアクセスキー ID およびシークレットアクセスキーを所持していることを要求します。 AWS IoT Core には、組み込みの X.509 証明書を認証用の一意のデバイス ID として使用できるようにする認証情報プロバイダーがあります。 AWS リクエスト。これによって、デバイスにアクセスキー ID およびシークレットアクセスキーを保存する必要がなくなります。

認証情報プロバイダーは、X.509 証明書を使用して発信者を認証し、一時的で制限された権限のセキュリティトークンを発行します。トークンは、 の署名と認証に使用できます。 AWS リクエスト。を認証するこの方法 AWS リクエストでは、 を作成して設定する必要があります。 AWS Identity and Access Management (IAM) ロール と は、適切なIAMポリシーをロールにアタッチして、認証情報プロバイダーがユーザーに代わってロールを引き受けられるようにします。の詳細については、「」を参照してください。 AWS IoT Core および についてはIAM、「」を参照してくださいの Identity and Access Management AWS IoT

AWS IoT では、デバイスが Server Name Indication (SNI) 拡張機能を Transport Layer Security (TLS) プロトコルに送信し、 host_name フィールドに完全なエンドポイントアドレスを指定する必要があります。host_name フィールドには、呼び出すエンドポイントが含まれている必要があります。次のようになる必要があります。

  • aws iot describe-endpoint --endpoint-type iot:CredentialProvider によって返される endpointAddress

正しい host_name 値を持たないデバイスによって試行された接続は失敗します。

次の図は認証情報プロバイダーのワークフローを示しています。

AWS IoT Core 認証情報プロバイダーのワークフロー。
  1. - AWS IoT Core デバイスは、認証情報プロバイダーにセキュリティトークンをHTTPSリクエストします。このリクエストには、認証のためのデバイスの X.509 証明書が含まれています。

  2. 認証情報プロバイダーはリクエストを に転送します。 AWS IoT Core 証明書を検証し、デバイスにセキュリティトークンをリクエストするアクセス許可があることを確認するための認証および認可モジュール。

  3. 証明書が有効で、セキュリティトークンをリクエストするアクセス許可がある場合、 AWS IoT Core 認証および認可モジュールは成功を返します。それ以外の場合は、デバイスに例外が送信されます。

  4. 証明書が正常に検証されると、認証情報プロバイダーは を呼び出します。 AWS Security Token Service (AWS STS) は、作成したIAMロールを引き受けます。

  5. AWS STS は、権限が制限された一時的なセキュリティトークンを認証情報プロバイダーに返します。

  6. 認証情報プロバイダーは、デバイスにセキュリティトークンを返します。

  7. デバイスはセキュリティトークンを使用して に署名します。 AWS による リクエスト AWS 署名バージョン 4。

  8. リクエストされたサービスは IAMを呼び出して署名を検証し、認証情報プロバイダー用に作成したIAMロールにアタッチされたアクセスポリシーに対してリクエストを承認します。

  9. が署名を正常にIAM検証し、リクエストを承認すると、リクエストは成功します。それ以外の場合は、IAM は例外を送信します。

次のセクションでは、証明書を使用してセキュリティトークンを取得する方法を説明します。これは、すでにデバイスが登録され、そのデバイスに独自の証明書を作成して有効化していることを前提に記述されています。

証明書を使用してセキュリティトークンを取得する方法

  1. 認証情報プロバイダーがデバイスに代わって引き受けるIAMロールを設定します。次の信頼ポリシーをロールにアタッチします。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "credentials.iot.amazonaws.com"}, "Action": "sts:AssumeRole" } }

    各 について AWS 呼び出したい サービスで、アクセスポリシーをロールにアタッチします。認証情報プロバイダーは次のポリシー変数をサポートしています。

    • credentials-iot:ThingName

    • credentials-iot:ThingTypeName

    • credentials-iot:AwsCertificateId

    デバイスが へのリクエストでモノの名前を提供する場合 AWS 認証情報プロバイダーは、 credentials-iot:ThingNameと をコンテキスト変数credentials-iot:ThingTypeNameとしてセキュリティトークンに追加します。デバイスがリクエストでモノの名前を提供していなくても、認証情報プロバイダーは credentials-iot:AwsCertificateId をコンテキスト変数として提供します。モノの名前をx-amzn-iot-thingnameHTTPリクエストヘッダーの値として渡します。

    これら 3 つの変数はポリシーでのみ機能し、IAMポリシーでは機能しません。 AWS IoT Core ポリシー。

  2. 次のステップ (ロールエイリアスの作成) を実行するユーザーに、新しく作成されたロールを に渡すアクセス許可があることを確認します。 AWS IoT Core。 次のポリシーは、 に iam:GetRoleと の両方のiam:PassRoleアクセス許可を付与します。 AWS ユーザー。iam:GetRole アクセス許可は、今作成したロールに関する情報をユーザーが取得できるようにします。アクセスiam:PassRole許可により、ユーザーはロールを別の に渡すことができます。 AWS サービス。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your AWS アカウント id:role/your role name" } }
  3. を作成する AWS IoT Core ロールエイリアス。が に直接呼び出すデバイス AWS サービスはARN、 に接続するときに使用するロールを把握している必要があります AWS IoT Core。 ロールのハードコーディングARNは、ロールARNが変更されるたびにデバイスを更新する必要があるため、適切なソリューションではありません。より良い解決策は、 を使用してCreateRoleAliasAPI、ロール を指すロールエイリアスを作成することですARN。ロールARNが変更された場合は、ロールエイリアスを更新するだけです。デバイスに変更を加える必要はありません。これにより、次のパラメータAPIが取得されます。

    roleAlias

    必須。ロールのエイリアスを識別する任意の文字列。これは、ロールエイリアスデータモデルのプライマリキーとして機能します。これには 1 ~ 128 文字を使用でき、英数字および =、@、- 記号のみを含めることができます。大文字および小文字のアルファベット文字を使用できます。

    roleArn

    必須。ロールエイリアスが参照するロールARNの 。

    credentialDurationSeconds

    オプション。認証情報が有効な時間 (秒単位) です。最小値は 900 秒 (15 分) です。最大値は 43,200 秒 (12 時間) です。デフォルト値は 3,600 秒 (1 時間) です。

    重要

    - AWS IoT Core 認証情報プロバイダーは、最大有効期間が 43,200 秒 (12 時間) の認証情報を発行できます。認証情報を最大 12 時間まで有効にすると、クレデンシャルを長くキャッシュすることで、クレデンシャルプロバイダーへの呼び出し回数を減らすことができます。

    credentialDurationSeconds 値は、IAMロールエイリアスが参照するロールの最大セッション期間以下である必要があります。詳細については、「ロールの最大セッション期間の変更」(AWS APIからの ) AWS Identity and Access Management ユーザーガイド。

    この の詳細については、API「」を参照してくださいCreateRoleAlias

  4. ポリシーをデバイス証明書にアタッチします。デバイス証明書にアタッチされているポリシーは、デバイスにそのロールを引き受ける権限を付与する必要があります。これを行うには、次の例のように、iot:AssumeRoleWithCertificate アクションへのアクセス許可をロールエイリアスに付与します。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"iot:AssumeRoleWithCertificate", "Resource":"arn:aws:iot:your region:your_aws_account_id:rolealias/your role alias" } ] }
  5. 認証情報プロバイダーにセキュリティトークンの取得をHTTPSリクエストします。以下の情報を提供します。

    • 証明書 : これはTLS相互認証経由のHTTPリクエストであるため、リクエストの実行時に証明書とプライベートキーをクライアントに提供する必要があります。証明書を に登録したときに使用したのと同じ証明書とプライベートキーを使用します。 AWS IoT Core.

      デバイスが と通信していることを確認するには AWS IoT Core (それを偽装するサービスではありません)、「サーバー認証」を参照し、リンクに従って適切な CA 証明書をダウンロードしてから、デバイスにコピーします。

    • RoleAlias: 認証情報プロバイダー用に作成したロールエイリアスの名前。

    • ThingName: の登録時に作成したモノの名前 AWS IoT Core モノ。これは x-amzn-iot-thingnameHTTPヘッダーの値として渡されます。この値は、 のポリシー変数としてモノの属性を使用している場合にのみ必要です。 AWS IoT Core または IAM ポリシー。

      注記

      ThingName指定する は、 の名前と一致するx-amzn-iot-thingname必要があります。 AWS IoT 証明書に割り当てられたモノのリソース。一致しない場合は、403 エラーが返されます。

    で次のコマンドを実行します。 AWS CLI で の認証情報プロバイダーエンドポイントを取得するには AWS アカウント。 この の詳細については、API「」を参照してくださいDescribeEndpoint。が有効なエンドポイントについては、FIPS「」を参照してくださいAWS IoT Core- 認証情報プロバイダーエンドポイント

    aws iot describe-endpoint --endpoint-type iot:CredentialProvider

    次のJSONオブジェクトは、 describe-endpoint コマンドのサンプル出力です。これには、セキュリティトークンをリクエストするために使用する endpointAddress が含まれています。

    { "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com" }

    エンドポイントを使用して、認証情報プロバイダーにセキュリティトークンを返すHTTPSリクエストを行います。次のコマンド例では を使用していますがcurl、任意のHTTPクライアントを使用できます。

    curl --cert your certificate --key your device certificate key pair -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-aliases/your role alias/credentials

    このコマンドは、accessKeyIdsecretAccessKeysessionToken および有効期限を含むセキュリティトークンオブジェクトを返します。次のJSONオブジェクトは、 curl コマンドのサンプル出力です。

    {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}

    その後、accessKeyId、、および sessionToken値を使用してsecretAccessKey、 へのリクエストに署名できます。 AWS サービス。 end-to-end デモンストレーションについては、「ハードコーディングの必要性を排除する方法」を参照してください。 AWS を使用したデバイスの認証情報 AWS IoT 認証情報プロバイダーのブログ記事 AWS セキュリティブログ