

# 認証された Cognito ロールの権限が過剰です
<a name="audit-chk-auth-cognito-role-permissive"></a>

認証済み Amazon Cognito ID プールロールにアタッチされたポリシーは、以下の AWS IoT アクションを実行できるアクセス許可が付与されるため、許可範囲が広過ぎるとみなされます。
+ モノを管理または変更する。
+ モノ以外に関連するデータやリソースを管理する。

または、さまざまなデバイスで以下の AWS IoT アクションを実行するアクセス許可が付与されるためです。
+ モノの管理データを読み取る。
+ MQTT を使用して予約済みトピック (シャドウまたはジョブ実行データを含む) に接続/発行/サブスクライブする。
+ API コマンドを使用してシャドウまたはジョブ実行データを読み取るか変更する。

一般に、認証済み Amazon Cognito ID プールロールを使用して接続するデバイスには、モノ固有の管理データを読み取る、モノ固有の MQTT トピックを発行/サブスクライブする、または API コマンドを使用してシャドウまたはジョブ実行データに関連するモノ固有のデータを読み取る/変更する限定されたアクセス許可のみ付与してください。

このチェックは、CLI および API で `AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK` として表示されます。

**重要度:** 非常事態

## Details
<a name="audit-chk-auth-cognito-role-permissive-details"></a>

このチェック項目の場合、AWS IoT Device Defender は、監査の実行前 31 日間に AWS IoT メッセージブローカーに接続するために使用されたすべての Amazon Cognito ID プールを監査します。接続先の認証済みまたは未認証 Amazon Cognito ID のすべての Amazon Cognito ID プールが監査に含められます。

このチェックにより不適合の認証済み Amazon Cognito ID プールロールが見つかった場合、次の理由コードが返されます。
+ ALLOWS\$1BROAD\$1ACCESS\$1TO\$1IOT\$1THING\$1ADMIN\$1READ\$1ACTIONS
+ ALLOWS\$1ACCESS\$1TO\$1IOT\$1NON\$1THING\$1ADMIN\$1ACTIONS
+ ALLOWS\$1ACCESS\$1TO\$1IOT\$1THING\$1ADMIN\$1WRITE\$1ACTIONS

## 重要な理由
<a name="audit-chk-auth-cognito-role-permissive-why-it-matters"></a>

認証されている ID が侵害された場合、管理アクションを使用して、アカウント設定の変更、リソースの削除、機密データへのアクセスを行う可能性があります。

## 修正方法
<a name="audit-chk-auth-cognito-role-permissive-how-to-fix"></a>

認証済みの Amazon Cognito ID プールロールにアタッチされたポリシーには、デバイスがそのジョブを実行するのに必要なアクセス許可のみ付与してください。次のステップを推奨します。

1. 新しい適合ロールを作成します。

1. Amazon Cognito ID プールを作成し、適合ロールをアタッチします。

1. ID が新しいプールを使用して AWS IoT にアクセスできることを確認します。

1. 検証が完了したら、不適合としてフラグが設定された Amazon Cognito ID プールにロールをアタッチします。

緩和アクションを使用して、以下を行うこともできます。
+ Amazon SNS メッセージに対する応答としてカスタムレスポンスを実装する場合は、`PUBLISH_FINDINGS_TO_SNS` 緩和アクションを適用します。

詳細については、「[緩和アクション](dd-mitigation-actions.md)」を参照してください。

## モノを管理または変更する
<a name="audit-chk-auth-cognito-role-permissive-manage-things"></a>

次の AWS IoT API アクションは、モノを管理または変更するために使用されるため、これらのアクションを実行するアクセス許可は、認証済みの Amazon Cognito ID プールを介して接続するデバイスには付与しないでください。
+ `AddThingToThingGroup` 
+ `AttachThingPrincipal` 
+ `CreateThing` 
+ `DeleteThing` 
+ `DetachThingPrincipal` 
+ `ListThings`
+ `ListThingsInThingGroup` 
+ `RegisterThing` 
+ `RemoveThingFromThingGroup` 
+ `UpdateThing` 
+ `UpdateThingGroupsForThing`

