

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

# Authorization
<a name="iot-authorization"></a>

認可とは、認証された ID にアクセス許可を付与するプロセスです。 AWS IoT Core および IAM ポリシー AWS IoT Core を使用して、 でアクセス許可を付与します。このトピックでは、 AWS IoT Core ポリシーについて説明します。IAM ポリシーの詳細については、[の ID とアクセスの管理 AWS IoT](security-iam.md) および [が IAM と AWS IoT 連携する方法](security_iam_service-with-iam.md) を参照してください。

AWS IoT Core ポリシーは、認証された ID が実行できる操作を決定します。認証済みの ID は、デバイス、モバイルアプリケーション、ウェブアプリケーション、デスクトップアプリケーションで使用されます。認証された ID は、 AWS IoT Core CLI コマンドを入力するユーザーでもかまいません。ID は、それらの AWS IoT Core オペレーションのアクセス許可を付与するポリシーがある場合にのみ、オペレーションを実行できます。

 AWS IoT Core ポリシーと IAM ポリシーはどちらも、アイデンティティ (*プリンシパル*とも呼ばれる) が実行できるオペレーションを制御する AWS IoT Core ために とともに使用されます。使用するポリシータイプは、認証に使用する ID のタイプによって異なります AWS IoT Core。

AWS IoT Core オペレーションは 2 つのグループに分けられます。
+ コントロールプレーン API では、証明書、モノ、ルールなどの作成または更新などの管理タスクを行うことができます。
+ データプレーン API では、データを送受信できます AWS IoT Core。

使用するポリシーのタイプは、コントロールプレーン API とデータプレーン API のどちらを使用しているかによって異なります。

次の表に、ID タイプ、使用しているプロトコル、認可時に使用することのできるポリシータイプを示します。


**AWS IoT Core データプレーン API とポリシータイプ**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-authorization.html)


**AWS IoT Core コントロールプレーン API とポリシータイプ**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-authorization.html)

AWS IoT Core ポリシーは、X.509 証明書、Amazon Cognito ID、またはモノのグループにアタッチされます。IAM ポリシーは、IAM ユーザー、グループ、ロールにアタッチされます。 AWS IoT コンソールまたは CLI AWS IoT Core を使用して (証明書、Amazon Cognito Identity、またはモノのグループに) ポリシーをアタッチする場合は、 AWS IoT Core ポリシーを使用します。それ以外の場合は、モノのグループにアタッチされた IAM policy. AWS IoT Core policies が、そのモノのグループ内のすべてのモノに適用されます。 AWS IoT Core ポリシーを有効にするには、 `clientId`とモノの名前が一致している必要があります。

ポリシーベースの権限付与は強力なツールになります。これにより、デバイス、ユーザー、アプリケーションが AWS IoT Coreでできることを完全に制御できます。例えば、証明書 AWS IoT Core を使用して に接続するデバイスを考えてみましょう。この場合、デバイスを使用して、すべての MQTT トピックへのアクセスを許可するか、1 つのトピックにアクセスを制限できます。または、コマンドラインで CLI コマンドを入力することもできます。ポリシーを使用すると、ユーザーの任意のコマンドまたは AWS IoT Core リソースへのアクセスを許可または拒否できます。また、 AWS IoT Core リソースへのアプリケーションのアクセスを制御することもできます。

 AWS IoT がポリシードキュメントをキャッシュする方法によっては、ポリシーに加えられた変更が有効になるまでに数分かかる場合があります。つまり、最近アクセス権が付与されたリソースにアクセスするには数分かかる場合があり、アクセスが取り消された後、数分間リソースにアクセスできる場合があります。

## AWS トレーニングと認定
<a name="iot-authorization-training"></a>

