

# 인증된 Cognito 역할이 지나치게 허용됨
<a name="audit-chk-auth-cognito-role-permissive"></a>

인증된 Amazon Cognito 자격 증명 풀 역할에 연결된 정책은 과도하게 허용적인 것으로 간주됩니다. 이는 다음 AWS IoT 작업 중 하나를 수행할 수 있는 권한을 부여하기 때문입니다.
+ 사물 관리 또는 수정
+ 비사물 관련 데이터 또는 리소스 관리

또는 광범위한 디바이스에서 다음 AWS IoT 작업을 수행할 수 있는 권한을 부여하기 때문입니다.
+ 사물 관리 데이터 읽기
+ MQTT를 사용하여 예약된 주제(섀도우 또는 작업 실행 데이터 포함) 연결/게시/구독
+ API 명령을 사용하여 섀도우 또는 작업 실행 데이터 읽기 또는 수정

일반적으로 인증된 Amazon Cognito 자격 증명 풀 역할을 사용하여 연결된 디바이스는 사물별 관리 데이터를 읽거나, 사물별 MQTT 주제를 게시하고 구독하거나, API 명령을 사용하여 섀도우 또는 작업 실행 데이터와 관련된 사물별 데이터를 읽고 수정하는 제한된 권한만 보유해야 합니다.

이 점검은 CLI 및 API에서 `AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK`와(과) 같이 나타납니다.

**심각도:** 심각

## 세부 사항
<a name="audit-chk-auth-cognito-role-permissive-details"></a>

이 점검의 경우 AWS IoT Device Defender이(가) 감사 실행 전 31일 동안 AWS IoT 메시지 브로커에 연결하는 데 사용된 모든 Amazon Cognito 자격 증명 풀을 감사합니다. 인증된 또는 인증되지 않은 Amazon Cognito 자격 증명이 연결된 모든 Amazon Cognito 자격 증명 풀이 감사에 포함됩니다.

이 점검에서 규정 미준수 인증된 Amazon Cognito 자격 증명 풀 역할이 발견된 경우 다음 사유 코드가 반환됩니다.
+ ALLOWS\_BROAD\_ACCESS\_TO\_IOT\_THING\_ADMIN\_READ\_ACTIONS
+ ALLOWS\_ACCESS\_TO\_IOT\_NON\_THING\_ADMIN\_ACTIONS
+ ALLOWS\_ACCESS\_TO\_IOT\_THING\_ADMIN\_WRITE\_ACTIONS

## 이것이 중요한 이유
<a name="audit-chk-auth-cognito-role-permissive-why-it-matters"></a>

인증된 자격 증명이 손상된 경우 관리 작업을 사용하여 계정 설정을 수정하거나, 리소스를 삭제하거나, 중요한 데이터에 액세스할 수 있습니다.

## 수정 방법
<a name="audit-chk-auth-cognito-role-permissive-how-to-fix"></a>

인증된 Amazon Cognito 자격 증명 풀 역할에 연결된 정책은 디바이스에서 작업을 수행하는 데 필요한 권한만 부여해야 합니다. 다음 단계를 수행하는 것이 좋습니다.

1. 새 규정 준수 역할을 생성합니다.

1. Amazon Cognito 자격 증명 풀을 생성하고 이 풀에 규정 준수 역할을 연결합니다.

1. 자격 증명이 새 풀을 통해 AWS IoT에 액세스할 수 있는지 확인합니다.

1. 확인이 완료되면 역할을 규정 미준수로 플래그가 지정된 Amazon Cognito 자격 증명 풀에 연결합니다.

완화 작업을 사용하면 다음을 수행할 수 있습니다.
+ 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 자격 증명 풀을 통해 연결되는 디바이스에는 이러한 작업을 수행하는 권한을 부여해서는 안 됩니다.
+ `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 자격 증명 풀을 통해 연결되는 디바이스에는 이 섹션에서 설명된 작업 이외의 다른 AWS IoT API 작업을 수행하는 권한을 부여해서는 안 됩니다. 인증된 Amazon Cognito 자격 증명 풀을 통해 연결되는 애플리케이션이 있는 계정을 관리하려면 디바이스에서 사용되지 않는 별도의 자격 증명 풀을 생성합니다.

## 사물 관리 데이터 읽기
<a name="audit-chk-auth-cognito-role-permissive-read-things-admin-data"></a>

다음 AWS IoT API 작업은 사물 데이터를 읽는 데 사용되므로 인증된 Amazon Cognito 자격 증명 풀을 통해 연결되는 디바이스에는 제한된 사물 집합에서만 이러한 작업을 수행하는 권한을 부여해야 합니다.
+ `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"
        ]
      }
    ]
  }
  ```

------

  이렇게 하면 디바이스가 한 개의 사물에 대해서만 지정된 작업을 수행할 수 있습니다.
+ 규정 준수:

------
#### [ 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*"
              ]
          }
      ]
  }
  ```

------

  이는 리소스가 와일드카드(\*)로 지정된 경우에도 특정 문자열이 리소스 앞에 나오며, 이름에 지정된 접두사가 있는 사물에 액세스된 사물 집합으로 제한하므로 규정 준수입니다.
+ 규정 미준수:

  ```
  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"
        ]
      }
    ]
  }
  ```

------

  이렇게 하면 디바이스가 한 개의 사물에 대해서만 지정된 작업을 수행할 수 있습니다.
+ 규정 준수:

------
#### [ 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*"
              ]
          }
      ]
  }
  ```

------

  이는 리소스가 와일드카드(\*)로 지정된 경우에도 특정 문자열이 리소스 앞에 나오며, 이름에 지정된 접두사가 있는 사물에 액세스된 사물 집합으로 제한하므로 규정 준수입니다.

## MQTT 주제 구독/게시
<a name="audit-chk-auth-cognito-role-permissive-mqtt-topic"></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="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"
        ]
      }
    ]
  }
  ```

------

  이렇게 하면 디바이스가 두 개의 사물에 대해서만 지정된 작업을 수행할 수 있습니다.