これらのアクションを実行するアクセス許可を付与するロールは、単一のリソースだけが持っていても、不適合とみなされます。

## モノ以外を管理する
<a name="audit-chk-auth-cognito-role-permissive-manage-non-things"></a>

認証済みの Amazon Cognito ID プールを介して接続するデバイスには、これらのセクションで説明した AWS IoT API アクション以外のアクションを実行するアクセス許可を付与しないでください。認証済みの Amazon Cognito ID プールを介して接続するアプリケーションを使用してアカウントを管理するには、デバイスにより使用されていない別個の ID プールを作成します。

## モノの管理データを読み取る
<a name="audit-chk-auth-cognito-role-permissive-read-things-admin-data"></a>

次の AWS IoT API アクションは、モノのデータを読み取るために使用されるため、認証済みの Amazon Cognito ID プールを介して接続するデバイスには限定されたモノのセットでのみこれらのアクションを実行するアクセス許可を付与してください。
+ `DescribeThing`
+ `ListJobExecutionsForThing`
+ `ListThingGroupsForThing`
+ `ListThingPrincipals`
+ 不適合:

  ```
  arn:aws:iot:region:account-id:thing/*
  ```

  これにより、デバイスがあらゆるモノで指定されたアクションを実行できるようになります。
+ 適合:

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [ 
            "iot:DescribeThing",
            "iot:ListJobExecutionsForThing",
            "iot:ListThingGroupsForThing",
            "iot:ListThingPrincipals"
        ],
        "Resource": [
          "arn:aws:iot:us-east-1:123456789012:thing/MyThing"
        ]
      }
    ]
  }
  ```

------

  これにより、デバイスが 1 つのモノでのみ指定されたアクションを実行できるようになります。
+ 適合:

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iot:DescribeThing",
                  "iot:ListJobExecutionsForThing",
                  "iot:ListThingGroupsForThing",
                  "iot:ListThingPrincipals"
              ],
              "Resource": [
                  "arn:aws:iot:us-east-1:123456789012:thing/MyThing*"
              ]
          }
      ]
  }
  ```

------

  リソースがワイルドカード (\$1) を使用して指定されていますが、前に特定の文字列が付いており、指定されたプレフィックスを持つ名前が付いたモノのセットへのアクセスに制限されるため、これは適合しています。
+ 不適合:

  ```
  arn:aws:iot:region:account-id:thing/*
  ```

  これにより、デバイスがあらゆるモノで指定されたアクションを実行できるようになります。
+ 適合:

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [ 
            "iot:DescribeThing",
            "iot:ListJobExecutionsForThing",
            "iot:ListThingGroupsForThing",
            "iot:ListThingPrincipals"
        ],
        "Resource": [
          "arn:aws:iot:us-east-1:123456789012:thing/MyThing"
        ]
      }
    ]
  }
  ```

------

  これにより、デバイスが 1 つのモノでのみ指定されたアクションを実行できるようになります。
+ 適合:

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iot:DescribeThing",
                  "iot:ListJobExecutionsForThing",
                  "iot:ListThingGroupsForThing",
                  "iot:ListThingPrincipals"
              ],
              "Resource": [
                  "arn:aws:iot:us-east-1:123456789012:thing/MyThing*"
              ]
          }
      ]
  }
  ```

------

  リソースがワイルドカード (\$1) を使用して指定されていますが、前に特定の文字列が付いており、指定されたプレフィックスを持つ名前が付いたモノのセットへのアクセスに制限されるため、これは適合しています。

## MQTT トピックにサブスクライブ/発行する
<a name="audit-chk-auth-cognito-role-permissive-mqtt-topic"></a>

MQTT メッセージは、AWS IoT メッセージブローカー経由で送信され、シャドウステータスやジョブ実行ステータスへのアクセスや変更などのさまざまなアクションを実行するためにデバイスにより使用されます。MQTT メッセージに接続、発行、またはサブスクライブするアクセス許可をデバイスに付与するポリシーは、以下のようにこれらのアクションを特定のリソースに制限します。