での認可については AWS IoT Core、 AWS 「トレーニング[と認定」ウェブサイトの「認証と認可の詳細 AWS IoT Core](https://www.aws.training/Details/Curriculum?id=42335)」コースを受講してください。

# AWS IoT Core ポリシー
<a name="iot-policies"></a>

AWS IoT Core ポリシーは JSON ドキュメントです。IAM ポリシーと同じ規則に従います。 は名前付きポリシー AWS IoT Core をサポートしているため、多くの ID が同じポリシードキュメントを参照できます。名前付きポリシーは、簡単にロールバックされるようにバージョン管理されます。

AWS IoT Core ポリシーを使用すると、 AWS IoT Core データプレーンへのアクセスを制御できます。 AWS IoT Core のデータプレーンは、 AWS IoT Core メッセージブローカーへの接続、MQTT メッセージの送受信、デバイスのシャドウの取得または更新を可能にするオペレーションで構成されます。

 AWS IoT Core ポリシーは、1 つ以上のポリシーステートメントを含む JSON ドキュメントです。各ステートメントには、次の内容が含まれます。
+ `Effect`: アクションが許可されるか拒否されるかを指定します。
+ `Action` では、ポリシーで許可または拒否されているアクションを指定します。
+ `Resource` では、アクションを許可または拒否するリソースを 1 つ以上指定します。

ポリシーに加えられた変更は、 がポリシードキュメントを AWS IoT キャッシュするため、有効になるまでに 6～8 分かかる場合があります。つまり、最近アクセス権が付与されたリソースにアクセスするには数分かかる場合があり、アクセスが取り消された後、数分間リソースにアクセスできる場合があります。

AWS IoT Core ポリシーは、X.509 証明書、Amazon Cognito ID、およびモノのグループにアタッチできます。モノのグループにアタッチされたポリシーは、そのグループ内のあらゆるものに適用されます。ポリシーを有効にするには、`clientId` とモノの名前が一致している必要があります。 AWS IoT Core ポリシーは、IAM ポリシーと同じポリシーの評価ロジックに従います。デフォルトでは、すべてのポリシーが明示的に拒否されます。アイデンティティベースのポリシーまたはリソースベースのポリシーに対する明示的な許可は、このデフォルト設定を上書きします。ポリシー内の明示的な拒否は、すべての許可に優先します。詳細については、*AWS Identity and Access Management  ユーザーガイド*の「[ポリシーの評価論理](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)」を参照してください。

**Topics**
+ [AWS IoT Core ポリシーアクション](iot-policy-actions.md)
+ [AWS IoT Core アクションリソース](iot-action-resources.md)
+ [AWS IoT Core ポリシー変数](iot-policy-variables.md)
+ [サービス間での不分別な代理処理の防止](cross-service-confused-deputy-prevention.md)
+ [AWS IoT Core ポリシーの例](example-iot-policies.md)
+ [Amazon Cognito ID を使用した承認](cog-iot-policies.md)

# AWS IoT Core ポリシーアクション
<a name="iot-policy-actions"></a>

次のポリシーアクションは、 AWS IoT Coreによって定義されています。MQTT ポリシーアクション

`iot:Connect`  
 AWS IoT Core メッセージブローカーに接続するアクセス許可を表します。`iot:Connect`アクセス許可は、`CONNECT` リクエストがブローカーに送信される度に確認されます。メッセージブローカーは、同じクライアント ID を持つ 2 つのクライアントが同時に接続を維持することを許可しません。2 番目のクライアントが接続すると、ブローカーは既存の接続を閉じます。`iot:Connect` アクセス許可を使い、特定のクライアント ID を使用している権限を持つクライアントのみが接続できる事を確認します。

`iot:DeleteConnection`  
接続された MQTT クライアントを AWS IoT Coreから切断するアクセス許可を表します。`iot:DeleteConnection` アクセス許可は、クライアントを強制的に切断するリクエストが行われるたびにチェックされます。クライアントを切断すると、 はクライアントのネットワーク接続を AWS IoT Core 閉じ、オプションでセッション状態をクリーンアップします。

`iot:GetRetainedMessage`  
保持されている単一のメッセージの内容を取得するためのアクセス許可を表します。保持メッセージは、RETAIN フラグを設定して公開され、 によって保存されたメッセージです AWS IoT Core。アカウントの保持されているすべてのメッセージのリストを取得するためのアクセス許可については、[iot:ListRetainedMessages](#action_listretainedmessages)を参照。

`iot:ListRetainedMessages`  
アカウントの保持メッセージの内容ではなく、それに関する概要情報を取得するためのアクセス許可を表します。保持メッセージは、RETAIN フラグを設定して公開され、 によって保存されたメッセージです AWS IoT Core。このアクションのために指定されたリソース ARN は`*`のはずです。保持されている単一のメッセージの内容を取得するためのアクセス許可については、[iot:GetRetainedMessage](#action_getretainpublish) を参照。

`iot:Publish`  
MQTT トピックを発行するためのアクセス許可を表します。このアクセス権限は、PUBLISH リクエストがブローカーに送信される度に確認されます。このアクセス許可を使用して、クライアントが特定のトピックパターンに対し発行できるようにします。  
`iot:Publish` アクセス許可を付与するには、`iot:Connect` アクセス許可も付与する必要があります。

`iot:Receive`  
メッセージを受信するアクセス許可を表します AWS IoT Core。`iot:Receive` アクセス許可は、メッセージがクライアントに配信されるたびに確認されます。このアクセス許可は配信ごとに確認されるため、この権限を利用し、現在トピックにサブスクライブしているクライアントに対してアクセス許可を取り消すことができます。

`iot:RetainPublish`  
設定された RETAIN フラッグで MQTT メッセージを発行するためのアクセス許可を表します。  
`iot:RetainPublish` アクセス許可を付与するには、`iot:Publish` アクセス許可も付与する必要があります。

`iot:Subscribe`  
トピックフィルターにサブスクライブするアクセス権限を表します。このアクセス権限は、SUBSCRIBE リクエストがブローカーに送信される度に確認されます。このアクセス許可を使用して、クライアントが、特定のトピックパターンに一致するトピックにサブスクライブできるようにします。  
`iot:Subscribe` アクセス許可を付与するには、`iot:Connect` アクセス許可も付与する必要があります。シャドウポリシーアクション

`iot:DeleteThingShadow`  
thing のデバイスシャドウを削除するアクセス権限を表します。`iot:DeleteThingShadow` アクセス権限は、thing のデバイスシャドウのコンテンツの削除リクエストが行われるたびに確認されます。

`iot:GetThingShadow`  
thing のデバイスシャドウを取得するアクセス権限を表します。`iot:GetThingShadow` アクセス権限は、thing のデバイスシャドウコンテンツの取得リクエストが行われるたびに確認されます。

`iot:ListNamedShadowsForThing`  
thing の名前付きのシャドウを削除するアクセス権限を表します。`iot:ListNamedShadowsForThing` アクセス権限は、thing の名前付きシャドウの一覧表示リクエストが行われる度に確認されます。

`iot:UpdateThingShadow`  
デバイスのシャドウを更新するアクセス権限を表します。`iot:UpdateThingShadow` アクセス権限は、thing のデバイスシャドウコンテンツの更新リクエストが行われるたびに確認されます。

**注記**  
ジョブ実行ポリシーアクションは、HTTP TLS エンドポイントにのみ適用されます。MQTT エンドポイントを使用する場合は、このトピックで定義された MQTT ポリシーアクションを使用する必要があります。  
これを示すジョブ実行ポリシーの例については、MQTT プロトコルと連携する [基本的なジョブポリシーの例](basic-jobs-example.md) を参照してください。ジョブ実行 AWS IoT Core ポリシーアクション

`iotjobsdata:DescribeJobExecution`  
特定のモノのジョブの実行を取得するアクセス権限を表します。`iotjobsdata:DescribeJobExecution` アクセス許可は、ジョブの実行の取得リクエストが行われるたびに確認されます。

`iotjobsdata:GetPendingJobExecutions`  
モノの終了のステータスではないジョブのリストを取得するアクセス権限を表します。`iotjobsdata:GetPendingJobExecutions` アクセス権限は、リストの取得リクエストが行われるたびに確認されます。

`iotjobsdata:UpdateJobExecution`  
ジョブの実行を更新するアクセス権限を表します。`iotjobsdata:UpdateJobExecution` アクセス権限は、ジョブ実行の状態の更新リクエストが行われるたびに確認されます。

`iotjobsdata:StartNextPendingJobExecution`  
モノに対して保留中の次のジョブ実行を取得および開始するアクセス権限を表します (つまり、ステータスが QUEUED から IN\$1PROGRESS であるジョブの実行を更新します)。`iotjobsdata:StartNextPendingJobExecution` アクセス許可は、保留中の次のジョブ実行を開始するリクエストが行われるたびに確認されます。AWS IoT Core 認証情報プロバイダーポリシーアクション

`iot:AssumeRoleWithCertificate`  
 AWS IoT Core 認証情報プロバイダーを呼び出して、証明書ベースの認証で IAM ロールを引き受けるアクセス許可を表します。アクセス`iot:AssumeRoleWithCertificate`許可は、 AWS IoT Core 認証情報プロバイダーにロールを引き受けるリクエストが行われるたびにチェックされます。

# AWS IoT Core アクションリソース
<a name="iot-action-resources"></a>

 AWS IoT Core ポリシーアクションのリソースを指定するには、リソースの Amazon リソースネーム (ARN) を使用します。リソースの ARN はすべて、次のような形式になります。

```
arn:partition:iot:region:AWS-account-ID:Resource-type/Resource-name
```

以下の表では、アクションタイプごとに指定するリソースを示しています。ARN の例は、パーティション `aws` 内のアカウント ID `123456789012` で、リージョン `us-east-1` に固有です。ARN の形式の詳細については、 AWS Identity and Access Management ユーザーガイドの[「Amazon リソースネーム (ARNs](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference-arns.html)」を参照してください。


| Action | リソースタイプ | リソース名 | ARN の例 | 
| --- | --- | --- | --- | 
| iot:Connect | client |  クライアントのクライアント ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteConnection | client |  クライアントのクライアント ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteThingShadow | thing |  モノの名前、および該当する場合はシャドウの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iotjobsdata:DescribeJobExecution | thing |  モノの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iotjobsdata:GetPendingJobExecutions | thing |  モノの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:GetRetainedMessage | topic |  保持されたメッセージトピック  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iot:GetThingShadow | thing |  モノの名前、および該当する場合はシャドウの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:ListNamedShadowsForThing | すべて | すべて |  \$1 | 
| iot:ListRetainedMessages | すべて | すべて |  \$1 | 
| iot:Publish | topic |  トピック文字列  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:Receive | topic |  トピック文字列  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:RetainPublish | topic |  設定された RETAIN フラグと共に発行するためのトピック  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iotjobsdata:StartNextPendingJobExecution | thing |  モノの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:Subscribe | topicfilter | トピックフィルター文字列 | arn:aws:iot:us-east-1:123456789012:topicfilter/myTopicFilter | 
| iotjobsdata:UpdateJobExecution | thing |  モノの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:UpdateThingShadow | thing |  モノの名前、および該当する場合はシャドウの名前  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:AssumeRoleWithCertificate | rolealias |  ロール ARN をポイントするロールエイリアス  |  arn:aws:iot:us-east-1:123456789012:rolealias/CredentialProviderRole\$1alias | 

# AWS IoT Core ポリシー変数
<a name="iot-policy-variables"></a>

AWS IoT Core は、 `Resource` または `Condition`ブロックのポリシーで使用できる AWS IoT Core ポリシー変数を定義します。ポリシーが評価されると、ポリシー変数は実際の値に置き換えられます。たとえば、デバイスがクライアント ID が 100-234-3456 の AWS IoT Core メッセージブローカーに接続されている場合、`iot:ClientId`ポリシードキュメントのポリシー変数は 100-234-3456 に置き換えられます。

AWS IoT Core ポリシーはワイルドカード文字を使用し、IAM ポリシーと同様の規則に従うことができます。文字列に `*` (アスタリスク) を挿入すると、任意の文字に一致するワイルドカードとして扱うことができます。例えば、`*` を使用してポリシーの `Resource` 属性で複数の MQTT トピック名を記述できます。`+` と `#` の文字は、ポリシーの中でリテラル文字列として扱われます。ワイルドカードを使用する方法を示したポリシー例については、「[MQTT および AWS IoT Core ポリシーでのワイルドカード文字の使用](pub-sub-policy.md#pub-sub-policy-cert)」を参照してください。

また、固定値を持つ事前定義されたポリシー変数を使用して、それ以外の場合に特別な意味を持つ文字を表現することができます。これらの特殊文字には、`$(*)`、`$(?)`、および `$($)` が含まれます。ポリシー変数と特殊文字の詳細については、「[IAM ポリシーの要素: 変数とタグ](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)」および「[複数のキーまたは値による条件の作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)」を参照してください。

**Topics**
+ [基本的な AWS IoT Core ポリシー変数](basic-policy-variables.md)
+ [モノのポリシー変数](thing-policy-variables.md)
+ [X.509 証明書 AWS IoT Core ポリシー変数](cert-policy-variables.md)

# 基本的な AWS IoT Core ポリシー変数
<a name="basic-policy-variables"></a>

AWS IoT Core は、以下の基本的なポリシー変数を定義します。
+ `aws:SourceIp`: AWS IoT Core メッセージブローカーに接続されているクライアントの IP アドレス。
+ `iot:ClientId`: このクライアント ID は、 AWS IoT Core メッセージブローカーに接続するために使用されます。
+ `iot:DomainName`: 接続先のクライアントのドメイン名 AWS IoT Core。

**Topics**
+ [`ClientId` および `SourceIp` ポリシー変数の例](#basic-policy-variables-example)
+ [`iot:DomainName` ポリシー変数の例](#basic-policy-variables-example-domain)

## `ClientId` および `SourceIp` ポリシー変数の例
<a name="basic-policy-variables-example"></a>

次の AWS IoT Core ポリシーは、ポリシー変数を使用するポリシーを示しています。 `aws:SourceIp`は、ポリシーの Condition 要素で使用して、プリンシパルが特定のアドレス範囲内でのみ API リクエストを実行できるようにします。例については「[ユーザーとクラウドサービスに AWS IoT ジョブの使用を許可する](iam-policy-users-jobs.md)」を参照してください。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "123.45.167.89"
				}
			}
		}
	]
}
```

これらの例では、ポリシー`${iot:ClientId}`が評価されると、 は AWS IoT Core メッセージブローカーに接続されたクライアントの ID に置き換えられます。`${iot:ClientId}` などのポリシー変数を使用すると、アクセス可能にしないトピックにアクセスすることがあります。例えば、`${iot:ClientId}` を使用するポリシーでトピックフィルターを指定する場合です。

```
{
	"Effect": "Allow",
	"Action": [
		"iot:Subscribe"
	],
	"Resource": [
		"arn:aws:iot:us-east-1:123456789012:topicfilter/my/${iot:ClientId}/topic"
	]
}
```

クライアントは、クライアント ID として `+` を使用して接続できます。これにより、ユーザーはトピックフィルター `my/+/topic` に一致する任意のトピックにサブスクライブできます。このようなセキュリティギャップから保護するには、`iot:Connect` ポリシーアクションを使用して、どのクライアント ID が接続できるかを制御します。例えば、このポリシーにより、これらのクライアント ID が `clientid1` のクライアントのみが接続できるようになります。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid"
			]
		}
	]
}
```

**注記**  
ポリシー変数 `${iot:ClientId}` を `Connect` と併用することはお勧めしません。`ClientId` の値はチェックされないため、別のクライアントの ID のアタッチャーが検証に合格しても接続が切断されることがあります。どのクライアント ID `ClientId` も許可されているため、ランダムなクライアント ID を設定すると、モノグループのポリシーがバイパスされる可能性があります。

## `iot:DomainName` ポリシー変数の例
<a name="basic-policy-variables-example-domain"></a>

`iot:DomainName` ポリシー変数を追加して、使用できるドメインを制限できます。`iot:DomainName` ポリシー変数を追加すると、デバイスは特定の設定済みエンドポイントにのみ接続できます。

次のポリシーでは、デバイスが指定されたドメインに接続することを許可します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "AllowConnectionsToSpecifiedDomain",
		"Effect": "Allow",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

次のポリシーは、デバイスが指定されたドメインに接続することを拒否します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "DenyConnectionsToSpecifiedDomain",
		"Effect": "Deny",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

ポリシー条件演算子の詳細については、「[IAM JSON ポリシーエレメント: 条件演算子](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)」を参照してください。ドメイン設定の詳細については、「[ドメイン設定とは](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)」を参照してください。

# モノのポリシー変数
<a name="thing-policy-variables"></a>

モノのポリシー変数を使用すると、モノの名前、モノのタイプ、モノの属性値などのモノのプロパティに基づいてアクセス許可を付与または拒否する AWS IoT Core ポリシーを作成できます。モノのポリシー変数を使用して、同じポリシーを適用して多くの AWS IoT Core デバイスを制御できます。デバイスのプロビジョニングの詳細については、「[デバイスプロビジョニング](iot-provision.html)」を参照してください。

非排他的なモノの関連付けを使用する場合、同じ証明書を複数のモノにアタッチすることができます。明確な関連付けを維持し、潜在的な競合を回避するには、クライアント ID をモノの名前と一致させる必要があります。この場合、モノの接続時に送信される MQTT `Connect` メッセージ内のクライアント ID からモノの名前を取得します AWS IoT Core。

 AWS IoT Core ポリシーでモノのポリシー変数を使用する場合は、次の点に注意してください。
+ [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API を使用して、証明書やプリンシパル (認証済みの Amazon Cognito ID) をモノにアタッチします。
+ モノの名前をモノのポリシー変数に置き換える場合、MQTT 接続メッセージまたは TLS 接続の `clientId` の値がモノの名前と完全に一致している必要があります。

以下のモノのポリシー変数が利用可能です。
+ `iot:Connection.Thing.ThingName`

  これは、ポリシーが評価されている AWS IoT Core レジストリ内のモノの名前に解決されます。 は、デバイスが認証するときに提示する証明書 AWS IoT Core を使用して、接続の検証に使用するモノを決定します。このポリシー変数は、デバイスが MQTT または MQTT over WebSocket プロトコルに接続するときにのみ使用できます。
+ `iot:Connection.Thing.ThingTypeName`

  これは、ポリシーが評価されているモノと関連付けられるモノのタイプに解決されます。MQTT/WebSocket 接続のクライアント ID は、モノの名前と同じである必要があります。このポリシー変数は、MQTT または MQTT over WebSocket プロトコルに接続するときにのみ使用できます。
+ `iot:Connection.Thing.Attributes[attributeName]`

  これは、ポリシーが評価されているモノと関連付けられる指定した属性値に解決されます。モノには最大 50 個の属性を指定できます。各属性はポリシー変数として使用できます。`iot:Connection.Thing.Attributes[attributeName]` *attributeName* は属性の名前です。MQTT/WebSocket 接続のクライアント ID は、モノの名前と同じである必要があります。このポリシー変数は、MQTT または MQTT over WebSocket プロトコルに接続するときにのみ使用できます。
+ `iot:Connection.Thing.IsAttached`

  `iot:Connection.Thing.IsAttached: ["true"]` は、 に登録 AWS IoT され、プリンシパルにアタッチされているデバイスのみがポリシー内のアクセス許可にアクセスできるようにします。この変数を使用すると、デバイスがレジストリ内の AWS IoT Core IoT モノにアタッチされていない証明書を提示 AWS IoT Core する場合、デバイスが に接続できないようにできます。この変数には値 `true` または があり、接続するモノが [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API を使用してレジストリ内の証明書または Amazon Cognito ID にアタッチされている`false`ことを示します。モノの名前はクライアント ID として使用されます。

クライアント ID がモノの名前と一致する場合、または証明書をモノに排他的にアタッチする場合は、ポリシー定義でポリシー変数を使用すると、ポリシー管理を簡素化できます。IoT のモノごとに個別のポリシーを作成する代わりに、モノのポリシー変数を使用して単一のポリシーを定義できます。このポリシーは、すべてのデバイスに動的に適用できます。以下は、この仕組みを示すポリシーの例です。詳細については、「[AWS IoT モノを MQTT クライアント接続に関連付ける](exclusive-thing.md)」を参照してください。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Condition": {
				"StringLike": {
					"iot:ClientId": "*${iot:Connection.Thing.Attributes[envType]}"
				}
			},
			"Effect": "Allow",
			"Action": "iot:Connect",
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/*"
		}
	]
}
```

このポリシー例では、クライアント ID が `envType` 属性の値で終わる AWS IoT Core と、モノは に接続できます。接続できるのは、一致するクライアント ID パターンを持つモノのみです。

# X.509 証明書 AWS IoT Core ポリシー変数
<a name="cert-policy-variables"></a>

X.509 証明書ポリシー変数は、 AWS IoT Core ポリシーの記述に役立ちます。これらのポリシーは、X.509 証明書属性に基づいてアクセス許可を付与します。次のセクションでは、それらの証明書のポリシー変数を使用する方法を説明します。

**重要**  
X.509 証明書に特定の証明書属性が含まれていないものの、対応する証明書ポリシー変数がポリシードキュメントで使用されている場合、ポリシー評価によって予期しない動作が発生する可能性があります。

## CertificateId
<a name="cert-policy-variables-certid"></a>

[RegisterCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCertificate.html) API では、レスポンス本文に `certificateId` が表示されます。証明書に関する情報を取得するには、[DescribeCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeCertificate.html) で `certificateId` を使用できます。

## 発行元の属性
<a name="issuer-attributes"></a>

次の AWS IoT Core ポリシー変数は、証明書発行者が設定した証明書属性に基づいて、アクセス許可の許可または拒否をサポートします。
+ `iot:Certificate.Issuer.DistinguishedNameQualifier`
+ `iot:Certificate.Issuer.Country`
+ `iot:Certificate.Issuer.Organization`
+ `iot:Certificate.Issuer.OrganizationalUnit`
+ `iot:Certificate.Issuer.State`
+ `iot:Certificate.Issuer.CommonName`
+ `iot:Certificate.Issuer.SerialNumber`
+ `iot:Certificate.Issuer.Title`
+ `iot:Certificate.Issuer.Surname`
+ `iot:Certificate.Issuer.GivenName`
+ `iot:Certificate.Issuer.Initials`
+ `iot:Certificate.Issuer.Pseudonym`
+ `iot:Certificate.Issuer.GenerationQualifier` 

## 件名の属性
<a name="subject-attributes"></a>

次の AWS IoT Core ポリシー変数は、証明書発行者が設定した証明書のサブジェクト属性に基づいて、アクセス許可の付与または拒否をサポートします。
+ `iot:Certificate.Subject.DistinguishedNameQualifier`
+ `iot:Certificate.Subject.Country`
+ `iot:Certificate.Subject.Organization`
+ `iot:Certificate.Subject.OrganizationalUnit`
+ `iot:Certificate.Subject.State`
+ `iot:Certificate.Subject.CommonName`
+ `iot:Certificate.Subject.SerialNumber`
+ `iot:Certificate.Subject.Title`
+ `iot:Certificate.Subject.Surname`
+ `iot:Certificate.Subject.GivenName`
+ `iot:Certificate.Subject.Initials`
+ `iot:Certificate.Subject.Pseudonym`
+ `iot:Certificate.Subject.GenerationQualifier` 

X.509 証明書は、これらの属性に 1 つ以上の値を含むオプションを提供します。デフォルトでは、複数値の各属性用のポリシー変数は最初の値を返します。例えば、`Certificate.Subject.Country` 属性には国名のリストが含まれる場合がありますが、ポリシーで評価されると、`iot:Certificate.Subject.Country` は最初の国名に置き換えられます。

1 から始めるインデックスを使用して、最初の値以外の特定の属性値をリクエストできます。例えば、`iot:Certificate.Subject.Country.1` は、`Certificate.Subject.Country` 属性の 2 番目の国名に置き換えられます。存在していないインデックス値を指定する場合、(例えば、属性に割り当てられた値が 2 つのみのとき 3 番目の値を要求すると) 置き換えはされず、認可は失敗します。ポリシーの変数名で、`.List` サフィックスを使用して、属性の値をすべて指定できます。

## 発行元の代替名属性
<a name="issuer-alternate-name-attributes"></a>

次の AWS IoT Core ポリシー変数は、証明書発行者が設定した発行者の代替名属性に基づいて、アクセス許可の付与または拒否をサポートします。
+ `iot:Certificate.Issuer.AlternativeName.RFC822Name`
+ `iot:Certificate.Issuer.AlternativeName.DNSName`
+ `iot:Certificate.Issuer.AlternativeName.DirectoryName`
+ `iot:Certificate.Issuer.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Issuer.AlternativeName.IPAddress`

## 件名の代替名属性
<a name="subject-alternate-name-attributes"></a>

次の AWS IoT Core ポリシー変数は、証明書発行者が設定したサブジェクト代替名属性に基づいて、アクセス許可の付与または拒否をサポートします。
+ `iot:Certificate.Subject.AlternativeName.RFC822Name`
+ `iot:Certificate.Subject.AlternativeName.DNSName`
+ `iot:Certificate.Subject.AlternativeName.DirectoryName`
+ `iot:Certificate.Subject.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Subject.AlternativeName.IPAddress`

## その他の属性
<a name="other-attributes"></a>

を使用して`iot:Certificate.SerialNumber`、証明書のシリアル番号に基づいて、 AWS IoT Core リソースへのアクセスを許可または拒否できます。`iot:Certificate.AvailableKeys` ポリシー変数には、値を含むすべての証明書のポリシー変数の名前が含まれます。

# X.509 証明書のポリシー変数の使用
<a name="use-policy-variables"></a>

このトピックでは、証明書のポリシー変数の使用方法について詳しく説明します。X.509 証明書のポリシー変数は、X.509 証明書の属性に基づいてアクセス許可を付与する AWS IoT Core ポリシーを作成するときに必須です。X.509 証明書に特定の証明書属性が含まれていないものの、対応する証明書ポリシー変数がポリシードキュメントで使用されている場合、ポリシー評価によって予期しない動作が発生する可能性があります。これは、欠落しているポリシー変数がポリシーステートメントで評価されないためです。

**Topics**
+ [X.509 証明書の例](#certificate-example)
+ [証明書のポリシー変数としての証明書発行者の属性の使用](#issuer-attributes-policy)
+ [証明書のポリシー変数としての証明書のサブジェクト属性の使用](#subject-attributes-policy)
+ [証明書ポリシー変数として証明書発行者の代替名属性を使用](#issuer-alternate-name-attributes-policy)
+ [証明書ポリシー変数として証明書サブジェクトの代替名属性を使用](#subject-alternate-name-attributes-policy)
+ [証明書ポリシー変数として他の証明書属性を使用](#other-attributes-policy)
+ [X.509 証明書のポリシー変数の制限](#policy-limits)
+ [証明書ポリシー変数を使用したポリシーの例](#example-attributes-policy)

## X.509 証明書の例
<a name="certificate-example"></a>

一般的な X.509 証明書は次のように表示されます。この証明書の例には、証明書の属性が含まれています。 AWS IoT Core ポリシーの評価中、`Serial Number`、`Issuer`、`Subject`、`X509v3 Issuer Alternative Name`、および `X509v3 Subject Alternative Name` の証明書の属性が証明書ポリシー変数として入力されます。

```
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            92:12:85:cb:b7:a5:e0:86
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=IoT Devices, OU=SmartHome, ST=WA, CN=IoT Devices Primary CA, 
				GN=Primary CA1/initials=XY/dnQualifier=Example corp,
				SN=SmartHome/ title=CA1/pseudonym=Primary_CA/generationQualifier=2/serialNumber=987		
        Validity
            Not Before: Mar 26 03:25:40 2024 GMT
            Not After : Apr 28 03:25:40 2025 GMT
        Subject: C=US, O=IoT Devices, OU=LightBulb, ST=NY, CN=LightBulb Device Cert, 
				GN=Bulb/initials=ZZ/dnQualifier=Bulb001, 
				SN=Multi Color/title=RGB/pseudonym=RGB Device/generationQualifier=4/serialNumber=123
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    << REDACTED >>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                DNS:example.com, IP Address:1.2.3.4, URI:ResourceIdentifier001, email:device1@example.com, DirName:/C=US/O=IoT/OU=SmartHome/CN=LightBulbCert
            X509v3 Issuer Alternative Name: 
                DNS:issuer.com, IP Address:5.6.7.8, URI:PrimarySignerCA, email:primary@issuer.com, DirName:/C=US/O=Issuer/OU=IoT Devices/CN=Primary Issuer CA
    Signature Algorithm: sha256WithRSAEncryption
         << REDACTED >>
```

## 証明書のポリシー変数としての証明書発行者の属性の使用
<a name="issuer-attributes-policy"></a>

次の表は、証明書発行者の属性を AWS IoT Core ポリシーに入力する方法の詳細を示しています。


**ポリシーに入力する発行者の属性**  

| 証明書発行者の属性 | 証明書のポリシー変数 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  | 

## 証明書のポリシー変数としての証明書のサブジェクト属性の使用
<a name="subject-attributes-policy"></a>

次の表は、証明書のサブジェクト属性を AWS IoT Core ポリシーに入力する方法の詳細を示しています。


**ポリシーに入力されるサブジェクト属性**  

| 証明書のサブジェクト属性 | 証明書のポリシー変数 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  | 

## 証明書ポリシー変数として証明書発行者の代替名属性を使用
<a name="issuer-alternate-name-attributes-policy"></a>

次の表は、証明書発行者の代替名属性が AWS IoT Core ポリシーに入力される方法の詳細を示しています。


**ポリシーに入力する発行者の代替名属性**  

| X509v3 発行者の代替名 | ポリシー内の属性 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  | 

## 証明書ポリシー変数として証明書サブジェクトの代替名属性を使用
<a name="subject-alternate-name-attributes-policy"></a>

次の表は、証明書サブジェクトの代替名属性が AWS IoT Core ポリシーに入力される方法の詳細を示しています。


**ポリシーに入力されるサブジェクトの代替名属性**  

| X509v3 サブジェクトの代替名 | ポリシー内の属性 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/use-policy-variables.html)  | 

## 証明書ポリシー変数として他の証明書属性を使用
<a name="other-attributes-policy"></a>

次の表は、他の証明書属性が AWS IoT Core ポリシーに入力される方法の詳細を示しています。


**ポリシーに入力されるその他の属性**  

| その他の証明書属性 | 証明書のポリシー変数 | 
| --- | --- | 
|  `Serial Number: 92:12:85:cb:b7:a5:e0:86`  |  `iot:Certificate.SerialNumber = 10525622389124227206`  | 

## X.509 証明書のポリシー変数の制限
<a name="policy-limits"></a>

次の制限は、X.509 証明書のポリシー変数に適用されます。

欠落しているポリシー変数  
X.509 証明書に特定の証明書属性が含まれていないものの、対応する証明書ポリシー変数がポリシードキュメントで使用されている場合、ポリシー評価によって予期しない動作が発生する可能性があります。これは、欠落しているポリシー変数がポリシーステートメントで評価されないためです。

証明書の SerialNumber 形式  
AWS IoT Core は、証明書のシリアル番号を 10 進数の整数の文字列表現として扱います。例えば、ポリシーで証明書のシリアル番号に一致するクライアント ID のみの接続が許可されている場合、クライアント ID は 10 進数のシリアル番号である必要があります。

ワイルドカード  
ワイルドカード文字が証明書の属性にある場合は、ポリシー変数は証明書属性値に置き換えられません。そのため、ポリシードキュメントに `${policy-variable}` テキストが残ります。これにより、承認が失敗する場合があります。ワイルドカード文字として、`*`、`$`、`+`、`?`、`#` を使用できます。

配列フィールド  
配列を含む証明書の属性は、5 つの項目に制限されます。追加項目は無視されます。

文字列の長さ  
すべての文字列値は 1024 文字に制限されています。証明書の属性に、1024 文字以上の文字列が含まれている場合、ポリシー変数は証明書の属性値に置き換えられません。そのため、ポリシードキュメントに `${policy-variable}` が残ります。これにより、承認が失敗する場合があります。

特殊文字  
`,`、`"`、`\`、`+`、`=`、`<`、`>`、`;` などの特殊文字をポリシー変数で使用する場合は、先頭にバックスラッシュ (`\`) を付ける必要があります。例えば、`Amazon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US` は `Amazon Web Service O\=Amazon.com Inc. L\=Seattle ST\=Washington C\=US` になります。

## 証明書ポリシー変数を使用したポリシーの例
<a name="example-attributes-policy"></a>

次のポリシードキュメントでは、証明書のシリアル番号に一致するクライアント ID を使用して接続し、`${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*` のパターンに一致するトピックに発行できます。

**重要**  
X.509 証明書に特定の証明書属性が含まれていないものの、対応する証明書ポリシー変数がポリシードキュメントで使用されている場合、ポリシー評価によって予期しない動作が発生する可能性があります。これは、欠落しているポリシー変数がポリシーステートメントで評価されないためです。例えば、`iot:Certificate.Subject.Organization` 属性を含まない証明書に次のポリシードキュメントをアタッチした場合、ポリシー評価中に `iot:Certificate.Subject.Organization` 証明書ポリシー変数は入力されません。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Certificate.SerialNumber}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*"
			]
		}
	]
}
```

[Null 条件演算子](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)を使用して、ポリシーの評価中にポリシーで使用される証明書ポリシー変数が入力されるようにすることもできます。次のポリシードキュメントでは、証明書のシリアル番号と証明書のサブジェクトの共通名属性が存在する場合にのみ、証明書で `iot:Connect` を許可します。

すべての証明書ポリシー変数には文字列値があるため、すべての[文字列条件演算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)がサポートされます。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/*"
			],
			"Condition": {
				"Null": {
					"iot:Certificate.SerialNumber": "false",
					"iot:Certificate.Subject.CommonName": "false"
				}
			}
		}
	]
}
```

# サービス間での不分別な代理処理の防止
<a name="cross-service-confused-deputy-prevention"></a>

*「混乱した代理」問題*は、アクションを実行するためのアクセス許可を持たないエンティティが、より特権のあるエンティティにアクションの実行を強制できてしまう場合に生じる、セキュリティ上の問題です。では AWS、サービス間のなりすましにより、混乱した代理問題が発生する可能性があります。サービス間でのなりすましは、あるサービス (*呼び出し元サービス*) が、別のサービス (*呼び出し対象サービス*) を呼び出すときに発生する可能性があります。呼び出し元サービスが操作され、それ自身のアクセス許可を使用して、本来アクセス許可が付与されるべきではない方法で別の顧客のリソースに対して働きかけることがあります。これを防ぐため、 AWS では、アカウント内のリソースへのアクセス許可が付与されたサービスプリンシパルですべてのサービスのデータを保護するために役立つツールを提供しています。

が別のサービス AWS IoT に付与するアクセス許可をリソースに制限するには、リソースポリシーで [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)および [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) グローバル条件コンテキストキーを使用することをお勧めします。両方のグローバル条件コンテキストキーを同じポリシーステートメントで使用する場合は、`aws:SourceAccount` 値と、`aws:SourceArn` 値に含まれるアカウントが、同じアカウント ID を示している必要があります。

「混乱した代理」問題から保護するための最も効果的な方法は、リソースの完全なAmazon リソースネーム (ARN)を指定しながら、グローバル条件コンテキストキー `aws:SourceArn` を使用することです。の場合 AWS IoT、 `aws:SourceArn`はリソース固有のアクセス許可`arn:aws:iot:region:account-id:resource-type/resource-id`の場合は または の形式に従う必要があります`arn:aws:iot:region:account-id:*`。resource-id は、許可されたリソースの名前または ID、または許可されたリソース ID のワイルドカードステートメントにすることができます。*リージョン*がお客様の AWS IoT リージョンと一致し、*account-id* がお客様のアカウント ID と一致していることを確認します。

次の例は、 AWS IoT ロール信頼ポリシーで `aws:SourceArn`および `aws:SourceAccount` グローバル条件コンテキストキーを使用して、混乱した代理問題を防ぐ方法を示しています。その他の例については、「[混乱した代理の防止の詳細な例](#cross-service-confused-deputy-prevention-examples)」を参照してください。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:*"
        }
         }
      }
   ]
}
```

**注記**  
アクセス拒否エラーが発生した場合は、 AWS Security Token Service (STS) とのサービス統合が `aws:SourceArn` および `aws:SourceAccount` コンテキストキーをサポートしていない可能性があります。

## 混乱した代理の防止の詳細な例
<a name="cross-service-confused-deputy-prevention-examples"></a>

**このセクションでは、 AWS IoT ロール信頼ポリシーで `aws:SourceArn`および `aws:SourceAccount` グローバル条件コンテキストキーを使用して、混乱した代理問題を防ぐ方法の詳細な例を示します。**
+ [フリートプロビジョニング](#cross-service-confused-deputy-prevention-fleet-provision)
+ [JITP](#cross-service-confused-deputy-prevention-JITP)
+ [認証情報プロバイダー](#cross-service-confused-deputy-prevention-credential-provider)

### フリートプロビジョニング
<a name="cross-service-confused-deputy-prevention-fleet-provision"></a>

プロビジョニングテンプレートリソースを使用して[フリートプロビジョニング](https://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html)を設定できます。プロビジョニングテンプレートがプロビジョニングロールを参照する場合、そのロールの信頼ポリシーに `aws:SourceArn`および `aws:SourceAccount` 条件キーを含めることができます。これらのキーは、設定が `sts:AssumeRole` リクエストを呼び出すことができるリソースを制限します。

次の信頼ポリシーを持つロールは、`SourceArn` で指定されたプロビジョニングテンプレートの IoT プリンシパル (`iot.amazonaws.com`) によってのみ引き受けることができます。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:provisioningtemplate/example_template"
        }
         }
      }
   ]
}
```

### JITP
<a name="cross-service-confused-deputy-prevention-JITP"></a>

[ジャストインタイムプロビジョニング (JITP)](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html) では、プロビジョニングテンプレートを CA とは別のリソースとして使用することも、テンプレート本文とロールを CA 証明書設定の一部として定義することもできます。 AWS IoT ロール信頼ポリシー`aws:SourceArn`の の値は、プロビジョニングテンプレートの定義方法によって異なります。

#### プロビジョニングテンプレートを別のリソースとして定義する
<a name="cross-service-confused-deputy-prevention-JITP-template"></a>

プロビジョニングテンプレートを別のリソースとして定義した場合、`aws:SourceArn` の値は `"arn:aws:iot:region:account-id:provisioningtemplate/example_template"` になります。[フリートプロビジョニング](#cross-service-confused-deputy-prevention-fleet-provision) では同じポリシーの例を利用できます。

#### CA 証明書でのプロビジョニングテンプレートの定義
<a name="cross-service-confused-deputy-prevention-JITP-CA"></a>

CA 証明書リソース内でプロビジョニングテンプレートを定義した場合、`aws:SourceArn` の値は `"arn:aws:iot:region:account-id:cacert/cert_id"` または `"arn:aws:iot:region:account-id:cacert/*"` になります。CA 証明書の ID などのリソース識別子が作成時に不明な場合は、ワイルドカードを使用できます。

次の信頼ポリシーを持つロールは、`SourceArn` で指定された CA 証明書の IoT プリンシパル (`iot.amazonaws.com`) によってのみ引き受けることができます。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:cacert/8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
        }
         }
      }
   ]
}
```

CA 証明書を作成するときは、登録設定でプロビジョニングロールを参照できます。プロビジョニングロールの信頼ポリシーは、ロールを引き受けることができるリソースを制限するために `aws:SourceArn` を使用できます。ただし、CA 証明書を登録するための最初の [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) 呼び出し中に、`aws:SourceArn` 条件に指定する CA 証明書の ARN はありません。

これを回避するには、つまり、 に登録されている特定の CA 証明書にプロビジョニングロールの信頼ポリシーを指定するには AWS IoT Core、以下を実行します。
+ まず、`RegistrationConfig` パラメータを指定せずに [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) を呼び出します。
+ CA 証明書が に登録されたら AWS IoT Core、その証明書で [UpdateCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html) を呼び出します。

  UpdateCACertificate 呼び出しで、新しく登録された CA 証明書の ARN に `aws:SourceArn` が設定されたプロビジョニングロール信頼ポリシーを含む `RegistrationConfig` を指定します。

### 認証情報プロバイダー
<a name="cross-service-confused-deputy-prevention-credential-provider"></a>

[AWS IoT Core 認証情報プロバイダー](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)の場合、 でロールエイリアスを作成する AWS アカウント のと同じ を使用し`aws:SourceAccount`、 でロールエイリアスリソースタイプのリソース ARN に一致するステートメントを指定します`aws:SourceArn`。 AWS IoT Core 認証情報プロバイダーで使用する IAM ロールを作成するときは、ロールを引き受ける必要があるロールエイリアスの ARNs を `aws:SourceArn`条件に含めて、クロスサービス`sts:AssumeRole`リクエストを承認する必要があります。

次の信頼ポリシーを持つロールは、 `SourceArn`で指定された roleAlias の AWS IoT Core 認証情報プロバイダー (`credentials.iot.amazonaws.com`) のプリンシパルのみが引き受けることができます。プリンシパルが `aws:SourceArn` 条件に指定されている以外のロールエイリアスの認証情報を取得しようとすると、その他のロールエイリアスが同じ IAM ロールを参照している場合でも、リクエストは拒否されます。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "credentials.iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:iot:us-east-1:123456789012:rolealias/example_rolealias"
        }
      }
    }
  ]
}
```

# AWS IoT Core ポリシーの例
<a name="example-iot-policies"></a>

このセクションのポリシーの例は、 AWS IoT Coreで一般的なタスクを完了するために使われるポリシードキュメントを説明しています。ソリューションのポリシーを作成している際、開始時の例としてそれらが使用できます。<a name="example-iot-policies-elements"></a>

このセクションの例では、次のポリシー要素が使用されています。
+ [AWS IoT Core ポリシーアクション](iot-policy-actions.md)
+ [AWS IoT Core アクションリソース](iot-action-resources.md)
+ [AWS IoT アイデンティティベースのポリシーの例](security_iam_id-based-policy-examples.md)
+ [基本的な AWS IoT Core ポリシー変数](basic-policy-variables.md)
+ [X.509 証明書 AWS IoT Core ポリシー変数](cert-policy-variables.md)

**Topics**
+ [接続ポリシーの例](connect-policy.md)
+ [パブリッシュ/サブスクライブポリシーの例](pub-sub-policy.md)
+ [接続および公開ポリシーの例](connect-and-pub.md)
+ [保持されたメッセージポリシーの例](retained-message-policy-examples.md)
+ [証明書のポリシーの例](certificate-policy-examples.md)
+ [モノのポリシーの例](thing-policy-examples.md)
+ [基本的なジョブポリシーの例](basic-jobs-example.md)

# 接続ポリシーの例
<a name="connect-policy"></a>

次のポリシーは、クライアント IDs `client1`と への接続許可を拒否`client2`し AWS IoT Core、デバイスがクライアント ID を使用して接続できるようにします。クライアント ID は、 AWS IoT Core レジストリに登録され、接続に使用されるプリンシパルにアタッチされているモノの名前と一致します。

**注記**  
登録済みデバイスの場合、`Connect` アクションには[モノのポリシー変数](thing-policy-variables.md)を使用し、接続に使用されるプリンシパルにモノをアタッチすることをおすすめします。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1",
				"arn:aws:iot:us-east-1:123456789012:client/client2"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		}
	]
}
```

次のポリシーは、クライアント ID AWS IoT Core を使用して に接続するアクセス許可を付与します`client1`。このポリシーの例は、未登録のデバイス向けです。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1"
			]
		}
	]
}
```

## MQTT 永続セッションポリシーの例
<a name="persistent-sessions-examples"></a>

`connectAttributes` を使用すると、`PersistentConnect` や `LastWill` などの IAM ポリシーの接続メッセージで使用する属性を指定できます。詳細については、「[connectAttributes の使用](mqtt.md#connect-attribute)」を参照してください。

次のポリシーは、`PersistentConnect` 機能との接続を許可します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

次のポリシーでは `PersistentConnect` は許可されていませんが、他の機能は許可されています。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringNotEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

上記のポリシーは、`StringEquals` を使用して表現することもできます。新機能を含む他の機能はすべて許可されます。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

次のポリシーは、`PersistentConnect` と `LastWill` の両方による接続を許可します。その他の新機能は許可されません。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		}
	]
}
```

次のポリシーは、`LastWill` の有無にかかわらず、クライアントによるクリーン接続を許可します。他の機能は許可されません。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "iot:Connect"
        ],
        "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
        "Condition": {
            "StringEquals": {
                "iot:ConnectAttributes": "LastWill"
        }
        }
    }]
}
```

次のポリシーは、デフォルト機能を使用した接続のみを許可します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

次のポリシーでは、`PersistentConnect` を使用した接続のみが許可されます。接続が `PersistentConnect` を使用する限り、新しい機能はすべて許可されます。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

次のポリシーでは、接続には `PersistentConnect` と `LastWill` の両方の使用が必要であり、新機能は許可されないことが示されています。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

次のポリシーには、`PersistentConnect` を含めることはできませんが、`LastWill` を含めることはできます。その他の新機能は許可されません。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "iot:ConnectAttributes": [
                        "LastWill"
                    ]
            }
        }
        }
    ]
}
```

次のポリシーは、トピック `"my/lastwill/topicName"` と一緒に`LastWill` を持つクライアントによる接続のみを許可します。`LastWill` トピックを使用する限り、すべての機能が許可されます。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        }
    ]
}
```

次のポリシーは、特定の `LastWillTopic` を使用したクリーン接続のみを許可します。`LastWillTopic` を使用する限り、すべての機能が許可されます。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

# パブリッシュ/サブスクライブポリシーの例
<a name="pub-sub-policy"></a>

使用するポリシーは、接続方法によって異なります AWS IoT Core。MQTT クライアント、HTTP、または WebSocket AWS IoT Core を使用して に接続できます。MQTT クライアントを使用して接続すると、X.509 証明書で認証されます。HTTP または WebSocket プロトコルを使用して接続すると、署名バージョン 4 および Amazon Cognito で認証されます。

**注記**  
登録済みデバイスの場合、`Connect` アクションには[モノのポリシー変数](thing-policy-variables.md)を使用し、接続に使用されるプリンシパルにモノをアタッチすることをおすすめします。

**Topics**
+ [MQTT および AWS IoT Core ポリシーでのワイルドカード文字の使用](#pub-sub-policy-cert)
+ [特定のトピックとの間でメッセージを発行、サブスクライブ、および受信するためのポリシー](#pub-sub-specific-topic)
+ [特定のプレフィックスを持つトピックとの間でメッセージを発行、サブスクライブ、および受信するためのポリシー](#pub-sub-policy-specific-topic-prefix)
+ [各デバイスに固有のトピックの間でメッセージを発行、サブスクライブ、および受信するためのポリシー](#pub-sub-specific-topic-device)
+ [トピック名にモノ属性を含むトピックとの間でのメッセージの発行、サブスクライブ、受信に関するポリシー](#pub-sub-topic-attribute)
+ [トピック名のサブトピックへのメッセージの発行を拒否するポリシー](#pub-sub-deny-publish)
+ [トピック名のサブトピックからのメッセージの受信を拒否するポリシー](#pub-sub-deny-receive)
+ [MQTT ワイルドカード文字を使用してトピックにサブスクライブするポリシー](#pub-sub-topic-wildcard)
+ [HTTP および WebSocket クライアントのポリシー](#pub-sub-policy-cognito)

## MQTT および AWS IoT Core ポリシーでのワイルドカード文字の使用
<a name="pub-sub-policy-cert"></a>

MQTT ポリシーと AWS IoT Core ポリシーではワイルドカード文字が異なるため、慎重に検討した上で選択する必要があります。MQTT では、ワイルドカード文字 `+`と `#`が [MQTT トピックフィルター](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html#topicfilters)で使用され、複数のトピック名をサブスクライブします。 AWS IoT Core ポリシーは `*` と をワイルドカード文字`?`として使用し、[IAM ポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html#policies-grammar-json)の規則に従います。ポリシードキュメントでは、`*` は任意の文字の組み合わせを表し、疑問符 `?` は任意の 1 文字を表します。ポリシードキュメントでは、MQTT ワイルドカード文字である `+` と `#` は、特別な意味を持たないこれらの文字として扱われます。ポリシーの `resource` 属性に複数のトピック名とトピックフィルターを記述するには、MQTT ワイルドカード文字の代わりに `*` と `?` ワイルドカード文字を使用します。

ポリシードキュメントで使用するワイルドカード文字を選択するとき、`*` 文字は、単一のトピックレベルに限定されないことを考慮してください。`+` 文字は、MQTT トピックフィルターの 1 つのトピックレベルに制限されます。ワイルドカードの仕様を単一の MQTT トピックフィルターレベルに制約するには、複数の `?` 文字の使用を検討してください。ポリシーリソースでのワイルドカード文字の使用、およびワイルドカード文字が一致するその他の例については、「[リソース ARN でのワイルドカードの使用](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_resource.html#reference_policies_elements_resource_wildcards)」を参照してください。

次の表は、MQTT で使用されるさまざまなワイルドカード文字と MQTT クライアントの AWS IoT Core ポリシーを示しています。


| ワイルドカード文字 | MQTT のワイルドカード文字 | MQTT での例 |  AWS IoT Core ポリシーのワイルドカード文字 | MQTT クライアントの AWS IoT Core ポリシーの例 | 
| --- | --- | --- | --- | --- | 
| \$1 | はい | some/\$1 | いいえ | 該当なし | 
| \$1 | はい | some/\$1/topic | いいえ | 該当なし | 
| \$1 | いいえ | 該当なし | はい | `topicfilter/some/*/topic` `topicfilter/some/sensor*/topic`  | 
| ? | いいえ | 該当なし | はい |  `topic/some/?????/topic` `topicfilter/some/sensor???/topic`  | 

## 特定のトピックとの間でメッセージを発行、サブスクライブ、および受信するためのポリシー
<a name="pub-sub-specific-topic"></a>

以下に、登録済みデバイスと未登録デバイスで、「some\$1speciic\$1topic」という名前のトピックとの間でメッセージを発行、サブスクライブ、受信する例を示します。例では、`Publish` と `Receive` がリソースとして「トピック」を使用し、`Subscribe` がリソースとして「トピックフィルター」を使用することも強調しています。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。また、「some\$1specific\$1topic」という名前のトピックに対する `Publish`、`Subscribe`、および `Receive` のアクセス許可も提供します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーにより、デバイスは clientId1, clientId2または clientId3 のいずれかを使用して接続できます。また、「some\$1specific\$1topic」という名前のトピックに対する `Publish`、`Subscribe`、および `Receive` のアクセス許可も提供します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        }
    ]
}
```

------

## 特定のプレフィックスを持つトピックとの間でメッセージを発行、サブスクライブ、および受信するためのポリシー
<a name="pub-sub-policy-specific-topic-prefix"></a>

以下に、登録済みデバイスと未登録デバイスで、「topic\$1prefix」というプレフィックスが付いたトピックとの間でメッセージを発行、サブスクライブ、受信する例を示します。

**注記**  
この例では、ワイルドカード文字 `*` を使用することに注意してください。`*` は、1 つのステートメントで複数のトピック名にアクセス許可を与えるのに便利ですが、必要以上の権限をデバイスに与えると、意図しない結果につながる可能性があります。そのため、慎重に検討したうえで、ワイルドカード文字 `*` のみを使用することをお勧めします。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。また、「some\$1specific\$1topic」というプレフィックスが付いたトピックに対する `Publish`、`Subscribe`、および `Receive` のアクセス許可も提供します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーにより、デバイスは clientId1, clientId2または clientId3 のいずれかを使用して接続できます。また、「some\$1specific\$1topic」というプレフィックスが付いたトピックに対する `Publish`、`Subscribe`、および `Receive` のアクセス許可も提供します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish",
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
            ]
        }
    ]
}
```

------

## 各デバイスに固有のトピックの間でメッセージを発行、サブスクライブ、および受信するためのポリシー
<a name="pub-sub-specific-topic-device"></a>

以下は、登録済みデバイスと未登録デバイスで、特定のデバイスに固有のトピックとの間でメッセージの発行、サブスクライブ、および受信を行う例を示しています。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。これにより、モノ固有のトピック (`sensor/device/${iot:Connection.Thing.ThingName}`) への発行、モノ固有のトピック (`command/device/${iot:Connection.Thing.ThingName}`) との間でサブスクライブおよび受信を行う許可が提供されます。レジストリ内のモノの名前が「thing1」の場合、デバイスは「sensor/device/thing1」トピックに発行できます。また、デバイスは「command/device/thing1」トピックにサブスクライブして受信することもできます。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーにより、デバイスは clientId1, clientId2または clientId3 のいずれかを使用して接続できます。これにより、クライアント固有のトピック (`sensor/device/${iot:ClientId}`) への発行、クライアント固有のトピック (`command/device/${iot:ClientId}`) との間でサブスクライブおよび受信を行う許可が提供されます。デバイスが clientId1 として clientId で接続すると、トピック「sensor/device/clientId1」に発行できるようになります。デバイスは、トピック `device/clientId1/command` にサブスクライブして から受信することもできます。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

------

## トピック名にモノ属性を含むトピックとの間でのメッセージの発行、サブスクライブ、受信に関するポリシー
<a name="pub-sub-topic-attribute"></a>

以下に、登録済みデバイスが、名前にモノの属性を含むトピックとの間でメッセージを発行、サブスクライブ、受信する例を示します。

**注記**  
モノの属性は、 AWS IoT Core レジストリに登録されているデバイスにのみ存在します。未登録のデバイスに対応する例はありません。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。これにより、トピック (`sensor/${iot:Connection.Thing.Attributes[version]}`) への発行、トピック (`command/${iot:Connection.Thing.Attributes[location]}`) との間でのサブスクライブと受信を許可します。トピック名にはモノの属性が含まれます。レジストリ内のモノの名前に `version=v1` と `location=Seattle` がある場合、デバイスはトピック「sensor/v1」に発行し、トピック「command/Seattle」との間でサブスクライブして受信することができます。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/${iot:Connection.Thing.Attributes[version]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/${iot:Connection.Thing.Attributes[location]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/${iot:Connection.Thing.Attributes[location]}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

モノの属性は AWS IoT Core のレジストリに登録されているデバイスにしか存在しないため、未登録のモノに対応する例はありません。

------

## トピック名のサブトピックへのメッセージの発行を拒否するポリシー
<a name="pub-sub-deny-publish"></a>

以下は、登録済みデバイスと未登録デバイスで、特定のサブトピックを除くすべてのトピックにメッセージを発行する例を示しています。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。「department/」というプレフィックスが付いているすべてのトピックには発行できますが、「department/admins」サブトピックには発行できません。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/*"
			]
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/admins"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーにより、デバイスは clientId1, clientId2または clientId3 のいずれかを使用して接続できます。「department/」というプレフィックスが付いているすべてのトピックには発行できますが、「department/admins」サブトピックには発行できません。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/admins"
            ]
        }
    ]
}
```

