

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

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

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

일반적으로 인증되지 않은 Amazon Cognito 자격 증명 풀 역할을 사용하여 연결된 디바이스는 사물별 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 자격 증명 풀을 감사합니다. 인증된 또는 인증되지 않은 Amazon Cognito 자격 증명이 연결된 모든 Amazon Cognito 자격 증명 풀이 감사에 포함됩니다.

이 점검에서 규정 미준수 인증되지 않은 Amazon Cognito 자격 증명 풀 역할이 발견된 경우 다음 사유 코드가 반환됩니다.
+ ALLOWS\$1ACCESS\$1TO\$1IOT\$1ADMIN\$1ACTIONS
+ ALLOWS\$1BROAD\$1ACCESS\$1TO\$1IOT\$1DATA\$1PLANE\$1ACTIONS

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

인증되지 않은 자격 증명은 사용자가 인증하지 않으므로 인증된 Amazon Cognito 자격 증명보다 더 큰 위험을 발생합니다. 인증되지 않은 자격 증명이 손상된 경우 관리 작업을 사용하여 계정 설정을 수정하거나, 리소스를 삭제하거나, 중요한 데이터에 접근할 수 있습니다. 또는 디바이스 설정에 광범위하게 액세스하여 계정의 모든 디바이스에 대한 섀도우 및 작업을 액세스하거나 수정할 수 있습니다. 게스트 사용자는 권한을 사용하여 전체 플릿을 손상시키거나 메시지로 DDOS 공격을 시작할 수 있습니다.

## 수정 방법
<a name="audit-chk-unauth-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="manage-modify-things-check"></a>

다음 AWS IoT API 작업은 사물을 관리하거나 수정하는 데 사용됩니다. 인증되지 않은 Amazon Cognito 자격 증명 풀을 통해 연결하는 디바이스에는 이 작업을 수행할 권한을 부여해서는 안 됩니다.
+ `AddThingToThingGroup` 
+ `AttachThingPrincipal` 
+ `CreateThing` 
+ `DeleteThing` 
+ `DetachThingPrincipal` 
+ `ListThings` 
+ `ListThingsInThingGroup` 
+ `RegisterThing` 
+ `RemoveThingFromThingGroup` 
+ `UpdateThing` 
+ `UpdateThingGroupsForThing` 

단일 리소스에 대해서도 이러한 작업을 수행하는 권한을 부여하는 모든 역할은 규정 미준수로 간주됩니다.

## 사물 관리 데이터 읽기
<a name="read-thing-admin-data-check"></a>

다음 AWS IoT API 작업은 사물 데이터를 읽거나 수정하는 데 사용됩니다. 인증되지 않은 Amazon Cognito 자격 증명 풀을 통해 연결되는 디바이스에는 이 작업을 수행할 권한을 부여해서는 안 됩니다.
+ `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"
        ]
      }
    ]
  }
  ```

------

  이렇게 하면 디바이스가 사물 하나에 대한 권한만 부여받은 경우에도 지정된 작업을 수행할 수 있습니다.

## 비사물 관리
<a name="manage-non-things-check"></a>

인증되지 않은 Amazon Cognito 자격 증명 풀을 통해 연결되는 디바이스에는 이 섹션에서 설명된 작업 이외의 다른 AWS IoT API 작업을 수행하는 권한을 부여해서는 안 됩니다. 디바이스에서 사용되지 않는 별도의 자격 증명 풀을 생성하여 인증되지 않은 Amazon Cognito 자격 증명 풀을 통해 연결되는 애플리케이션이 있는 계정을 관리할 수 있습니다.

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

------

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