AWS IoT Core認証情報プロバイダーを使用して、AWSサービスの直接呼出しを認証 - AWS IoT Core

AWS IoT Core認証情報プロバイダーを使用して、AWSサービスの直接呼出しを認証

デバイスは、AWS IoT CoreTLS 相互認証プロトコル使用に接続するための X.509 証明書を使用することができます。他の AWS サービスは証明書ベースの認証をサポートしていませんが、AWS 署名バージョン 4 形式の AWS 認証情報を使用して呼び出すことができます。証明書バージョン 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 の詳細については、AWS IoTのためのアイデンティティおよびアクセス管理 を参照してください。

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


                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 署名バージョン 4 で 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 に渡す権限があることを確認します。次のポリシーでは、AWS ユーザーに iam:GetRoleiam:PassRole 許可の両方を付与します。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 のサービスを直接呼び出すデバイスは、AWS IoT Core に接続するときにどの ARN ロールを使用するかを知る必要があります。ロールの 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 ロールの最長セッション時間と同じかそれ以下である必要があります。

    この 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」を参照してください。

    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"}}

    続いて、accessKeyIdsecretAccessKey、および sessionToken 値を使用して、AWS サービスへのリクエストに署名します。エンドツーエンドデモについては、AWS セキュリティブログのブログ記事の「AWS IoT 認証情報プロバイダーを使用して、デバイスでハードコードされた AWS 認証の必要性を消去する方法」を参照してください。