------

## トピック名のサブトピックからのメッセージの受信を拒否するポリシー
<a name="pub-sub-deny-receive"></a>

以下に、登録済みデバイスと未登録デバイスで、特定のサブトピックを除く特定のプレフィックスを持つトピックをサブスクライブしたり、トピックからメッセージを受信したりする例を示します。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。このポリシーにより、デバイスは「topic\$1prefix」というプレフィックスが付いた任意のトピックをサブスクライブできます。`iot:Receive` のステートメントで `NotResource` を使用すると、「topic\$1prefix/restricted」というプレフィックスが付いたトピックを除いて、デバイスがサブスクライブしているすべてのトピックからのメッセージをデバイスが受信できるようになります。例えば、このポリシーでは、デバイスは「topic\$1prefix/topic1」や「topic\$1prefix/restricted」をサブスクライブできますが、トピック「topic\$1prefix/topic1」からのメッセージのみを受信し、トピック「topic\$1prefix/restricted」からのメッセージは受信しません。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーにより、デバイスは clientId1, clientId2または clientId3 のいずれかを使用して接続できます。このポリシーにより、デバイスは「topic\$1prefix」というプレフィックスが付いた任意のトピックをサブスクライブできます。`iot:Receive` のステートメントで `NotResource` を使用すると、「topic\$1prefix/restricted」というプレフィックスが付いたトピックを除いて、デバイスがサブスクライブしているすべてのトピックからのメッセージをデバイスが受信できるようになります。例えば、このポリシーでは、デバイスは「topic\$1prefix/topic1」と「topic\$1prefix/restricted」をサブスクライブできます。ただし、トピック「topic\$1prefix/topic1」からのメッセージのみを受信し、トピック「topic\$1prefix/restricted」からのメッセージは受信しません。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
        }
    ]
}
```

------

## MQTT ワイルドカード文字を使用してトピックにサブスクライブするポリシー
<a name="pub-sub-topic-wildcard"></a>

MQTT ワイルドカード文字 \$1 と \$1 はリテラル文字列として扱われますが、 AWS IoT Core ポリシーで使用するとワイルドカードとして扱われません。MQTT では、\$1 と \$1 はトピックフィルターに登録する場合にのみワイルドカードとして扱われ、それ以外のコンテキストではリテラル文字列として扱われます。これらの MQTT ワイルドカードは、慎重に検討した後、 AWS IoT Core ポリシーの一部としてのみ使用することをお勧めします。

 AWS IoT Core ポリシーで MQTT ワイルドカードを使用する登録済みおよび未登録のモノの例を次に示します。これらのワイルドカードはリテラル文字列として扱われます。

------
#### [ Registered devices ]

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスはレジストリ内のモノの名前と一致する clientId に接続できます。このポリシーにより、デバイスは「department/\$1/employees」と「location/\$1」のトピックをサブスクライブできるようになります。\$1 と \$1 は、 AWS IoT Core ポリシーではリテラル文字列として扱われるため、デバイスは「department/\$1/employees」というトピックにはサブスクライブできますが、「department/engineering/employees」のトピックにはサブスクライブできません。同様に、デバイスはトピック「location/\$1」をサブスクライブできますが、「location/Seattle」というトピックには登録できません。ただし、デバイスが「department/\$1/employees」というトピックに登録すると、ポリシーにより、「department/engineering/employees」というトピックからのメッセージを受信できるようになります。同様に、デバイスが「location/\$1」というトピックをサブスクライブすると、「location/Seattle」というトピックからのメッセージも受信するようになります。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーにより、デバイスは clientId1, clientId2または clientId3 のいずれかを使用して接続できます。このポリシーにより、デバイスは「department/\$1/employees」と「location/\$1」のトピックをサブスクライブできるようになります。\$1 と \$1 は、 AWS IoT Core ポリシーではリテラル文字列として扱われるため、デバイスは「department/\$1/employees」というトピックにはサブスクライブできますが、「department/engineering/employees」のトピックにはサブスクライブできません。同様に、デバイスはトピック「ロケーション/\$1」をサブスクライブできますが、「ロケーション/シアトル」はサブスクライブできません。ただし、デバイスが「department/\$1/employees」というトピックに登録すると、ポリシーにより、「department/engineering/employees」というトピックからのメッセージを受信できるようになります。同様に、デバイスが「location/\$1」というトピックをサブスクライブすると、「location/Seattle」というトピックからのメッセージも受信するようになります。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
        }
    ]
}
```

