

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

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

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

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

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

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

## 詳細
<a name="audit-chk-unauth-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\_ACCESS\_TO\_IOT\_ADMIN\_ACTIONS
+ ALLOWS\_BROAD\_ACCESS\_TO\_IOT\_DATA\_PLANE\_ACTIONS

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

認証されていない ID がユーザーにより認証されることはないため、認証された Amazon Cognito ID よりもはるかに大きいリスクを引き起こします。認証されていない ID が侵害された場合、管理アクションを使用して、アカウント設定の変更、リソースの削除、機密データへのアクセスを行う可能性があります。または、デバイス設定に広範にアクセスできるため、アカウント内のすべてのデバイスのシャドウとジョブにアクセスまたは変更する可能性があります。ゲストユーザーは、そのアクセス許可を使用して、フリート全体を侵害したり、メッセージで DDoS 攻撃を開始したりする可能性があります。

## 修正方法
<a name="audit-chk-unauth-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="manage-modify-things-check"></a>

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

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

## モノの管理データを読み取る
<a name="read-thing-admin-data-check"></a>

モノデータの読み取りや変更には、以下の AWS IoT API アクションが使用されます。認証されていない Amazon Cognito ID プールを介して接続するデバイスには、これらのアクションを実行するアクセス許可を与えないでください。
+ `DescribeThing`
+ `ListJobExecutionsForThing`
+ `ListThingGroupsForThing`
+ `ListThingPrincipals`

**Example**  
+ 不適合:

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

****  

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

------

  これにより、デバイスは 1 つのモノのみに対するアクセス許可が付与されていても、指定されたアクションを実行できるようになります。

## モノ以外を管理する
<a name="manage-non-things-check"></a>

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

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

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

**接続**  
+ 不適合:

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

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

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

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

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

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

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

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

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

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

------
#### [ 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="read-modify-shadow-job-data-check"></a>

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

**Example**  
+ 不適合:

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

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

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

****  

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

------

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