**接続**  
+ 不適合:

  ```
  arn:aws:iot:region:account-id:client/*
  ```

  ワイルドカード \$1 を使用すると、どのデバイスでも AWS IoT に接続できます。

  ```
  arn:aws:iot:region:account-id:client/${iot:ClientId}
  ```

  条件キーで `iot:Connection.Thing.IsAttached` が true に設定されていない限り、これは前の例のワイルドカード \$1 と同等の設定です。
+ 適合:

------
#### [ JSON ]

****  

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

------

  リソース仕様には、接続に使用されるデバイス名に一致する変数が含まれており、条件ステートメントは、MQTT クライアントにより使用される証明書が、使用される名前を持つモノにアタッチされた証明書と一致することを確認することにより、アクセス許可をさらに制限します。

**発行**  
+ 不適合:

  ```
  arn:aws:iot:region:account-id:topic/$aws/things/*/shadow/update
  ```

  これにより、デバイスはあらゆるデバイスのシャドウを更新できるようになります (\$1 = すべてのデバイス)。

  ```
  arn:aws:iot:region:account-id:topic/$aws/things/*
  ```

  これにより、デバイスはあらゆるデバイスのシャドウを読み取り/更新/削除できるようになります。
+ 適合:

------
#### [ JSON ]

****  

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

------

  リソース仕様にはワイルドカードが含まれていますが、接続するためにモノの名前が使用されているデバイスのシャドウ関連のトピックにのみ一致します。

**サブスクライブ**  
+ 不適合:

  ```
  arn:aws:iot:region:account-id:topicfilter/$aws/things/*
  ```

  これにより、デバイスはすべてのデバイスの予約済みシャドウまたはジョブトピックにサブスクライブできます。

  ```
  arn:aws:iot:region:account-id:topicfilter/$aws/things/#
  ```

  前の例と同じですが、\$1 ワイルドカードを使用します。

  ```
  arn:aws:iot:region:account-id:topicfilter/$aws/things/+/shadow/update
  ```

  これにより、デバイスはあらゆるデバイスのシャドウ更新を参照できるようになります (\$1 = すべてのデバイス)。
+ 適合:

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iot:Subscribe"
              ],
              "Resource": [
                  "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*",
                  "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*"
              ]
          }
      ]
  }
  ```

------

  リソース仕様にはワイルドカードが含まれていますが、接続するためにモノの名前が使用されているデバイスのシャドウ関連のトピックとジョブ関連のトピックにのみ一致します。

**受信**  
+ 適合:

  ```
  arn:aws:iot:region:account-id:topicfilter/$aws/things/*
  ```

  これは、サブスクライブするアクセス許可を持っているトピックからのみデバイスがメッセージを受信するため、問題ありません。

## シャドウまたはジョブデータを読み取る/変更する
<a name="audit-chk-auth-cognito-role-permissive-shadow-job-data"></a>

デバイスが API アクションを実行してデバイスシャドウやジョブ実行データにアクセスまたは変更するアクセス許可を付与するポリシーは、これらのアクションを特定のリソースに制限します。API アクションは次のとおりです。
+ `DeleteThingShadow`
+ `GetThingShadow`
+ `UpdateThingShadow`
+ `DescribeJobExecution`
+ `GetPendingJobExecutions`
+ `StartNextPendingJobExecution`
+ `UpdateJobExecution`

**例**
+ 不適合:

  ```
  arn:aws:iot:region:account-id:thing/*
  ```

  これにより、デバイスがあらゆるモノで指定されたアクションを実行できるようになります。
+ 適合:

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "iot:DeleteThingShadow",
          "iot:GetThingShadow",
          "iot:UpdateThingShadow",
          "iot:DescribeJobExecution",
          "iotjobsdata:DescribeJobExecution",
          "iotjobsdata:UpdateJobExecution"
        ],
        "Resource": [
          "arn:aws:iot:us-east-1:123456789012:thing/MyThing1",
          "arn:aws:iot:us-east-1:123456789012:thing/MyThing2"
        ]
      }
    ]
  }
  ```

------

  これにより、デバイスが 2 つのモノでのみ指定されたアクションを実行できるようになります。