------

## HTTP および WebSocket クライアントのポリシー
<a name="pub-sub-policy-cognito"></a>

HTTP または WebSocket プロトコルを使用して接続すると、署名バージョン 4 および Amazon Cognito で認証されます。Amazon Cognito ID は、認証されている場合と認証されていない場合があります。認証された ID は任意のサポートされている認証プロバイダーで認証されたユーザーに属します。認証されていない ID は、通常、ID プロバイダーで認証しないゲストユーザーに属します。Amazon Cognito は、認証されていない ID をサポートするために一意の識別子と AWS 認証情報を提供します。詳細については、「[Amazon Cognito ID を使用した承認](cog-iot-policies.md)」を参照してください。

以下のオペレーションでは、 `AttachPolicy` API を介して Amazon Cognito ID にアタッチされた AWS IoT Core ポリシー AWS IoT Core を使用します。これにより、認証された ID を持つ Amazon Cognito アイデンティティプールにアタッチされたアクセス許可がスコープダウンされます。
+ `iot:Connect`
+ `iot:Publish`
+ `iot:Subscribe`
+ `iot:Receive`
+ `iot:GetThingShadow`
+ `iot:UpdateThingShadow`
+ `iot:DeleteThingShadow`

つまり、Amazon Cognito ID には IAM ロールポリシーと AWS IoT Core ポリシーからのアクセス許可が必要です。API を使用して、IAM ロールポリシーをプールにアタッチし、 AWS IoT Core ポリシーを Amazon Cognito ID にアタッチします AWS IoT Core `AttachPolicy`。

