AWS のサービスの直接呼び出しの認証 - AWS IoT Core

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

AWS のサービスの直接呼び出しの認証

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

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

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


                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 account 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。

    credentialDurationInSeconds

    省略可能。認証情報が有効な時間 (秒単位) です。最小値は 900 秒 (15 分) です。最大値は 3,600 秒 (60 分) です。デフォルト値は 3,600 秒です。

    注記

    IAM ロールで指定された認証情報の有効期間は長くできますが、AWS IoT Core 認証情報プロバイダーが認証情報を発行する場合、その最大有効期間は 3,600 秒(60 分)です。

    この 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-thingname HTTP ヘッダーの値として渡されます。この値は、AWS IoT Core または IAM ポリシーのポリシー変数としてモノの属性を使用する場合にのみ必要となります。

    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 IoT 認証情報プロバイダーを使用して、デバイスでハードコードされた AWS 認証の必要性を消去する方法ブログ投稿AWS セキュリティブログ