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

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

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

デバイスは X.509 証明書を使用して、TLS 相互認証プロトコル AWS IoT Core を使用して に接続できます。他の AWS サービスは証明書ベースの認証をサポートしていませんが、AWS 署名バージョン 4 形式の AWS 認証情報を使用して呼び出すことができます。署名バージョン 4 アルゴリズムでは、通常、呼び出し元にアクセスキー ID とシークレットアクセスキーが必要です。 には、組み込みの X.509 証明書を一意のデバイス ID として使用して AWS リクエストを認証できる認証情報プロバイダー AWS IoT Core があります。これによって、デバイスにアクセスキー 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. デバイスはセキュリティトークンを使用して、署名バージョン 4 で AWS AWS リクエストに署名します。

  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-thingname HTTP リクエストヘッダーの値としてモノの名前を渡します。

    上記の 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 が変わるたびにデバイスを更新する必要があるため、良いソリューションではありません。CreateRoleAlias API を使用してロールの 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 ロールの最長セッション時間と同じかそれ以下である必要があります。詳細については、「 Identity and Access Management ユーザーガイド」の「ロールの最大セッション期間 (AWS API) の変更」を参照してください。 AWS

    この 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 リクエストを行います。以下の情報を提供します。

    • Certificate: これは、TLS 相互認証を介した HTTP リクエストであるため、リクエスト作成中に証明書およびプライベートキーをクライアントに提供する必要があります。証明書の登録に使用したのと同じ証明書とプライベートキーを使用します AWS IoT Core。

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

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

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

      注記

      x-amzn-iot-thingname で提供する ThingName は証明書に割り当てられた AWS IoT Thing リソースの名前と一致する必要があります。一致しない場合は、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 private key -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、、secretAccessKey、および sessionToken値を使用して、 AWS サービスへのリクエストに署名できます。end-to-endのデモンストレーションについては、 AWS セキュリティブログのAWS 「認証情報プロバイダーを使用して、デバイスでハードコードされた AWS IoT 認証情報の必要性を排除する方法」ブログ記事を参照してください。