認証されたユーザーと未認証のユーザーは、異なる ID タイプです。 AWS IoT ポリシーを Amazon Cognito ID にアタッチしない場合、認証されたユーザーが AWS IoT での認可に失敗し、 AWS IoT リソースとアクションにアクセスできません。

**注記**  
他の AWS IoT Core オペレーションや認証されていない ID の場合、 AWS IoT Core は Amazon Cognito ID プールロールにアタッチされたアクセス許可の範囲を絞り込みません。認証済みの ID と非認証の ID の両方に対して、これは、Amazon Cognito プールのロールにアタッチすることをお勧めする最も緩いポリシーです。

**HTTP**

非認証の Amazon Cognito ID が Amazon Cognito ID に固有のトピックで HTTP を介してメッセージを発行できるようにするには、Amazon Cognito ID プールロールに以下の IAM ポリシーをアタッチします。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"
            ]
        }
    ]
}
```

認証されたユーザーを許可するには、 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API を使用して、前述のポリシーを Amazon Cognito ID プールロールと Amazon Cognito ID にアタッチします。

**注記**  
Amazon Cognito ID を承認する場合、 は両方のポリシー AWS IoT Core を検討し、指定された最小限の権限を付与します。アクションは、両方のポリシーで要求されたアクションが許可されている場合にのみ許可されます。いずれかのポリシーでアクションが許可されていない場合、そのアクションは許可されません。

**MQTT**

非認証の Amazon Cognito ID がアカウントで Amazon Cognito ID に固有のトピックで WebSockets を介して MQTT メッセージをパブリッシュできるようにするには、Amazon Cognito ID プールロールに以下の IAM ポリシーをアタッチします。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${cognito-identity.amazonaws.com:sub}"]
        }
    ]
}
```

