

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

# AWS IoT Core 認証情報プロバイダーを使用した AWS サービスへの直接呼び出しの許可
<a name="authorizing-direct-aws"></a>

デバイスは X.509 証明書を使用して、TLS 相互認証プロトコル AWS IoT Core を使用して に接続できます。他の AWS サービスは証明書ベースの認証をサポートしていませんが、[AWS 署名バージョン 4 形式の](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) AWS 認証情報を使用して呼び出すことができます。[署名バージョン 4 アルゴリズム](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)では、通常、呼び出し元にアクセスキー ID とシークレットアクセスキーが必要です。 には、組み込みの [X.509 証明書](x509-client-certs.html)を一意のデバイス ID として使用して AWS リクエストを認証できる認証情報プロバイダー AWS IoT Core があります。これによって、デバイスにアクセスキー ID およびシークレットアクセスキーを保存する必要がなくなります。

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

 AWS IoT では、デバイスが [Server Name Indication (SNI) 拡張機能](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)を Transport Layer Security (TLS) プロトコルに送信し、 `host_name`フィールドに完全なエンドポイントアドレスを指定する必要があります。`host_name` フィールドには、呼び出すエンドポイントが含まれている必要があります。次のようになる必要があります。
+ `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:CredentialProvider` によって返される `endpointAddress`。

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

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

![\[AWS IoT Core 認証情報プロバイダーのワークフロー。\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/credentials-provider-diagram.png)


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

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

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

1. 証明書の検証が成功したら、認証情報プロバイダーは [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) を呼び出して、そのために作成した IAM ロールを引き受けます。

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

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

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

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

1. IAM が署名の検証に成功してリクエストを認可したら、リクエストは成功します。それ以外の場合、IAM は例外を送信します。

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

## 証明書を使用してセキュリティトークンを取得する方法
<a name="authorizing-direct-aws.walkthrough"></a>

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 ポリシーには使用できません。

1. 次のステップ (ロールエイリアスの作成) を実行するユーザーに新しく作成したロールを 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::123456789012:role/your role name"
       }
   }
   ```

1.  AWS IoT Core ロールエイリアスを作成します。 AWS サービスへの直接呼び出しを行うデバイスは、 への接続時に使用するロール ARN を認識する必要があります AWS IoT Core。ロールの ARN のロールをハードコーディングすることは、ロールの ARN が変わるたびにデバイスを更新する必要があるため、良いソリューションではありません。`CreateRoleAlias` API を使用してロールの ARN を指し示すロールエイリアスを作成することが、より優れたソリューションです。ロールの ARN が変更された場合には、ロールエイリアスを更新だけです。デバイスに変更を加える必要はありません。この API には以下のパラメータがあります。  
`roleAlias`  
必須。ロールのエイリアスを識別する任意の文字列。これは、ロールエイリアスデータモデルのプライマリキーとして機能します。これには 1 \$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 ユーザーガイド」の「[Modifying a role maximum session duration (AWS API)](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-api.html#roles-modify_max-session-duration-api) AWS 」を参照してください。

   この API の詳細については、「[CreateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateRoleAlias.html)」を参照してください。

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

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:AssumeRoleWithCertificate",
               "Resource": "arn:aws:iot:us-east-1:123456789012:rolealias/your role alias"
           }
       ]
   }
   ```

1. 認証情報プロバイダーにセキュリティトークンを取得する HTTPS リクエストを行います。以下の情報を提供します。
   + *Certificate*: これは、TLS 相互認証を介した HTTP リクエストであるため、リクエスト作成中に証明書およびプライベートキーをクライアントに提供する必要があります。証明書の登録に使用したのと同じ証明書とプライベートキーを使用します AWS IoT Core。

     デバイスが AWS IoT Core (偽装するサービスではなく) と通信していることを確認するには、[「サーバー認証](x509-client-certs.html#server-authentication)」を参照し、リンクに従って適切な CA 証明書をダウンロードしてから、デバイスにコピーします。
   + *RoleAlias*: 認証情報プロバイダーに作成したロールエイリアスの名前。ロールエイリアス名では大文字と小文字が区別され、 で作成されたロールエイリアスと一致する必要があります AWS IoT Core。
   + *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](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html)」を参照してください。FIPS 対応のエンドポイントについては、「[AWS IoT Core- 認証情報プロバイダーエンドポイント](iot-connect-fips.md#iot-connect-fips-credential)」を参照してください。

   ```
   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 クライアントを使用できます。
**注記**  
*roleAlias* 名は大文字と小文字が区別され、 で作成されたロールエイリアスと一致する必要があります AWS IoT。

   ```
   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
   ```

   このコマンドは、`accessKeyId`、`secretAccessKey`、`sessionToken` および有効期限を含むセキュリティトークンオブジェクトを返します。次の 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 認証情報の必要性を排除する方法](https://aws.amazon.com/blogs/security/how-to-eliminate-the-need-for-hardcoded-aws-credentials-in-devices-by-using-the-aws-iot-credentials-provider/)」ブログ記事を参照してください。