認証されたユーザーを許可するには、 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API を使用して、前述のポリシーを Amazon Cognito ID プールロールと Amazon Cognito ID にアタッチします。

**注記**  
Amazon Cognito ID を承認するときは、 と の両方 AWS IoT Core を考慮し、指定された最小限の権限を付与します。アクションは、両方のポリシーで要求されたアクションが許可されている場合にのみ許可されます。いずれかのポリシーでアクションが許可されていない場合、そのアクションは許可されません。

# 接続および公開ポリシーの例
<a name="connect-and-pub"></a>

 AWS IoT Core レジストリでモノとして登録されたデバイスの場合、次のポリシーは、モノの名前に一致するクライアント ID AWS IoT Core を使用して に接続するアクセス許可を付与し、デバイスをクライアント ID またはモノの名前固有の MQTT トピックへの発行に制限します。接続を成功させるには、モノの名前を AWS IoT Core レジストリに登録し、モノにアタッチされた ID またはプリンシパルを使用して認証する必要があります。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
      ]
    }
  ]
}
```

 AWS IoT Core レジストリにモノとして登録されていないデバイスの場合、次のポリシーはクライアント ID AWS IoT Core を使用して に接続するアクセス許可を付与`client1`し、デバイスを clientID 固有の MQTT トピックでの発行に制限します。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/client1"
      ]
    }
  ]
}
```

# 保持されたメッセージポリシーの例
<a name="retained-message-policy-examples"></a>

[保持されているメッセージ](mqtt.md#mqtt-retain)の使用には、特定のポリシーが必要です。保持メッセージは、RETAIN フラグを設定して発行され、 によって保存される MQTT メッセージです AWS IoT Core。このセクションでは、保持されたメッセージの一般的な使用を許可するポリシーの例を紹介します。

**Topics**
+ [保持されたメッセージを接続して発行するためのポリシー](#retained-message-policy-examples-publish)
+ [保持された Will メッセージを接続して発行するためのポリシー](#retained-message-policy-examples-publish-lwt)
+ [保持されたメッセージを一覧表示して取得するためのポリシー](#retained-message-policy-examples-list-get)

## 保持されたメッセージを接続して発行するためのポリシー
<a name="retained-message-policy-examples-publish"></a>

デバイスが保持されたメッセージを発行するには、デバイスが、接続、発行 (任意のMQTTメッセージ)、そして保持されたMQTTメッセージを発行できる必要があります。次のポリシーにより、トピックに対するアクセス権限が付与されます。クライアント**device1**に`device/sample/configuration`。接続のアクセス許可を付与する別の例については、[接続および公開ポリシーの例](connect-and-pub.md)を参照。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/device/sample/configuration"
			]
		}
	]
}
```

## 保持された Will メッセージを接続して発行するためのポリシー
<a name="retained-message-policy-examples-publish-lwt"></a>

クライアントは、クライアント AWS IoT Core が予期せず切断したときに発行するメッセージを設定できます。MQTT はこのようなメッセージを[*ウィル*メッセージ](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Will_Flag)と呼びます。それらを包括するために、クライアントは、接続許可に追加して追加条件を持つ必要があります。

次のポリシードキュメントは、 AWS IoT Core も保持するであろうトピック`will`により明確になった Will メッセージに接続発行する権限をすべてのクライアントに付与します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			],
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/will"
			]
		}
	]
}
```

## 保持されたメッセージを一覧表示して取得するためのポリシー
<a name="retained-message-policy-examples-list-get"></a>

サービスとアプリケーションは、MQTT クライアントをサポートしなくても、[https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html)および[https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html)を呼び出す事によって保持されたメッセージにアクセスする事ができます。これらのアクションを呼び出すサービスとアプリケーションは、次の例のようなポリシーを使用して認証される必要があります。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:ListRetainedMessages"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/device1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetRetainedMessage"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/foo"
            ]
        }
    ]
}
```

# 証明書のポリシーの例
<a name="certificate-policy-examples"></a>

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーは、モノの名前に一致するクライアント ID AWS IoT Core で に接続し、デバイスが自身を認証するために使用した証明書`certificateId`の と名前が等しいトピックに発行するアクセス許可を付与します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーは、クライアント IDs、、`client3`および AWS IoT Core を使用して に接続し`client1``client2`、デバイスが自身を認証するために使用した証明書`certificateId`の と名前が等しいトピックに発行するアクセス許可を付与します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーは、モノの名前に一致するクライアント ID AWS IoT Core で に接続し、デバイスが自身を認証するために使用した証明書のサブジェクト`CommonName`フィールドと名前が等しいトピックに発行するアクセス許可を付与します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

**注記**  
この例では、証明書のサブジェクト共通名が、サブジェクト共通名が登録された各証明書に対して一意であることを前提にして、トピック ID として使用されます。複数のデバイス間で証明書が共有されている場合、サブジェクト共通名は、その証明書を共有するすべてのデバイスで同じになります。したがって、複数のデバイスの同じトピックに発行する権限が許可されます (推奨されません)。

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーは、クライアント IDs、、`client3`および `client1` AWS IoT Core を使用して に接続し`client2`、デバイスが自身を認証するために使用した証明書のサブジェクト`CommonName`フィールドと名前が等しいトピックに発行するアクセス許可を付与します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

**注記**  
この例では、証明書のサブジェクト共通名が、サブジェクト共通名が登録された各証明書に対して一意であることを前提にして、トピック ID として使用されます。複数のデバイス間で証明書が共有されている場合、サブジェクト共通名は、その証明書を共有するすべてのデバイスで同じになります。したがって、複数のデバイスの同じトピックに発行する権限が許可されます (推奨されません)。

 AWS IoT Core レジストリに登録されたデバイスの場合、次のポリシーは、モノの名前に一致するクライアント ID AWS IoT Core で に接続し、デバイスの認証に使用される証明書の`Subject.CommonName.2`フィールドが に設定されている場合`admin/`、名前のプレフィックスが であるトピックに発行するアクセス許可を付与します`Administrator`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーは、クライアント IDs `client1`、、`client3`および AWS IoT Core を使用して に接続し`client2`、デバイスの認証に使用される証明書の `Subject.CommonName.2`フィールドが に設定されている`admin/`ときに、名前のプレフィックスが であるトピックに発行するアクセス許可を付与します`Administrator`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーにより、デバイスがモノの名前を使用して、デバイスの認証に使用される証明書の`Subject.CommonName`フィールドのいずれかが に設定されている`ThingName`場合に、 `admin/`が続く特定のトピックに発行できます`Administrator`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/${iot:Connection.Thing.ThingName}"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーは、デバイスの認証に使用される証明書の`Subject.CommonName`フィールドのいずれかが に設定されている`admin`場合に、クライアント IDs `client1`、`client2`、`client3`および AWS IoT Core で に接続してトピックに発行するアクセス許可を付与します`Administrator`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

# モノのポリシーの例
<a name="thing-policy-examples"></a>

次のポリシーでは、 で認証に使用される証明書 AWS IoT Core が、ポリシーが評価されているモノにアタッチされている場合、デバイスが接続することを許可します。

****  

```
{  
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {  
            "Effect":"Allow",
            "Action":["iot:Connect"],
            "Resource":[ "*" ],
            "Condition": {
                "Bool": {
                    "iot:Connection.Thing.IsAttached": ["true"]
            }
        }
        }
    ]
}
```

以下のポリシーでは、証明書が特定のモノのタイプを持つモノにアタッチされ、そのモノが値 `attributeValue` を持つ `attributeName` の属性を持つ場合、デバイスの公開を許可します。モノのポリシー変数の詳細については、[[Thing policy variables]](thing-policy-variables.md) (モノのポリシー変数) を参照してください。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/device/stats",
      "Condition": {
        "StringEquals": {
          "iot:Connection.Thing.Attributes[attributeName]": "attributeValue",
          "iot:Connection.Thing.ThingTypeName": "Thing_Type_Name"
        },
        "Bool": {
          "iot:Connection.Thing.IsAttached": "true"
        }
      }
    }
  ]
}
```

次のポリシーでは、デバイスはモノの属性で始まるトピックにパブリッシュすることができます。デバイス証明書がモノに関連付けられていない場合、この変数は解決されず、アクセス拒否エラーが発生します。モノのポリシー変数の詳細については、[[Thing policy variables]](thing-policy-variables.md) (モノのポリシー変数) を参照してください。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.Attributes[attributeName]}/*"
    }
  ]
}
```

# 基本的なジョブポリシーの例
<a name="basic-jobs-example"></a>

このサンプルでは、単一のデバイスであるジョブターゲットがジョブリクエストを受信し、ジョブ実行ステータスを AWS IoTと通信するために必要なポリシーステートメントについて説明します。

*us-west-2:57EXAMPLE833* を AWS リージョン、コロン文字 (:)、12 桁の AWS アカウント 数字に置き換え、*uniqueThingName* をデバイスを表すモノのリソースの名前に置き換えます AWS IoT。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iotjobsdata:DescribeJobExecution",
                "iotjobsdata:GetPendingJobExecutions",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
            ]
        }
    ]
}
```

# Amazon Cognito ID を使用した承認
<a name="cog-iot-policies"></a>

Amazon Cognito ID には、未認証と認証済みの 2 種類あります。アプリが認証されていない Amazon Cognito ID をサポートしている場合、認証が実行されないため、ユーザーが誰であるかを知りません。

**認証されていない ID:** 認証されていない Amazon Cognito ID の場合、認証されていない ID プールに IAM ロールをアタッチしてアクセス許可を付与します。不明なユーザーが使用できるようにするそれらのリソースにのみアクセスを許可する必要があります。

**重要**  
認証されていない Amazon Cognito ユーザーが に接続する場合は AWS IoT Core、IAM ポリシーで非常に制限されたリソースへのアクセスを許可することをお勧めします。

**認証された ID:** 認証された Amazon Cognito ID には、2 つの場所でアクセス許可を指定する必要があります。
+ 認証された Amazon Cognito ID に IAM ポリシーをアタッチし、
+ Amazon Cognito ID (認証済みユーザー) に AWS IoT Core ポリシーをアタッチします。

## に接続する認証されていない Amazon Cognito ユーザーのポリシー例 AWS IoT Core
<a name="cog-iot-policies-auth-unauth-examples"></a>

次の例は、Amazon Cognito ID の IAM ポリシーと IoT ポリシーの両方におけるアクセス許可を示しています。認証されたユーザーは、デバイス固有のトピック (デバイス/DEVICE\$1ID/ステータスなど) に公開したいと考えています。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/Client_ID"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/device/Device_ID/status"
            ]
        }
    ]
}
```

次の例は、Amazon Cognito の認証されていないロールの IAM ポリシー内のアクセス許可を示しています。認証されていないユーザーは、認証を必要としない非デバイス固有のトピックに発行したいと考えています。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/non_device_specific_topic"
            ]
        }
    ]
}
```

## GitHub の例
<a name="cog-iot-policies-github"></a>

次の GitHub でのウェブアプリケーションの例は、認証されたユーザーへのポリシーの添付をユーザーのサインアップと認証プロセスに組み込む方法を示しています。
+ [AWS Amplify と を使用した MQTT パブリッシュ/サブスクライブ React ウェブアプリケーション AWS IoT Device SDK for JavaScript](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp)
+ [AWS Amplify、、 AWS IoT Device SDK for JavaScriptおよび Lambda 関数を使用した MQTT パブリッシュ/サブスクライブ React ウェブアプリケーション](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda)

Amplify は、 サービスと統合するウェブおよびモバイルアプリケーションの構築に役立つ一連のツールと AWS サービスです。Amplify の詳細については、[Amplify Framework Documentation](https://docs.amplify.aws/) を参照してください。

どちらの例でも、次の手順を実行します。

1. ユーザーがアカウントにサインアップすると、アプリケーションが Amazon Cognito ユーザープールおよび ID を作成します。

1. ユーザーが認証されると、アプリケーションがポリシーを作成し、ID にアタッチします。これにより、ユーザーは発行およびサブスクライブのアクセス許可を与えられます。

1. ユーザーは、アプリケーションを使用して MQTT トピックを発行およびサブスクライブできます。

最初の例では、認証オペレーション内で直接 `AttachPolicy` API オペレーションを使用します。次の例は、Amplify および AWS IoT Device SDK for JavaScriptを使用する React ウェブアプリケーション内に、この API コールを実装する方法を示しています。

```
function attachPolicy(id, policyName) {
    var Iot = new AWS.Iot({region: AWSConfiguration.region, apiVersion: AWSConfiguration.apiVersion, endpoint: AWSConfiguration.endpoint});
    var params = {policyName: policyName, target: id};

    console.log("Attach IoT Policy: " + policyName + " with cognito identity id: " + id);
    Iot.attachPolicy(params, function(err, data) {
         if (err) {
               if (err.code !== 'ResourceAlreadyExistsException') {
                  console.log(err);
               }
          }
         else  {
            console.log("Successfully attached policy with the identity", data);
         }
     });
}
```

このコードは、[AuthDisplay.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp/blob/d1c307b36357be934db9dda020140fa337709cd9/src/AuthDisplay.js#L45) ファイルに表示されます。

2 番目の例では、Lambda 関数に `AttachPolicy` API オペレーションを実装します。次の例は、Lambda がこの API コールを使用する方法を示しています。

```
iot.attachPolicy(params, function(err, data) {
     if (err) {
           if (err.code !== 'ResourceAlreadyExistsException') {
              console.log(err);
              res.json({error: err, url: req.url, body: req.body});
           }
      }
     else  {
        console.log(data);
        res.json({success: 'Create and attach policy call succeed!', url: req.url, body: req.body});
     }
 });
```

このコードは、[app.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda/blob/e493039581d2aff0faa3949086deead20a2c5385/amplify/backend/function/amplifyiotlambda/src/app.js#L50) ファイルの `iot.GetPolicy` 関数内に表示されます。

**注記**  
Amazon Cognito ID プールを介して取得した AWS 認証情報を使用して関数を呼び出すと、Lambda 関数のコンテキストオブジェクトに の値が含まれます`context.cognito_identity_id`。詳細については、以下を参照してください。  
[AWS Lambda Node.js のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html)
[AWS Lambda Python のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/python-context.html)
[AWS Lambda Ruby のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html)
[AWS Lambda Java のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/java-context.html)
[AWS Lambda Go のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/golang-context.html)
[AWS Lambda C\$1 のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/csharp-context.html)
[AWS Lambda PowerShell のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/powershell-context.html)

# 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/)」ブログ記事を参照してください。

# IAM を使用したクロスアカウントアクセス
<a name="cross-account-access"></a>

AWS IoT Core では、プリンシパルがプリンシパルが所有 AWS アカウント していない で定義されているトピックを発行またはサブスクライブできるようにします。IAM ポリシーと IAM ロールを作成し、そのポリシーをそのロールにアタッチすることで、クロスアカウントアクセスを設定します。

最初に、 AWS アカウントの他のユーザーと証明書に対して行うのと同様に、「[IAM ポリシーの作成](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_create.html)」の説明に従ってカスタマー管理 IAM ポリシーを作成します。

 AWS IoT Core レジストリに登録されているデバイスの場合、次のポリシーは、デバイスのモノの名前に一致するクライアント ID AWS IoT Core を使用して に接続するデバイスと、*モノの名前*がデバイスのモノの名前`my/topic/thing-name `である に発行するアクセス許可を付与します。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

 AWS IoT Core レジストリに登録されていないデバイスの場合、次のポリシーは、アカウントの (123456789012) AWS IoT Core レジストリに登録`client1`されているモノの名前を使用して、 に接続 AWS IoT Core し、 というプレフィックスが付いた名前のクライアント ID 固有のトピックに発行するアクセス許可をデバイスに付与します`my/topic/`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
            ]
        }
    ]
}
```

次に、「[IAM ユーザーにアクセス許可を委任するロールの作成](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)」のステップに従います。アクセスを共有する AWS アカウント のアカウント ID を入力します。最後に、作成したポリシーをロールにアタッチします。後で、アクセス許可を付与する AWS アカウント ID を変更する必要がある場合は、以下の信頼ポリシーの形式を使用できます。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::567890123456:user/MyUser"
        },
            "Action": "sts:AssumeRole"
        }
    ]
}
```