

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 의 보안 AWS IoT
<a name="security"></a>

의 클라우드 보안 AWS 이 최우선 순위입니다. AWS 고객은 보안에 가장 민감한 조직의 요구 사항을 충족하도록 구축된 데이터 센터 및 네트워크 아키텍처의 이점을 누릴 수 있습니다.

보안은 AWS 와 사용자 간의 공동 책임입니다. [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)은 이를 클라우드*의* 보안과 클라우드 *내* 보안으로 설명합니다.
+ **클라우드 보안 **- AWS 는 AWS 클라우드에서 AWS 서비스를 실행하는 인프라를 보호할 책임이 있습니다. AWS 또한는 안전하게 사용할 수 있는 서비스를 제공합니다. 서드 파티 감사원은 정기적으로 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)의 일환으로 보안 효과를 테스트하고 검증합니다. 에 적용되는 규정 준수 프로그램에 대한 자세한 내용은 [AWS 규정 준수 프로그램 제공 범위 내 서비스를](https://aws.amazon.com/compliance/services-in-scope/) AWS IoT참조하세요.
+ **클라우드의 보안** - 사용자의 책임은 사용하는 AWS 서비스에 따라 결정됩니다. 또한 귀하는 데이터의 민감도, 회사 요구 사항, 관련 법률 및 규정을 비롯한 기타 요소에 대해서도 책임이 있습니다.

이 설명서는를 사용할 때 공동 책임 모델을 적용하는 방법을 이해하는 데 도움이 됩니다 AWS IoT. 다음 주제에서는 보안 및 규정 준수 목표를 충족 AWS IoT 하도록를 구성하는 방법을 보여줍니다. 또한 AWS IoT 리소스를 모니터링하고 보호하는 데 도움이 되는 다른 AWS 서비스를 사용하는 방법을 알아봅니다.

**Topics**
+ [AWS IoT 보안](iot-security.md)
+ [Authentication](authentication.md)
+ [권한 부여](iot-authorization.md)
+ [의 데이터 보호 AWS IoT Core](data-protection.md)
+ [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md)
+ [로깅 및 모니터링](security-logging.md)
+ [AWS IoT 코어에 대한 규정 준수 검증](compliance.md)
+ [AWS IoT Core의 복원력](disaster-recovery-resiliency.md)
+ [인터페이스 VPC 엔드포인트 AWS IoT Core 와 함께 사용](IoTCore-VPC.md)
+ [의 인프라 보안 AWS IoT](infrastructure-security.md)
+ [AWS IoT Core를 사용한 프로덕션 플릿 또는 디바이스의 보안 모니터링](security-monitoring.md)
+ [의 보안 모범 사례 AWS IoT Core](security-best-practices.md)
+ [AWS 교육 및 인증](#iot-security-training)

# AWS IoT 보안
<a name="iot-security"></a>

연결된 각 디바이스 또는 클라이언트에는 AWS IoT와 상호 작용할 자격 증명이 있어야 합니다. 송수신되는 모든 트래픽 AWS IoT 은 TLS(전송 계층 보안)를 통해 안전하게 전송됩니다. AWS 클라우드 보안 메커니즘은 AWS IoT 와 다른 AWS 서비스 간에 이동할 때 데이터를 보호합니다.

![\[AWS IoT 상호 작용할 자격 증명 AWS IoT, 연결을 보호하기 위한 전송 계층 보안, 데이터를 보호하기 위한 AWS 클라우드 보안 메커니즘을 포함한 보안 워크플로.\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/images/thunderball-overview.png)

+  AWS IoT에서 디바이스 자격 증명(X.509 인증서, AWS 자격 증명, Amazon Cognito 자격 증명, 연동 자격 증명 또는 사용자 지정 인증 토큰) 및 정책을 관리하는 것은 사용자의 책임입니다. 또한, 고유한 ID를 각 디바이스에 할당하고 디바이스 또는 디바이스 그룹에 대한 권한을 관리하는 것은 사용자의 책임입니다.
+ 디바이스는 보안 TLS 연결을 통해 X.509 인증서 또는 Amazon Cognito 자격 증명을 AWS IoT 사용하여에 연결됩니다. 연구 및 개발 중에, API 호출을 하거나 WebSockets를 사용하는 일부 애플리케이션의 경우, IAM 사용자 및 그룹 또는 사용자 지정 인증 토큰을 사용하여 인증할 수도 있습니다. 자세한 내용은 [IAM 사용자, 그룹 및 역할](iam-users-groups-roles.md) 단원을 참조하십시오.
+  AWS IoT 인증을 사용할 때 메시지 브로커는 디바이스를 인증하고, 디바이스 데이터를 안전하게 수집하고, AWS IoT 정책을 사용하여 디바이스에 지정한 액세스 권한을 부여하거나 거부할 책임이 있습니다.
+ 사용자 지정 인증을 사용하는 경우 사용자 지정 권한 부여자는 디바이스를 인증하고 AWS IoT 또는 IAM 정책을 사용하여 디바이스에 지정한 액세스 권한을 부여하거나 거부할 책임이 있습니다.
+  AWS IoT 규칙 엔진은 사용자가 정의한 규칙에 따라 디바이스 데이터를 다른 디바이스 또는 다른 AWS 서비스로 전달합니다. AWS Identity and Access Management 를 사용하여 데이터를 최종 대상으로 안전하게 전송합니다. 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 단원을 참조하십시오.

# Authentication
<a name="authentication"></a>

인증은 클라이언트 또는 서버의 자격 증명을 확인하는 메커니즘입니다. 서버 인증은 디바이스 또는 다른 클라이언트가 실제 AWS IoT 엔드포인트와 통신하는지 확인하는 프로세스입니다. 클라이언트 인증은 디바이스 또는 다른 클라이언트가 자신을 인증하는 프로세스입니다 AWS IoT.

## X.509 인증서 개요
<a name="x509-certificate-overview"></a>

X.509 인증서는 [X.509 퍼블릭 키 인프라 표준](https://en.wikipedia.org/wiki/X.509)을 사용하여 퍼블릭 키를 인증서에 포함된 자격 증명과 연결하는 디지털 인증서입니다. X.509 인증서는 인증 기관(CA)이라고 하는 신뢰할 수 있는 엔터티가 발행합니다. CA는 X.509 인증서 발행하는 데 사용되는 CA 인증서라고 하는 하나 이상의 특수 인증서를 유지 관리합니다. 인증 기관만 CA 인증서에 액세스할 수 있습니다. X.509 인증서 체인은 클라이언트의 서버 인증과 서버의 클라이언트 인증에 모두 사용됩니다.

# 서버 인증
<a name="server-authentication"></a>

디바이스 또는 다른 클라이언트 AWS IoT Core가 AWS IoT Core 연결을 시도하면 서버는 디바이스가 서버를 인증하는 데 사용하는 X.509 인증서를 전송합니다. 인증은 [X.509 인증서 체인](x509-client-certs.md) 검증을 통해 TLS 계층에서 이루어집니다. 이는 HTTPS URL을 방문할 때 브라우저에서 사용하는 것과 동일한 방법입니다. 자체 인증 기관의 인증서를 사용하려면 단원을 참조하세요[CA 인증서 관리](manage-your-CA-certs.md)

디바이스 또는 다른 클라이언트가 엔드포인트에 AWS IoT Core TLS 연결을 설정하면는 디바이스가 다른 서버가 가장하는 것이 AWS IoT Core 아니라와 통신하고 있는지 확인하는 데 사용하는 인증서 체인을 AWS IoT Core 나타냅니다 AWS IoT Core. 표시되는 체인은 디바이스가 연결하는 엔드포인트 유형과 클라이언트가 TLS 핸드셰이크 중에 AWS IoT Core 협상한 [암호 제품군](transport-security.md)의 조합에 따라 달라집니다.

## 엔드포인트 유형
<a name="endpoint-types"></a>

AWS IoT Core 는를 지원합니다`iot:Data-ATS`. `iot:Data-ATS` 엔드포인트는 [Amazon Trust Services](https://www.amazontrust.com/repository/) CA에서 서명한 서버 인증서를 제공합니다.

ATS 엔드포인트에서 제공하는 인증서는 Starfield에서 교차 서명합니다. 일부 TLS 클라이언트 구현에는 신뢰 루트의 검증이 필요하며 클라이언트의 신뢰할 수 있는 스토어에 Starfield CA 인증서가 설치되어 있어야 합니다.

**주의**  
전체 인증서(발급자 이름 등 포함)를 해시하는 인증서 고정 방법을 사용하는 것은 권장되지 않습니다. 이렇게 하면 AWS에서 제공하는 ATS 인증서가 Starfield에 의해 교차 서명되고 발급자 이름이 다르기 때문에 인증서 확인에 실패할 수 있습니다.

**중요**  
`iot:Data-ATS` 엔드포인트를 사용합니다. Symantec 및 Verisign 인증서는 더 이상 사용되지 않으며에서 더 이상 지원되지 않습니다 AWS IoT Core.

`describe-endpoint` 명령을 사용하여 ATS 엔드포인트를 생성할 수 있습니다.

```
aws iot describe-endpoint --endpoint-type iot:Data-ATS
```

`describe-endpoint` 명령은 다음 형식으로 엔드포인트를 반환합니다.

```
account-specific-prefix.iot.your-region.amazonaws.com
```

**참고**  
`describe-endpoint`를 처음 호출하면 엔드포인트가 생성됩니다. 이후 `describe-endpoint`에 대한 모든 호출은 동일한 엔드포인트를 반환합니다.

**참고**  
 AWS IoT Core 콘솔에서 `iot:Data-ATS` 엔드포인트를 보려면 **설정을** 선택합니다. 콘솔에는 `iot:Data-ATS` 엔드포인트만 표시됩니다.

### AWS SDK for Java`IotDataPlaneClient`를 사용하여 생성
<a name="java-client"></a>

`iot:Data-ATS` 엔드포인트를 사용하는 `IotDataPlaneClient`를 생성하려면 다음을 수행해야 합니다.
+ [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html) API를 사용하여 `iot:Data-ATS` 엔드포인트를 생성합니다.
+ `IotDataPlaneClient`를 생성할 때 해당 엔드포인트를 지정합니다.

다음 예제에서는 이 두 작업을 모두 수행합니다.

```
public void setup() throws Exception {
        IotClient client = IotClient.builder().credentialsProvider(CREDENTIALS_PROVIDER_CHAIN).region(Region.US_EAST_1).build();
        String endpoint = client.describeEndpoint(r -> r.endpointType("iot:Data-ATS")).endpointAddress();
        iot = IotDataPlaneClient.builder()
                                .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
                                .endpointOverride(URI.create("https://" + endpoint))
                                .region(Region.US_EAST_1)
                                .build();
}
```

## 서버 인증을 위한 CA 인증서
<a name="server-authentication-certs"></a>

사용 중인 데이터 엔드포인트 유형과 협상한 암호 제품군에 따라 AWS IoT Core 서버 인증 인증서는 다음 루트 CA 인증서 중 하나로 서명됩니다.

**Amazon Trust Services 엔드포인트(기본 설정됨)**

**참고**  
이 링크를 마우스 오른쪽 버튼으로 클릭하고 **다른 이름으로 링크 저장**을 선택하여 이러한 인증서를 파일로 저장해야 할 수 있습니다.
+ RSA 2048비트 키: [https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem).
+ RSA 4096비트 키: Amazon Root CA 2. 추후 사용 예약.
+ ECC 256비트 키: [https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem).
+ ECC 384비트 키: Amazon Root CA 4. 추후 사용 예약.

이러한 인증서는 모두 [Starfield 루트 CA 인증서](https://www.amazontrust.com/repository/SFSRootCAG2.pem)에서 교차 서명됩니다. 아시아 태평양(뭄바이) AWS IoT Core 리전 AWS IoT Core 에서 2018년 5월 9일 출시부터 모든 신규 리전은 ATS 인증서만 제공합니다.

**VeriSign 엔드포인트(레거시)**
+ RSA 2048비트 키: [VeriSign Class 3 Public Primary G5 루트 CA 인증서](https://www.digicert.com/kb/digicert-root-certificates.htm)

## 서버 인증 지침
<a name="server-authentication-guidelines"></a>

디바이스에서 AWS IoT Core 서버 인증 인증서를 검증하는 기능에 영향을 미칠 수 있는 많은 변수가 있습니다. 예를 들어 디바이스의 메모리가 너무 한정적이어서 가능한 모든 루트 CA 인증서를 보유할 수 없거나, 디바이스가 비표준 인증서 검증 방법을 구현할 수 있습니다. 이러한 이유로 다음 지침을 따르는 것이 좋습니다.
+ ATS 엔드포인트를 사용하고 지원되는 모든 Amazon Root CA 인증서를 설치하는 것이 좋습니다.
+ 디바이스에 이러한 인증서를 모두 저장할 수 없고 디바이스에서 ECC 기반 검증을 사용하지 않는 경우 [https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem) 및 [https://www.amazontrust.com/repository/AmazonRootCA4.pem](https://www.amazontrust.com/repository/AmazonRootCA4.pem) ECC 인증서를 생략할 수 있습니다. 디바이스가 RSA 기반 인증서 검증을 구현하지 않는 경우 [https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem) 및 [https://www.amazontrust.com/repository/AmazonRootCA2.pem](https://www.amazontrust.com/repository/AmazonRootCA2.pem) RSA 인증서를 생략할 수 있습니다. 이 링크를 마우스 오른쪽 버튼으로 클릭하고 **다른 이름으로 링크 저장**을 선택하여 이러한 인증서를 파일로 저장해야 할 수 있습니다.
+ ATS 엔드포인트에 연결할 때 서버 인증서 검증 문제가 발생하는 경우 관련 교차 서명된 Amazon Root CA 인증서를 신뢰할 수 있는 스토어에 추가해 보세요. 이 링크를 마우스 오른쪽 버튼으로 클릭하고 **다른 이름으로 링크 저장**을 선택하여 이러한 인증서를 파일로 저장해야 할 수 있습니다.
  + [교차 서명 Amazon Root CA 1](https://www.amazontrust.com/repository/G2-RootCA1.pem)
  + [교차 서명된 Amazon Root CA 2](https://www.amazontrust.com/repository/G2-RootCA2.pem) - 향후 사용을 위해 예약됩니다.
  + [교차 서명 Amazon Root CA 3](https://www.amazontrust.com/repository/G2-RootCA3.pem)
  + [교차 서명된 Amazon Root CA 4 - 향후 사용을 위해 예약됩니다.](https://www.amazontrust.com/repository/G2-RootCA4.pem)
+ 서버 인증서 검증 문제가 발생하는 경우 디바이스가 루트 CA를 명시적으로 신뢰해야 할 수 있습니다. [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)를 트러스트 스토어에 추가하세요.
+ 위의 단계를 실행한 후에도 문제가 계속 발생하면 [AWS 개발자 지원](https://aws.amazon.com/premiumsupport/plans/developers/) 센터에 문의하세요.

**참고**  
CA 인증서에는 서버 인증서를 검증하는 데 사용할 수 없는 만료 날짜가 있습니다. 따라서 만료 날짜가 도래하기 전에 CA 인증서를 교체해야 하는 경우도 있습니다. 지속적 연결을 보장하고 최신 보안 모범 사례를 유지하려면 모든 디바이스 또는 클라이언트에서 루트 CA 인증서를 업데이트해야 합니다.

**참고**  
디바이스 코드 AWS IoT Core 에서에 연결할 때 연결에 사용하는 API에 인증서를 전달합니다. 사용하는 API는 SDK에 따라 다릅니다. 자세한 내용은 [AWS IoT Core 디바이스 SDK](iot-sdks.md)를 참조하세요.

# 클라이언트 인증
<a name="client-authentication"></a>

AWS IoT 는 디바이스 또는 클라이언트 인증을 위해 세 가지 유형의 자격 증명 보안 주체를 지원합니다.
+ [X.509 클라이언트 인증서](x509-client-certs.md)
+ [IAM 사용자, 그룹 및 역할](iam-users-groups-roles.md)
+ [Amazon Cognito 자격 증명](cognito-identities.md)

이러한 자격 증명은 디바이스, 모바일, 웹 또는 데스크톱 애플리케이션에서 사용할 수 있습니다. 명령줄 인터페이스(CLI) AWS IoT 명령을 입력하는 사용자도 사용할 수 있습니다. 일반적으로 AWS IoT 디바이스는 X.509 인증서를 사용하는 반면, 모바일 애플리케이션은 Amazon Cognito 자격 증명을 사용합니다. 웹 및 데스크톱 애플리케이션은 IAM 또는 연동 자격 증명을 사용합니다. AWS CLI 명령은 IAM을 사용합니다. IAM 자격 증명에 대한 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 단원을 참조하세요.

# X.509 클라이언트 인증서
<a name="x509-client-certs"></a>

X.509 인증서 AWS IoT 는 클라이언트 및 디바이스 연결을 인증하는 기능을 제공합니다. 클라이언트가 통신하려면 AWS IoT 먼저 클라이언트 인증서를에 등록해야 합니다 AWS IoT. 클라이언트 인증서는 동일한 리전의 간에 디바이스를 쉽게 이동할 수 AWS 리전 있도록 동일한 AWS 계정의 여러 AWS 계정에 등록할 수 있습니다. 자세한 내용은 [다중 계정 등록을 통해 여러 AWS 계정에서 X.509 클라이언트 인증서 사용](#multiple-account-cert)를 참조하세요.

인증서 취소를 포함하여 세부적인 클라이언트 관리 작업이 가능하도록 각 디바이스 또는 클라이언트에 고유한 인증서를 부여하는 것이 좋습니다. 인증서 만료 시 원활한 작동을 보장하기 위해 디바이스 및 클라이언트가 인증서 교체 및 대체를 지원해야 합니다.

X.509 인증서를 사용하여 몇 개 이상의 디바이스를 지원하는 방법에 대한 자세한 내용은 [디바이스 프로비저닝](iot-provision.md) 단원을 참조하여 AWS IoT 이(가) 지원하는 다양한 인증서 관리 및 프로비저닝 옵션을 검토하세요.

**AWS IoT 는 다음과 같은 유형의 X.509 클라이언트 인증서를 지원합니다.**
+  에서 생성된 X.509 인증서 AWS IoT
+  에 등록된 CA가 서명한 X.509 인증서 AWS IoT.
+  AWS IoT에 등록되지 않은 CA에서 서명한 X.509 인증서입니다.

이 섹션에서는 AWS IoT에서 X.509 인증서를 관리하는 방법에 대해 설명합니다. AWS IoT 콘솔 또는 AWS CLI 를 사용하여 다음 인증서 작업을 수행할 수 있습니다.
+ [AWS IoT 클라이언트 인증서 생성](device-certs-create.md)
+ [자체 클라이언트 인증서 생성](device-certs-your-own.md)
+ [클라이언트 인증서 등록](register-device-cert.md)
+ [클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md)
+ [클라이언트 인증서 취소](revoke-ca-cert.md)

이러한 작업을 수행하는 AWS CLI 명령에 대한 자세한 내용은 [AWS IoT CLI 참조](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/index.html)를 참조하세요.

## X.509 클라이언트 인증서 사용
<a name="x509-client-cert-basics"></a>

X.509 인증서는 클라이언트 및 디바이스 연결을 인증합니다 AWS IoT. X.509 인증서는 식별 및 인증 메커니즘보다 유용한 여러 가지 장점을 제공합니다. X.509 인증서가 있으면 디바이스에서 비대칭 키를 사용할 수 있습니다. 예를 들어 중요한 암호화 구성 요소가 디바이스를 벗어나지 않도록 프라이빗 키를 디바이스의 안전한 스토리지에 저장할 수 있습니다. 프라이빗 키가 디바이스를 전혀 벗어나지 않으므로 X.509 인증서는 사용자 이름 및 암호 또는 보유자 토큰과 같은 다른 체계보다 강력한 클라이언트 인증을 제공합니다.

AWS IoT 는 TLS 프로토콜의 클라이언트 인증 모드를 사용하여 클라이언트 인증서를 인증합니다. TLS 지원은 다수의 프로그래밍 언어 및 운영 체제에서 제공되며 데이터 암호화에 흔히 사용됩니다. TLS 클라이언트 인증에서는 X.509 클라이언트 인증서를 AWS IoT 요청하고 인증서의 레지스트리에 AWS 계정 대해 인증서의 상태를 검증합니다. 그런 다음 인증서에 포함된 퍼블릭 키에 해당하는 프라이빗 키의 소유권 증명을 위해 클라이언트에 문제를 제기합니다. AWS IoT 는 클라이언트가 전송 계층 보안(TLS[) 프로토콜에 SNI(Server Name Indication) 확장](https://tools.ietf.org/html/rfc3546#section-3.1)을 전송하도록 요구합니다. SNI 확장 구성에 대한 자세한 내용은 단원을 참조하세요[의 전송 보안 AWS IoT Core](transport-security.md)

 AWS IoT 코어에 대한 안전하고 일관된 클라이언트 연결을 용이하게 하려면 X.509 클라이언트 인증서에 다음이 포함되어야 합니다.
+  AWS IoT 코어에 등록됨. 자세한 내용은 [클라이언트 인증서 등록](register-device-cert.md) 단원을 참조하십시오.
+ `ACTIVE` 상태여야 합니다. 자세한 내용은 [클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md) 단원을 참조하십시오.
+ 아직 인증서 만료 날짜가 되지 않았어야 합니다.

Amazon Root CA를 사용하는 클라이언트 인증서를 생성하고 다른 인증 기관(CA)에서 서명한 자체 클라이언트 인증서를 사용할 수 있습니다. AWS IoT 콘솔을 사용하여 Amazon Root CA를 사용하는 인증서를 생성하는 방법에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT 클라이언트 인증서 생성](device-certs-create.md). 자체 X.509 인증서 사용에 대한 자세한 내용은 [자체 클라이언트 인증서 생성](device-certs-your-own.md) 단원을 참조하세요.

CA 인증서에서 서명한 인증서의 만료 날짜 및 시간은 인증서 생성 시 설정됩니다. 에서 생성된 X.509 인증서는 2049년 12월 31일 자정 UTC(2049-12-31T23:59:59Z)에 AWS IoT 만료됩니다.

AWS IoT Device Defender 는 일반적인 IoT 보안 모범 사례를 지원하는 AWS 계정 및 디바이스에 대한 감사를 수행할 수 있습니다. 여기에는 CA 또는 Amazon Root CA에서 서명한 X.509 인증서의 만료 날짜 관리가 포함됩니다. 인증서의 만료 날짜 관리에 대한 자세한 내용은 [장치 인증서 만료](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-approaching-expiration.html) 및 [CA 인증서 만료](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-ca-cert-approaching-expiration.html)를 참조하세요.

공식 AWS IoT 블로그에서는를 [사용하여 IoT 디바이스 인증서 교체를 관리하는 방법에서 디바이스 인증서 교체 AWS IoT](https://aws.amazon.com/blogs/iot/how-to-manage-iot-device-certificate-rotation-using-aws-iot/) 및 보안 모범 사례 관리에 대해 자세히 살펴봅니다.

## 다중 계정 등록을 통해 여러 AWS 계정에서 X.509 클라이언트 인증서 사용
<a name="multiple-account-cert"></a>

다중 계정 등록을 통해 동일한 리전 및 다른 리전의 AWS 계정사이에 디바이스를 이동할 수 있습니다. 프리 프로덕션 계정에 디바이스를 등록, 테스트 및 구성한 다음 프로덕션 계정에 동일한 디바이스 및 디바이스 인증서를 등록하고 사용할 수 있습니다. 디바이스에 클라이언트 인증서를 등록하거나 등록된 CA 없이 디바이스 인증서를 등록할 수도 있습니다 AWS IoT. 자세한 정보는 [등록되지 않은 CA로 서명된 클라이언트 인증서 등록(CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)을 참조하세요.

**참고**  
다중 계정 등록에 사용되는 인증서는 `iot:Data-ATS`, `iot:Data`(레거시), `iot:Jobs` 및 `iot:CredentialProvider` 엔드포인트 유형으로 지원됩니다. AWS IoT 디바이스 엔드포인트에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT 디바이스 데이터 및 서비스 엔드포인트](iot-connect-devices.md#iot-connect-device-endpoints).

다중 계정 등록을 사용하는 디바이스는 전송 계층 보안[(TLS) 프로토콜로 SNI(Server Name Indication) 확장](https://tools.ietf.org/html/rfc3546#section-3.1)을 전송하고에 연결할 때 `host_name` 필드에 전체 엔드포인트 주소를 제공해야 합니다 AWS IoT.는의 엔드포인트 주소를 AWS IoT 사용하여 연결을 올바른 AWS IoT 계정으로 `host_name` 라우팅합니다. `host_name`에서 유효한 엔드포인트 주소를 전송하지 않는 기존 디바이스도 계속 작동하기는 하지만 이 정보가 필요한 기능은 사용할 수 없습니다. SNI 확장에 대한 자세한 내용과 `host_name` 필드의 엔드포인트 주소를 식별하는 방법은 [의 전송 보안 AWS IoT Core](transport-security.md) 단원을 참조하세요.

**다중 계정 등록을 사용하려면**

1. CA로 디바이스 인증서를 등록할 수 있습니다. `SNI_ONLY` 모드에서 여러 계정에 서명 CA를 등록하고 해당 CA를 사용하여 여러 계정에 동일한 클라이언트 인증서를 등록할 수 있습니다. 자세한 내용은 [SNI\$1ONLY 모드에서 CA 인증서 등록(CLI) - 권장됨](manage-your-CA-certs.md#register-CA-cert-SNI-cli) 단원을 참조하십시오.

1. CA 없이 디바이스 인증서를 등록할 수 있습니다. [등록되지 않은 CA로 서명된 클라이언트 인증서 등록(CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)을(를) 참조하세요. CA 등록은 선택 사항입니다. 디바이스 인증서에 서명한 CA를 등록할 필요는 없습니다 AWS IoT.

## 에서 지원하는 인증서 서명 알고리즘 AWS IoT
<a name="x509-cert-algorithms"></a>

AWS IoT 는 다음과 같은 인증서 서명 알고리즘을 지원합니다.
+ SHA256WITHRSA
+ SHA384WITHRSA
+ SHA512WITHRSA
+ SHA256WITHRSAANDMGF1(RSASSA-PSS)
+ SHA384WITHRSAANDMGF1(RSASSA-PSS)
+ SHA512WITHRSAANDMGF1(RSASSA-PSS)
+ DSA\$1WITH\$1SHA256
+ ECDSA-WITH-SHA256
+ ECDSA-WITH-SHA384
+ ECDSA-WITH-SHA512

인증서 인증 및 보안에 대한 자세한 내용은 [디바이스 인증서 키 품질](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-key-quality.html) 섹션을 참조하세요.

**참고**  
인증서 서명 요청(CSR)에는 퍼블릭 키가 포함되어야 합니다. 키는 길이가 2,048비트 이상인 RSA 키이거나 NIST P-256, NIST P-384, NIST P-521 곡선의 ECC 키일 수 있습니다. 자세한 내용은AWS IoT API 참조 가이드**의 [CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCertificateFromCsr.html)을 참조하세요.

## 에서 지원하는 키 알고리즘 AWS IoT
<a name="x509-cert-key-algorithms"></a>

아래 표는 키 알고리즘이 지원되는 방법을 보여줍니다.


****  

| 주요 알고리즘 | 인증서 서명 알고리즘 | TLS 버전 | 지원 여부 [Yes] 또는 [No] | 
| --- | --- | --- | --- | 
| 키 크기가 2,048비트 이상인 RSA | 모두 | TLS 1.2 TLS 1.3 | 예 | 
| ECC NIST P-256/P-384/P-521 | 모두 | TLS 1.2 TLS 1.3 | 예 | 
| 키 크기가 2,048비트 이상인 RSA-PSS | 모두 | TLS 1.2 | 아니요 | 
| 키 크기가 2,048비트 이상인 RSA-PSS | 모두 | TLS 1.3 | 예 | 

[CreateCertificateFromCSR](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateFromCsr.html)을 사용하여 인증서를 생성하려면 지원되는 키 알고리즘을 사용하여 CSR에 대한 퍼블릭 키를 생성할 수 있습니다. [RegisterCertificate](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificate.html) 또는 [RegisterCertificateWithoutCA](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificateWithoutCA.html)를 사용하여 자체 인증서를 등록하려면 지원되는 키 알고리즘을 사용하여 인증서에 대한 퍼블릭 키를 생성할 수 있습니다.

자세한 내용은 [보안 정책](https://docs.aws.amazon.com//iot/latest/developerguide/transport-security.html#tls-policy-table)을 참조하세요.

# AWS IoT 클라이언트 인증서 생성
<a name="device-certs-create"></a>

AWS IoT 는 Amazon Root 인증 기관(CA)에서 서명한 클라이언트 인증서를 제공합니다.

이 주제에서는 Amazon Root 인증 기관에서 서명한 클라이언트 인증서를 생성하고 인증서 파일을 다운로드하는 방법에 대해 설명합니다. 클라이언트 인증서 파일을 생성한 후에는 클라이언트에 설치해야 합니다.

**참고**  
에서 제공하는 각 X.509 클라이언트 인증서 AWS IoT 에는 인증서 생성 시 설정한 발급자 및 주체 속성이 있습니다. 인증서 속성은 인증서를 만든 후에만 변경할 수 없습니다.

 AWS IoT 콘솔 또는를 사용하여 Amazon Root AWS IoT 인증 기관에서 서명한 인증서를 AWS CLI 생성할 수 있습니다.

## AWS IoT 인증서 생성(콘솔)
<a name="device-certs-create-console"></a>

**AWS IoT 콘솔을 사용하여 AWS IoT 인증서를 생성하려면**

1. 에 로그인 AWS Management Console 하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 탐색 창에서 **보안**, **인증서**, **생성**을 차례대로 선택합니다.

1. **원클릭 인증서 생성(권장)**과 **인증서 생성**을 선택합니다.

1. **인증서 생성 완료** 페이지에서 사물, 퍼블릭 키 및 프라이빗 키에 대한 클라이언트 인증서 파일을 안전한 위치로 다운로드합니다. 에서 생성된 이러한 인증서 AWS IoT 는 AWS IoT 서비스에서만 사용할 수 있습니다.

   Amazon Root CA 인증서 파일도 필요한 경우 이 페이지에는 다운로드할 수 있는 페이지로 연결되는 링크도 있습니다.

1. 이제 클라이언트 인증서가 생성되고 AWS IoT에 등록되었습니다. 클라이언트에서 인증서를 사용하기 전에 인증서를 활성화해야 합니다.

    지금 클라이언트 인증서를 활성화하려면 **활성화**를 선택합니다. 지금 인증서를 지금 활성화하지 않으려면 [클라이언트 인증서 활성화(콘솔)](activate-or-deactivate-device-cert.md#activate-device-cert-console)에서 나중에 인증서를 활성화하는 방법을 알아보세요.

   

1. 인증서에 정책을 연결하려면 **정책 연결**을 선택합니다.

   지금 정책을 연결하지 않으려면 **완료**를 선택하여 완료합니다. 나중에 정책을 연결할 수 있습니다.

절차를 완료 한 후 클라이언트에 인증서 파일을 설치합니다.

## AWS IoT 인증서 생성(CLI)
<a name="device-certs-create-cli"></a>

는 Amazon Root 인증 기관에서 서명한 클라이언트 인증서를 생성하는 **[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)** 명령을 AWS CLI 제공합니다. 그러나 이 명령은 Amazon Root CA 인증서 파일을 다운로드하지 않습니다. [서버 인증을 위한 CA 인증서](server-authentication.md#server-authentication-certs)에서 Amazon Root CA 인증서 파일을 다운로드할 수 있습니다.

이 명령은 프라이빗 키, 퍼블릭 키 및 X.509 인증서 파일을 생성하고 인증서를 등록하고 활성화합니다 AWS IoT.

```
aws iot create-keys-and-certificate \
    --set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```

인증서를 생성하고 등록할 때 인증서를 활성화하지 않으려면 이 명령은 프라이빗 키, 퍼블릭 키 및 X.509 인증서 파일을 생성하고 인증서를 등록하지만 인증서를 활성화하지는 않습니다. [클라이언트 인증서 활성화(CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli)에서는 나중에 인증서를 활성화하는 방법에 대해 설명합니다.

```
aws iot create-keys-and-certificate \
    --no-set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```



클라이언트에 인증서 파일을 설치합니다.

# 자체 클라이언트 인증서 생성
<a name="device-certs-your-own"></a>

AWS IoT 는 루트 또는 중간 인증 기관(CA)에서 서명한 클라이언트 인증서를 지원합니다.는 CA 인증서를 AWS IoT 사용하여 인증서의 소유권을 확인합니다. Amazon의 CA가 아닌 CA에서 서명한 디바이스 인증서를 사용하려면 디바이스 인증서의 소유권을 확인할 수 AWS IoT 있도록 CA의 인증서를에 등록해야 합니다.

AWS IoT 는 자체 인증서를 가져오는 여러 가지 방법(BYOC)을 지원합니다.
+ 먼저 클라이언트 인증서 서명에 사용되는 CA를 등록한 다음 개별 클라이언트 인증서를 등록합니다. 디바이스 또는 클라이언트가 처음 연결될 때 클라이언트 인증서에 등록하려면 AWS IoT ([Just-in-Time Provisioning](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html)이라고도 함) 서명 CA를에 AWS IoT 등록하고 자동 등록을 활성화해야 합니다.
+ 서명 CA를 등록할 수 없는 경우 CA 없이 클라이언트 인증서를 등록하도록 선택할 수 있습니다. CA 없이 등록된 디바이스의 경우 AWS IoT에 연결할 때 [서버 이름 표시(SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)를 제시해야 합니다.

**참고**  
CA를 사용하여 클라이언트 인증서를 등록하려면 계층 구조의 다른 CA가 AWS IoT아닌에 서명 CAs를 등록해야 합니다.

**참고**  
CA 인증서는 한 리전의 한 계정에서만 `DEFAULT` 모드로 등록할 수 있습니다. CA 인증서는 한 리전의 여러 계정에서 `SNI_ONLY` 모드로 등록할 수 있습니다.

X.509 인증서를 사용하여 몇 개 이상의 디바이스를 지원하는 방법에 대한 자세한 내용은 [디바이스 프로비저닝](iot-provision.md) 단원을 참조하여 AWS IoT 이(가) 지원하는 다양한 인증서 관리 및 프로비저닝 옵션을 검토하세요.

**Topics**
+ [CA 인증서 관리](manage-your-CA-certs.md)
+ [CA 인증서를 사용하여 클라이언트 인증서 생성](create-device-cert.md)

# CA 인증서 관리
<a name="manage-your-CA-certs"></a>

이 섹션에서는 자체 인증 기관(CA) 인증서를 관리하기 위한 일반적인 작업에 대해 설명합니다.

인식하지 못하는 CA에서 서명한 클라이언트 인증서를 사용하는 AWS IoT 경우 인증 기관(CA)을에 등록할 수 AWS IoT 있습니다.

클라이언트가 처음 연결할 AWS IoT 때 클라이언트 인증서를에 자동으로 등록하도록 하려면 클라이언트 인증서에 서명한 CA를에 등록해야 합니다 AWS IoT. 그렇지 않으면 클라이언트 인증서를 서명한 CA 인증서를 등록할 필요가 없습니다.

**참고**  
CA 인증서는 한 리전의 한 계정에서만 `DEFAULT` 모드로 등록할 수 있습니다. CA 인증서는 한 리전의 여러 계정에서 `SNI_ONLY` 모드로 등록할 수 있습니다.

**Topics**
+ [CA 인증서 생성](#create-your-CA-cert)
+ [CA 인증서 등록](#register-CA-cert)
+ [CA 인증서 비활성화](#deactivate-ca-cert)

## CA 인증서 생성
<a name="create-your-CA-cert"></a>

CA 인증서가 없을 경우 [OpenSSL v1.1.1i](https://www.openssl.org/) 도구를 사용하여 인증서를 생성할 수 있습니다.

**참고**  
 AWS IoT 콘솔에서는이 절차를 수행할 수 없습니다.

**[OpenSSL v1.1.1i](https://www.openssl.org/) 도구를 사용하여 CA 인증서를 생성하려면**

1. 키 페어를 생성합니다.

   ```
   openssl genrsa -out root_CA_key_filename.key 2048
   ```

1. 키 페어의 프라이빗 키를 사용하여 CA 인증서를 생성합니다.

   ```
   openssl req -x509 -new -nodes \
       -key root_CA_key_filename.key \
       -sha256 -days 1024 \
       -out root_CA_cert_filename.pem
   ```

## CA 인증서 등록
<a name="register-CA-cert"></a>

이 절차에서는 Amazon의 CA가 아닌 인증 기관(CA)의 인증서를 등록하는 방법을 설명합니다. CA 인증서를 AWS IoT Core 사용하여 인증서 소유권을 확인합니다. Amazon의 CA가 아닌 CA에서 서명한 디바이스 인증서를 사용하려면 디바이스 인증서의 소유권을 확인할 수 AWS IoT Core 있도록 CA 인증서를에 등록해야 합니다.

### CA 인증서 등록(콘솔)
<a name="register-CA-cert-console"></a>

**참고**  
콘솔에서 CA 인증서를 등록하려면 콘솔에서 [CA 인증서 등록(Register CA certificate)](https://console.aws.amazon.com//iot/home#/create/cacertificate)을 시작합니다. 확인 인증서를 제공하거나 프라이빗 키에 액세스할 필요 없이 다중 계정 모드에서 CA를 등록할 수 있습니다. 다중 계정 모드에서 같은 AWS 리전의 여러 AWS 계정 으로 CA를 등록할 수 있습니다. CA 프라이빗 키의 확인 인증서와 소유권 증명을 제공하여 단일 계정 모드에서 CA를 등록할 수 있습니다.

### CA 인증서 등록(CLI)
<a name="register-CA-cert-cli"></a>

CA 인증서를 `DEFAULT` 모드 또는 `SNI_ONLY` 모드로 등록할 수 있습니다. CA는 한 AWS 계정 에 하나씩 `DEFAULT` 모드에 등록할 수 있습니다 AWS 리전. CA는 동일한에서 여러에 의해 `SNI_ONLY` 모드 AWS 계정 에 등록될 수 있습니다 AWS 리전. CA 인증서에 대한 자세한 정보는 [certificateMode](https://docs.aws.amazon.com//iot/latest/apireference/API_CACertificateDescription.html#iot-Type-CACertificateDescription-certificateMode)를 참조하세요.

**참고**  
`SNI_ONLY` 모드에서 CA를 등록하는 것이 좋습니다. 확인 인증서나 프라이빗 키에 대한 액세스 권한을 제공할 필요가 없으며 동일한 AWS 계정 에서 여러 로 CA를 등록할 수 있습니다 AWS 리전.

#### SNI\$1ONLY 모드에서 CA 인증서 등록(CLI) - 권장됨
<a name="register-CA-cert-SNI-cli"></a>

**사전 조건**

계속하기 전에 컴퓨터에서 다음 항목을 사용할 수 있는지 확인합니다.
+ 루트 CA의 인증서 파일(다음 예시에서 `root_CA_cert_filename.pem`으로 언급됨)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 이상

**를 사용하여 `SNI_ONLY` 모드에서 CA 인증서를 등록하려면 AWS CLI**

1. CA 인증서를에 등록합니다 AWS IoT. **register-ca-certificate** 명령을 사용하여 CA 인증서 파일 이름을 입력합니다. 자세한 정보는 *AWS CLI 명령 참조*의 [egister-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)를 참조하세요.

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --certificate-mode SNI_ONLY
   ```

   성공한 경우 이 명령은 *certificateId*를 반환합니다.

1. 이 시점에서 CA 인증서는에 등록 AWS IoT 되었지만 비활성 상태입니다. CA 인증서에서 서명한 클라이언트 인증서를 등록하려면 먼저 CA 인증서가 활성 상태여야 합니다.

   이 단계에서는 CA 인증서를 활성화합니다.

   다음과 같은 **update-certificate** CLI 명령을 사용하여 CA 인증서를 활성화합니다. 자세한 정보는 *AWS CLI 명령 참조*의 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)를 참조하세요.

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

**describe-ca-certificate** 명령을 사용하여 CA 인증서의 상태를 확인합니다. 자세한 정보는 *AWS CLI 명령 참조*의 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)를 참조하세요.

#### `DEFAULT` 모드에서 CA 인증서 등록(CLI)
<a name="register-CA-cert-default-cli"></a>

**사전 조건**

계속하기 전에 컴퓨터에서 다음 항목을 사용할 수 있는지 확인합니다.
+ 루트 CA의 인증서 파일(다음 예시에서 `root_CA_cert_filename.pem`으로 언급됨)
+ 루트 CA 인증서의 프라이빗 키 파일(다음 예시에서 `root_CA_key_filename.key`로 언급됨)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 이상

**를 사용하여 `DEFAULT` 모드에서 CA 인증서를 등록하려면 AWS CLI**

1. 에서 등록 코드를 가져오려면를 AWS IoT사용합니다**get-registration-code**. 반환된 `registrationCode`를 저장하여 프라이빗 키 확인 인증서의 `Common Name`으로 사용합니다. 자세한 내용은 *AWS CLI 명령 참조 안내서*의 [get-registration-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/get-registration-code.html)를 참조하세요.

   ```
   aws iot get-registration-code
   ```

1. 프라이빗 키 확인 인증서의 키 페어를 생성합니다.

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 프라이빗 키 확인 인증서에 대한 인증서 서명 요청(CSR)을 생성합니다. 인증서의 `Common Name` 필드를 **get-registration-code**에서 반환한 `registrationCode`로 설정합니다.

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   인증서의 `Common Name`을 비롯해 일부 정보를 입력하라는 메시지가 표시됩니다.

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. CSR을 사용하여 프라이빗 키 확인 인증서를 생성합니다.

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. CA 인증서를에 등록합니다 AWS IoT. 다음과 같이 CA 인증서 파일 이름과 프라이빗 키 확인 인증서 파일 이름을 **register-ca-certificate** 명령에 전달합니다. 자세한 정보는 *AWS CLI 명령 참조*의 [egister-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)를 참조하세요.

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --verification-cert file://verification_cert_filename.pem
   ```

   성공한 경우 이 명령은 *인증서 ID*를 반환합니다.

1. 현재 CA 인증서는에 등록 AWS IoT 되었지만 활성 상태가 아닙니다. 서명한 클라이언트 인증서를 등록하려면 CA 인증서가 활성 상태여야 합니다.

   이 단계에서는 CA 인증서를 활성화합니다.

   다음과 같은 **update-certificate** CLI 명령을 사용하여 CA 인증서를 활성화합니다. 자세한 정보는 *AWS CLI 명령 참조*의 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)를 참조하세요.

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

**describe-ca-certificate** 명령을 사용하여 CA 인증서의 상태를 확인합니다. 자세한 정보는 *AWS CLI 명령 참조*의 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)를 참조하세요.

### CA 검증 인증서를 생성하여 콘솔에서 CA 인증서를 등록합니다.
<a name="create-CA-verification-cert"></a>

**참고**  
이 절차는 AWS IoT 콘솔에서 CA 인증서를 등록하는 경우에만 사용할 수 있습니다.  
 AWS IoT 콘솔에서이 절차를 수행하지 않은 경우 콘솔의 CA 인증서 등록에서 [CA 인증서 등록](https://console.aws.amazon.com//iot/home#/create/cacertificate) 프로세스를 시작합니다.

계속하기 전에 동일한 컴퓨터에서 다음 항목을 사용할 수 있는지 확인합니다.
+ 루트 CA의 인증서 파일(다음 예시에서 `root_CA_cert_filename.pem`으로 언급됨)
+ 루트 CA 인증서의 프라이빗 키 파일(다음 예시에서 `root_CA_key_filename.key`로 언급됨)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 이상

**명령줄 인터페이스를 사용하여 CA 확인 인증서를 생성하여 콘솔에서 CA 인증서를 등록하는 방법**

1. 생성하려는 확인 인증서 키 파일의 이름으로 `verification_cert_key_filename.key`를 바꿉니다(예: **verification\$1cert.key**). 그런 다음, 이 명령을 실행하여 프라이빗 키 확인 인증서의 키 페어를 생성합니다.

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. `verification_cert_key_filename.key`를 1단계에서 생성한 키 파일의 이름으로 바꿉니다.

   `verification_cert_csr_filename.csr`을 생성하려는 인증서 서명 요청(CSR) 파일의 이름으로 바꿉니다. 예: **verification\$1cert.csr**.

   이 명령을 실행하여 CSR 파일을 생성합니다.

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   이 명령은 나중에 설명할 추가 정보를 묻는 메시지를 표시합니다.

1.  AWS IoT 콘솔의 **확인 인증서** 컨테이너에서 등록 코드를 복사합니다.

1. **openssl** 명령에서 묻는 정보가 다음 예제에 나와 있습니다. `Common Name` 필드를 제외하고는 원하는 값을 입력하거나 비워 둘 수 있습니다.

   `Common Name` 필드에 이전 단계에서 복사한 등록 코드를 붙여 넣습니다.

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

   작업을 마치면 명령이 CSR 파일을 생성합니다.

1. `verification_cert_csr_filename.csr`을 이전 단계에서 사용한 `verification_cert_csr_filename.csr`로 바꿉니다.

   `root_CA_cert_filename.pem`을 등록하려는 CA 인증서의 파일 이름으로 바꿉니다.

   `root_CA_key_filename.key`를 CA 인증서 프라이빗 키 파일의 파일 이름으로 바꿉니다.

   `verification_cert_filename.pem`을 생성하려는 확인 인증서의 파일 이름으로 바꿉니다. 예를 들어 **verification\$1cert.pem**입니다.

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. OpenSSL 명령이 완료되면 콘솔로 돌아갈 때 이러한 파일을 사용할 준비가 되어 있을 것입니다.
   + CA 인증서 파일(이전 명령에서 사용된 `root_CA_cert_filename.pem`)
   + 이전 단계에서 생성한 확인 인증서(이전 명령에서 사용된 *verification\$1cert\$1filename.pem*)

## CA 인증서 비활성화
<a name="deactivate-ca-cert"></a>

자동 클라이언트 인증서 등록을 위해 CA(인증 기관) 인증서가 활성화되면는 CA 인증서를 AWS IoT 확인하여 CA가 인지 확인합니다`ACTIVE`. CA 인증서가 인 경우 클라이언트 인증서 등록을 허용하지 `INACTIVE` AWS IoT 않습니다.

CA 인증서를 `INACTIVE`로 설정하면 CA에서 발급한 새 클라이언트 인증서가 자동으로 등록되지 않습니다.

**참고**  
훼손된 CA 인증서에서 서명한 모든 등록된 클라이언트 인증서는 사용자가 하나씩 명시적으로 취소할 때까지 계속 작동합니다.

### CA 인증서 비활성화(콘솔)
<a name="deactivate-ca-cert-console"></a>

**AWS IoT 콘솔을 사용하여 CA 인증서를 비활성화하려면**

1. 에 로그인 AWS Management Console 하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안**을 선택한 후 **CA**를 선택합니다.

1. 인증 기관 목록에서 비활성화할 인증 기관을 찾은 다음 줄임표 아이콘을 사용하여 옵션 메뉴를 엽니다.

1. 옵션 메뉴에서 **비활성화**를 선택합니다.

인증 기관은 목록에 **비활성**으로 표시되어야 합니다.

**참고**  
 AWS IoT 콘솔은 비활성화한 CA에서 서명한 인증서를 나열하는 방법을 제공하지 않습니다. 이러한 인증서를 나열하는 AWS CLI 옵션은 [CA 인증서 비활성화(CLI)](#deactivate-ca-cert-cli) 단원을 참조하세요.

### CA 인증서 비활성화(CLI)
<a name="deactivate-ca-cert-cli"></a>

는 CA 인증서를 비활성화하는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html) 명령을 AWS CLI 제공합니다.

```
aws iot update-ca-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html) 명령을 사용하여 지정된 CA에서 서명한 모든 등록된 디바이스 인증서의 목록을 가져옵니다. 지정된 CA 인증서에서 서명한 각 디바이스 인증서에 대해 클라이언트 인증서가 사용되지 않도록 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 명령을 사용하여 클라이언트 인증서를 취소합니다.

[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 명령을 사용하여 CA 인증서의 상태를 확인합니다.

# CA 인증서를 사용하여 클라이언트 인증서 생성
<a name="create-device-cert"></a>

자체 인증 기관(CA)을 사용하여 클라이언트 인증서를 생성할 수 있습니다. 클라이언트 인증서는 사용하기 AWS IoT 전에에 등록해야 합니다. 클라이언트 인증서의 등록 옵션에 대한 자세한 내용은 단원을 참조하세요[클라이언트 인증서 등록](register-device-cert.md)

## 클라이언트 인증서 생성(CLI)
<a name="create-device-cert-cli"></a>

**참고**  
 AWS IoT 콘솔에서는이 절차를 수행할 수 없습니다.

**를 사용하여 클라이언트 인증서를 생성하려면 AWS CLI**

1. 키 페어를 생성합니다.

   ```
   openssl genrsa -out device_cert_key_filename.key 2048
   ```

1. 클라이언트 인증서에 대한 CSR을 생성합니다.

   ```
   openssl req -new \
       -key device_cert_key_filename.key \
       -out device_cert_csr_filename.csr
   ```

   아래와 같이 몇 가지 정보를 입력하라는 메시지가 표시됩니다.

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. CSR에서 클라이언트 인증서를 생성합니다.

   ```
   openssl x509 -req \
       -in device_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out device_cert_filename.pem \
       -days 500 -sha256
   ```

 현재 클라이언트 인증서가 생성되었지만 아직 등록되지 않았습니다 AWS IoT. 클라이언트 인증서를 등록하는 방법 및 시기에 대한 자세한 내용은 단원을 참조하세요[클라이언트 인증서 등록](register-device-cert.md) 

# 클라이언트 인증서 등록
<a name="register-device-cert"></a>

클라이언트와 간의 통신을 활성화 AWS IoT 하려면 클라이언트 인증서를에 등록해야 합니다 AWS IoT. 각 클라이언트 인증서를 수동으로 등록하거나 클라이언트가 AWS IoT 에 처음 연결할 때 자동으로 등록하도록 클라이언트 인증서를 구성할 수 있습니다.

 처음 연결할 때 클라이언트 및 디바이스가 클라이언트 인증서를 등록하도록 하려면 [CA 인증서 등록](manage-your-CA-certs.md#register-CA-cert)을(를) 사용하여 해당 클라이언트 인증서를 사용하려는 리전에서 AWS IoT (으)로 클라이언트 인증서에 서명해야 합니다. Amazon Root CA는에 자동으로 등록됩니다 AWS IoT.

클라이언트 인증서는 AWS 계정 및 리전에서 공유할 수 있습니다. 이 주제의 절차는 클라이언트 인증서를 사용할 각 계정 및 리전에서 수행해야 합니다. 한 계정 또는 리전에서 등록된 클라이언트 인증서는 다른 계정 또는 리전에서 자동으로 인식되지 않습니다.

**참고**  
전송 계층 보안(TLS) 프로토콜을 사용하여 AWS IoT 에 연결하는 클라이언트는 TLS에 대한 [SNI(서버 이름 표시) 확장](https://tools.ietf.org/html/rfc3546#section-3.1)을 지원해야 합니다. 자세한 내용은 [의 전송 보안 AWS IoT Core](transport-security.md) 단원을 참조하세요.

**Topics**
+ [수동으로 클라이언트 인증서 등록](manual-cert-registration.md)
+ [클라이언트가 JITR( AWS IoT just-in-time Registration)에 연결할 때 클라이언트 인증서 등록](auto-register-device-cert.md)

# 수동으로 클라이언트 인증서 등록
<a name="manual-cert-registration"></a>

 AWS IoT 콘솔 및를 사용하여 클라이언트 인증서를 수동으로 등록할 수 있습니다 AWS CLI.

사용할 등록 절차는 인증서가 AWS 계정및 리전에서 공유되는지 여부에 따라 달라집니다. 한 계정 또는 리전에서 등록된 클라이언트 인증서는 다른 계정 또는 리전에서 자동으로 인식되지 않습니다.

이 주제의 절차는 클라이언트 인증서를 사용할 각 계정 및 리전에서 수행해야 합니다. 클라이언트 인증서는 AWS 계정및 리전에서 공유할 수 있습니다.

## 등록된 CA로 서명된 클라이언트 인증서 등록(콘솔)
<a name="manual-cert-registration-console"></a>

**참고**  
이 절차를 수행하기 전에 클라이언트 인증서의 .pem 파일이 있고 클라이언트 인증서가 [등록한 AWS IoT](manage-your-CA-certs.md#register-CA-cert) CA에 의해 서명되었는지 확인합니다.

**콘솔을 AWS IoT 사용하여에 기존 인증서를 등록하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 탐색 창의 **관리(Manage)** 섹션에서 **보안(Security)**을 선택한 다음 **인증서(Certificates)**를 선택합니다.

1. **인증서(Certificates)** 대화 상자의 **인증서(Certificates)** 페이지에서 **인증서 추가(Add certificate)**를 선택한 다음 **인증서 등록(Register certificates)**을 선택합니다.

1. **업로드할 인증서(Certificates to upload)** 대화 상자의 **인증서 등록(Register certificate)** 페이지에서 다음을 수행합니다.
   + **CA가 AWS IoT에 등록됨**을 선택합니다.
   + **CA 인증서 선택(Choose a CA certificate)**에서 **인증 기관(Certification authority)**을 선택합니다.
     +  AWS IoT에 등록되지 않은 새 **인증 기관(Certification authority)**을 등록하려면 **새 CA 등록(Register a new CA)**을 선택합니다.
     + **Amazon 루트 인증 기관(Amazon Root certificate authority)**이 해당 인증 기관인 경우 **CA 인증서 선택(Choose a CA certificate)**을 비워 둡니다.
   + 업로드하고 등록할 인증서를 최대 10개까지 선택합니다 AWS IoT.
     + [AWS IoT 클라이언트 인증서 생성](device-certs-create.md) 및 [CA 인증서를 사용하여 클라이언트 인증서 생성](create-device-cert.md)에서 생성한 인증서 파일을 사용합니다.
   + **활성화(Activate)** 또는 **비활성화(Deactivate)**를 선택합니다. **비활성화(Deactivate)**를 선택한 경우 인증서 등록 후 인증서를 활성화하는 방법이 [클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md)에 설명되어 있습니다.
   + **등록**을 선택합니다.

이제 **인증서(Certificates)** 대화 상자의 **인증서(Certificates)** 페이지에 등록된 인증서가 나타납니다.

## 등록되지 않은 CA로 서명된 클라이언트 인증서 등록(콘솔)
<a name="manual-cert-registration-console-noca"></a>

**참고**  
이 절차를 수행하기 전에 클라이언트 인증서의 .pem 파일이 있는지 확인해야 합니다.

**콘솔을 AWS IoT 사용하여에 기존 인증서를 등록하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안**, **인증서**, **생성**을 차례대로 선택합니다.

1. **인증서 생성**에서 **내 인증서 사용** 항목을 찾아 **시작하기**를 선택합니다.

1. **CA 선택**에서 **다음**을 선택합니다.

1.  **기존 디바이스 인증서 등록**에서 **인증서 선택**을 선택하고 등록할 인증서 파일을 최대 10개까지 선택합니다.

1.  파일 대화 상자를 닫은 후 클라이언트 인증서를 등록할 때 클라이언트 인증서를 활성화할지 또는 취소할지 선택합니다.

   인증서를 등록할 때 인증서를 활성화하지 않으면 [클라이언트 인증서 활성화(콘솔)](activate-or-deactivate-device-cert.md#activate-device-cert-console)에서 나중에 인증서를 활성화하는 방법에 대해 설명합니다.

   인증서를 등록할 때 인증서가 취소되면 나중에 활성화할 수 없습니다.

   등록할 인증서 파일을 선택하고 등록 후 수행할 작업을 선택한 후 **인증서 등록**을 선택합니다.

성공적으로 등록된 클라이언트 인증서가 인증서 목록에 나타납니다.

## 등록된 CA로 서명된 클라이언트 인증서 등록(CLI)
<a name="manual-cert-registration-cli"></a>

**참고**  
이 절차를 수행하기 전에 인증 기관(CA) .pem 및 클라이언트 인증서의 .pem 파일이 있는지 확인해야 합니다. 클라이언트 인증서는 [등록한 AWS IoT](manage-your-CA-certs.md#register-CA-cert) 인증 기관(CA)에서 서명해야 합니다.

[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html) 명령을 사용하여 클라이언트 인증서를 활성화하지 않고 등록합니다.

```
aws iot register-certificate \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

클라이언트 인증서가에 등록 AWS IoT되었지만 아직 활성화되지 않았습니다. 나중에 활성화하는 방법에 대한 자세한 내용은 [클라이언트 인증서 활성화(CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli) 단원을 참조하세요.

이 명령을 사용하여 클라이언트 인증서를 등록할 때 클라이언트 인증서를 활성화할 수도 있습니다.

```
aws iot register-certificate \
    --set-as-active \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

연결에 사용할 수 있도록 인증서를 활성화하는 방법에 대한 자세한 내용은 섹션을 AWS IoT참조하세요. [클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md) 

## 등록되지 않은 CA로 서명된 클라이언트 인증서 등록(CLI)
<a name="manual-cert-registration-noca-cli"></a>

**참고**  
이 절차를 수행하기 전에 인증서의 .pem 파일이 있는지 확인해야 합니다.

[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html) 명령을 사용하여 클라이언트 인증서를 활성화하지 않고 등록합니다.

```
aws iot register-certificate-without-ca \
    --certificate-pem file://device_cert_filename.pem
```

클라이언트 인증서가에 등록 AWS IoT되었지만 아직 활성화되지 않았습니다. 나중에 활성화하는 방법에 대한 자세한 내용은 [클라이언트 인증서 활성화(CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli) 단원을 참조하세요.

이 명령을 사용하여 클라이언트 인증서를 등록할 때 클라이언트 인증서를 활성화할 수도 있습니다.

```
aws iot register-certificate-without-ca \
    --status ACTIVE \
    --certificate-pem file://device_cert_filename.pem
```

연결에 사용할 수 있도록 인증서를 활성화하는 방법에 대한 자세한 내용은 섹션을 AWS IoT참조하세요[클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md).

# 클라이언트가 JITR( AWS IoT just-in-time Registration)에 연결할 때 클라이언트 인증서 등록
<a name="auto-register-device-cert"></a>

클라이언트가 처음 연결할 때에 AWS IoT 자동으로 등록하도록 서명된 클라이언트 인증서를 활성화하도록 CA 인증서를 구성할 수 있습니다 AWS IoT.

클라이언트가 AWS IoT 에 처음 연결할 때 클라이언트 인증서를 등록하려면 자동 등록을 위해 CA 인증서를 활성화하고 필요한 인증서를 제공하도록 클라이언트의 첫 번째 연결을 구성해야 합니다.

## 자동 등록을 지원하도록 CA 인증서 구성(콘솔)
<a name="enable-auto-registration-console"></a>

**AWS IoT 콘솔을 사용하여 자동 클라이언트 인증서 등록을 지원하도록 CA 인증서를 구성하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안**을 선택한 후 **CA**를 선택합니다.

1. 인증 기관 목록에서 자동 등록을 활성화할 인증 기관을 찾은 다음 줄임표 아이콘을 사용하여 옵션 메뉴를 엽니다.

1. 옵션 메뉴에서 **자동 등록 활성화**를 선택합니다.

**참고**  
인증 기관 목록에 자동 등록 상태가 표시되지 않습니다. 인증 기관의 자동 등록 상태를 보려면 인증 기관의 **세부 정보** 페이지를 열어야 합니다.

## 자동 등록을 지원하도록 CA 인증서 구성(CLI)
<a name="enable-auto-registration-cli"></a>

CA 인증서를에 이미 등록한 경우 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html) 명령을 AWS IoT사용하여 `autoRegistrationStatus` CA 인증서를 로 설정합니다`ENABLE`.

```
aws iot update-ca-certificate \
--certificate-id caCertificateId \
--new-auto-registration-status ENABLE
```

CA 인증서를 등록할 때 `autoRegistrationStatus`를 활성화하려면 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html) 명령을 사용합니다.

```
aws iot register-ca-certificate \
--allow-auto-registration  \
--ca-certificate file://root_CA_cert_filename.pem \
--verification-cert file://verification_cert_filename.pem
```

[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 명령을 사용하여 CA 인증서의 상태를 확인합니다.

## 자동 등록을 위해 클라이언트에 의한 첫 번째 연결 구성
<a name="configure-auto-reg-first-connect"></a>

클라이언트가 처음으로 AWS IoT 에 연결하려고 하면 전송 계층 보안(TLS) 핸드셰이크 중에 CA 인증서로 서명된 클라이언트 인증서가 클라이언트에 있어야 합니다.

클라이언트가 연결되면 [AWS IoT 클라이언트 인증서 생성](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-create.html) 또는 [자체 클라이언트 인증서 생성](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html)에서 생성한 클라이언트 인증서를 AWS IoT사용합니다.는 CA 인증서를 등록된 CA 인증서로 AWS IoT 인식하고, 클라이언트 인증서를 등록하고, 상태를 로 설정합니다`PENDING_ACTIVATION`. 이는 클라이언트 인증서가 자동으로 등록되었고 활성화를 기다리는 중임을 의미합니다. 클라이언트 인증서를 사용하여 AWS IoT에 연결하려면 먼저 클라이언트 인증서가 `ACTIVE` 상태여야 합니다. 클라이언트 인증서 활성화에 대한 자세한 내용은 [클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md) 섹션을 참조하세요.

**참고**  
디바이스의 첫 번째 연결에서 전체 신뢰 체인을 보낼 필요 없이 JITR( AWS IoT Core just-in-time Registration) 기능을 사용하여 디바이스를 프로비저닝할 수 있습니다 AWS IoT Core. CA 인증서를 제시하는 것은 선택 사항이지만 디바이스가 연결할 때 [서버 이름 표시(SNI)](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) 확장을 전송해야 합니다.

가 인증서를 AWS IoT 자동으로 등록하거나 클라이언트가 `PENDING_ACTIVATION` 상태의 인증서를 제시하면는 다음 MQTT 주제에 메시지를 AWS IoT 게시합니다.

`$aws/events/certificates/registered/caCertificateId`

여기서 `caCertificateId`는 디바이스 인증서를 발행한 CA 인증서의 ID입니다.

이 주제에 게시된 메시지는 구조가 다음과 같습니다.

```
{
        "certificateId": "certificateId",
        "caCertificateId": "caCertificateId",
        "timestamp": timestamp,
        "certificateStatus": "PENDING_ACTIVATION",
        "awsAccountId": "awsAccountId",
        "certificateRegistrationTimestamp": "certificateRegistrationTimestamp"
}
```

이 주제를 수신 대기하고 일부 작업을 수행하는 규칙을 생성할 수 있습니다. 클라이언트 인증서가 인증서 취소 목록(CRL)에 포함되지 않음을 확인하고, 인증서를 활성화하고, 정책을 생성하여 인증서에 연결하는 Lambda 규칙을 생성하는 것이 좋습니다. 이 정책은 클라이언트가 어떤 리소스에 액세스할 수 있는지를 결정합니다. 생성 중인 정책에 연결되어 있는 디바이스의 클라이언트 ID가 필요한 경우, 규칙의 clientid() 함수를 사용하여 클라이언트 ID를 검색할 수 있습니다. 규칙 정의 예제는 다음과 같습니다.

```
SELECT *,
   clientid() as clientid
from $aws/events/certificates/registered/caCertificateId
```

이 예제에서 규칙은 JITR 주제 `$aws/events/certificates/registered/caCertificateID`를 구독하고 clientid() 함수를 사용하여 클라이언트 ID를 검색합니다. 그런 다음 규칙은 클라이언트 ID를 JITR 페이로드에 추가합니다. 규칙의 clientid() 함수에 대한 자세한 내용은 [clientid()](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-clientid)를 참조하세요.

`$aws/events/certificates/registered/caCertificateID` 주제를 수신 대기하고 이러한 작업을 수행하는 Lambda 규칙을 생성하는 방법에 대한 자세한 내용은[Just-in-Time Registration of Device Certificates on AWS IoT](https://aws.amazon.com/blogs/iot/just-in-time-registration-of-device-certificates-on-aws-iot/)을 참조하세요.

클라이언트 인증서의 자동 등록 중에 오류 또는 예외가 발생하면는 CloudWatch Logs의 로그에 이벤트 또는 메시지를 AWS IoT 전송합니다. 계정에 대한 로그 설정에 대한 자세한 내용은 [Amazon CloudWatch 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/)를 참조하세요.

# 클라이언트 인증서 관리
<a name="manage-device-cert"></a>

AWS IoT 는 클라이언트 인증서를 관리할 수 있는 기능을 제공합니다.

**Topics**
+ [클라이언트 인증서 활성화 또는 비활성화](activate-or-deactivate-device-cert.md)
+ [클라이언트 인증서에 사물 또는 정책 연결](attach-to-cert.md)
+ [클라이언트 인증서 취소](revoke-ca-cert.md)
+ [인증서를 다른 계정으로 이전합니다.](transfer-cert.md)

# 클라이언트 인증서 활성화 또는 비활성화
<a name="activate-or-deactivate-device-cert"></a>

AWS IoT 는 연결을 인증할 때 클라이언트 인증서가 활성 상태인지 확인합니다.

클라이언트 인증서를 활성화하지 않은 상태에서 생성하고 등록할 수 있으므로 사용할 때까지 클라이언트 인증서를 사용할 수 없습니다. 활성 클라이언트 인증서를 비활성화하여 일시적으로 비활성화할 수도 있습니다. 마지막으로 클라이언트 인증서를 취소하여 나중에 사용할 수 없도록 할 수 있습니다.

## 클라이언트 인증서 활성화(콘솔)
<a name="activate-device-cert-console"></a>

**AWS IoT 콘솔을 사용하여 클라이언트 인증서를 활성화하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

1. 인증서 목록에서 활성화할 인증서를 찾은 다음 줄임표 아이콘을 사용하여 옵션 메뉴를 엽니다.

1. 옵션 메뉴에서 **활성화**를 선택합니다.

인증서는 인증서 목록에 **활성**으로 표시되어야 합니다.

## 클라이언트 인증서 비활성화(콘솔)
<a name="deactivate-device-cert-console"></a>

**AWS IoT 콘솔을 사용하여 클라이언트 인증서를 비활성화하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

1. 인증서 목록에서 비활성화할 인증서를 찾은 다음 줄임표 아이콘을 사용하여 옵션 메뉴를 엽니다.

1. 옵션 메뉴에서 **비활성화**를 선택합니다.

인증서는 인증서 목록에 **비활성**으로 표시되어야 합니다.

## 클라이언트 인증서 활성화(CLI)
<a name="activate-device-cert-cli"></a>

는 인증서를 활성화하는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 명령을 AWS CLI 제공합니다.

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status ACTIVE
```

명령이 성공하면 인증서가 `ACTIVE` 상태가 됩니다. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html)를 실행하여 인증서의 상태를 확인합니다.

```
aws iot describe-certificate \
    --certificate-id certificateId
```

## 클라이언트 인증서 비활성화(CLI)
<a name="deactivate-device-cert-cli"></a>

는 인증서를 비활성화하는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 명령을 AWS CLI 제공합니다.

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

명령이 성공하면 인증서가 `INACTIVE` 상태가 됩니다. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html)를 실행하여 인증서의 상태를 확인합니다.

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 클라이언트 인증서에 사물 또는 정책 연결
<a name="attach-to-cert"></a>

 AWS IoT 사물과 별도로 인증서를 생성하고 등록하면 AWS IoT 작업을 승인하는 정책이 없으며 AWS IoT 사물 객체와도 연결되지 않습니다. 이 섹션에서는 이러한 관계를 등록된 인증서에 추가하는 방법에 대해 설명합니다.

**중요**  
이러한 절차를 완료하려면 인증서에 연결할 사물이나 정책을 이미 생성했어야 합니다.

인증서는 연결할 수 AWS IoT 있도록를 사용하여 디바이스를 인증합니다. 인증서를 사물 리소스에 연결하면 디바이스와 (인증서를 통해) 리소스 간의 관계가 설정됩니다. 디바이스가 메시지를 연결하고 게시할 수 있도록 허용하는 등의 AWS IoT 작업을 수행하도록 디바이스에 권한을 부여하려면 디바이스의 인증서에 적절한 정책을 연결해야 합니다.

## 클라이언트 인증서에 사물 연결(콘솔)
<a name="attach-to-cert-thing-console"></a>

이 절차를 완료하려면 사물 객체의 이름이 필요합니다.

**등록된 인증서에 사물 객체를 연결하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

1. 인증서 목록에서 정책을 연결할 인증서를 찾고 줄임표 아이콘을 선택하여 인증서의 옵션 메뉴를 연 다음 **사물 연결**을 선택합니다.

1. 팝업에서 인증서에 연결할 사물의 이름을 찾아 해당 확인란을 선택한 다음 **연결**을 선택합니다.

이제 사물 객체가 인증서의 세부 정보 페이지에 있는 사물 목록에 나타나야 합니다.

## 클라이언트 인증서에 정책 연결(콘솔)
<a name="attach-to-cert-policy-console"></a>

이 절차를 완료하려면 정책 객체의 이름이 필요합니다.

**등록된 인증서에 정책 객체를 연결하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

1. 인증서 목록에서 정책을 연결할 인증서를 찾고 줄임표 아이콘을 선택하여 인증서의 옵션 메뉴를 연 다음 **정책 연결**을 선택합니다.

1. 팝업에서 인증서에 연결할 정책의 이름을 찾아 해당 확인란을 선택한 다음 **연결**을 선택합니다.

이제 정책 객체가 인증서의 세부 정보 페이지에 있는 정책 목록에 나타납니다.

## 클라이언트 인증서에 사물 연결(CLI)
<a name="attach-to-cert-thing-cli"></a>

는 사물 객체를 인증서에 연결하는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html) 명령을 AWS CLI 제공합니다.

```
aws iot attach-thing-principal \
    --principal certificateArn \
    --thing-name thingName
```

## 클라이언트 인증서에 정책 연결(CLI)
<a name="attach-to-cert-policy-cli"></a>

는 인증서에 정책 객체를 연결하는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html) 명령을 AWS CLI 제공합니다.

```
aws iot attach-policy \
    --target certificateArn \
    --policy-name policyName
```

# 클라이언트 인증서 취소
<a name="revoke-ca-cert"></a>

등록된 클라이언트 인증서에서 의심스러운 활동이 감지되는 경우 다시 사용할 수 없도록 클라이언트 인증서를 취소할 수 있습니다.

**참고**  
인증서가 취소되면 상태를 변경할 수 없습니다. 즉, 인증서 상태를 `Active` 또는 다른 상태로 변경할 수 없습니다.

## 클라이언트 인증서 취소(콘솔)
<a name="revoke-device-cert-console"></a>

**AWS IoT 콘솔을 사용하여 클라이언트 인증서를 취소하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

1. 인증서 목록에서 취소할 인증서를 찾은 다음 줄임표 아이콘을 사용하여 옵션 메뉴를 엽니다.

1. 옵션 메뉴에서 **취소**를 선택합니다.

인증서가 성공적으로 취소되면 인증서 목록에 **취소됨**으로 표시됩니다.

## 클라이언트 인증서(CLI) 취소
<a name="revoke-device-cert-cli"></a>

는 인증서를 취소하는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 명령을 AWS CLI 제공합니다.

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status REVOKED
```

명령이 성공하면 인증서가 `REVOKED` 상태가 됩니다. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html)를 실행하여 인증서의 상태를 확인합니다.

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 인증서를 다른 계정으로 이전합니다.
<a name="transfer-cert"></a>

하나에 속하는 X.509 인증서는 다른 인증서로 전송할 AWS 계정 수 있습니다 AWS 계정.

**X.509 인증서를 한 인증서에서 AWS 계정 다른 인증서로 전송하려면**

1. [인증서 전송 시작](#transfer-cert-init)

   전송을 시작하기 전에 인증서를 비활성화하고 모든 정책과 사물에서 분리해야 합니다.

1. [인증서 전송 수락 또는 거부](#transfer-cert-accept)

   수신 계정은 전송된 인증서를 명시적으로 수락하거나 거부해야 합니다. 수신 계정에서 인증서를 수락한 후에는 사용하기 전에 인증서를 활성화해야 합니다.

1. [인증서 전송 취소](#transfer-cert-cancel)

   인증서가 수락되지 않은 경우 원래 계정에서 전송을 취소할 수 있습니다.

## 인증서 전송 시작
<a name="transfer-cert-init"></a>

[AWS IoT 콘솔](https://console.aws.amazon.com/iot/home) 또는를 사용하여 인증서를 다른 AWS 계정 로 전송하기 시작할 수 있습니다 AWS CLI.

### 인증서 전송 시작(콘솔)
<a name="transfer-cert-init-console"></a>

이 절차를 완료하려면 전송할 인증서의 ID가 필요합니다.

전송할 인증서가 있는 계정에서 이 절차를 수행하세요.

**인증서를 다른 로 전송하기 시작하려면 AWS 계정**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

   전송하려는 **활성 상태** 또는 **비활성** 상태의 인증서를 선택하고 세부 정보 페이지를 엽니다.

1. 인증서의 **세부 정보** 페이지의 **작업** 메뉴에서 **비활성화** 옵션을 사용할 수 있는 경우 **비활성화** 옵션을 사용하여 인증서를 비활성화할 수 있습니다.

1. 인증서의 **세부 정보** 페이지의 왼쪽 메뉴에서 **정책**을 선택합니다.

1. 인증서의 **정책** 페이지에서 인증서에 연결된 정책이 있는 경우 정책의 옵션 메뉴를 열고 **분리**를 선택하여 각 정책을 분리합니다.

   계속하기 전에 인증서에는 정책이 연결되어 있으면 안 됩니다.

1. 인증서의 **정책** 페이지의 왼쪽 메뉴에서 **사물**을 선택합니다.

1. 인증서의 **사물** 페이지에서 인증서에 연결된 사물이 있는 경우 사물의 옵션 메뉴를 열고 **분리**를 선택하여 각 사물을 분리합니다.

   계속하기 전에 인증서에는 사물이 연결되어 있으면 안 됩니다.

1. 인증서의 **사물** 페이지의 왼쪽 메뉴에서 **세부 정보**를 선택합니다.

1. 인증서의 **세부 정보** 페이지의 **작업** 메뉴에서 **전송 시작**을 선택하고 **전송 시작** 대화 상자를 엽니다.

1. **전송 시작** 대화 상자에서 인증서를 수신할 계정의 AWS 계정 번호와 선택적 단축 메시지를 입력합니다.

1. **전송 시작**을 선택하여 인증서를 전송합니다.

콘솔에 전송의 성공 또는 실패를 나타내는 메시지가 표시됩니다. 전송이 시작된 경우 인증서의 상태가 **전송됨**으로 업데이트됩니다.

### 인증서 전송 시작(CLI)
<a name="transfer-cert-init-cli"></a>

이 절차를 완료하려면 전송하려는 인증서의 *certificateId* 및 *certificateArn*이 필요합니다.

전송할 인증서가 있는 계정에서 이 절차를 수행하세요.

**인증서를 다른 AWS 계정으로 이전하기 시작하려면**

1. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 명령을 사용하여 인증서를 비활성화합니다.

   ```
   aws iot update-certificate --certificate-id certificateId --new-status INACTIVE
   ```

1. 모든 정책을 분리합니다.

   1. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html) 명령을 사용하여 인증서에 연결되어 있는 정책을 나열합니다.

      ```
      aws iot list-attached-policies --target certificateArn
      ```

   1. 연결된 각 정책에 대해 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html) 명령을 사용하여 정책을 분리합니다.

      ```
      aws iot detach-policy --target certificateArn --policy-name policy-name
      ```

1. 모든 사물을 분리합니다.

   1. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html) 명령을 사용하여 인증서에 연결되어 있는 사물을 나열합니다.

      ```
      aws iot list-principal-things --principal certificateArn
      ```

   1. 연결된 각 사물에 대해 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html) 명령을 사용하여 사물을 분리합니다.

      ```
      aws iot detach-thing-principal --principal certificateArn --thing-name thing-name
      ```

1. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html) 명령을 사용하여 인증서 전송을 시작합니다.

   ```
   aws iot transfer-certificate --certificate-id certificateId --target-aws-account account-id
   ```

## 인증서 전송 수락 또는 거부
<a name="transfer-cert-accept"></a>

[AWS IoT 콘솔](https://console.aws.amazon.com/iot/home) 또는를 사용하여 다른에서 전송 AWS 계정 AWS 계정 된 인증서를 수락하거나 거부할 수 있습니다 AWS CLI.

### 인증서 전송 수락 또는 거부(콘솔)
<a name="transfer-cert-accept-console"></a>

이 절차를 완료하려면 계정으로 전송한 인증서의 ID가 필요합니다.

전송된 인증서를 수신하는 계정에서 이 절차를 수행하세요.

**로 전송된 인증서를 수락하거나 거부하려면 AWS 계정**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

   수락 또는 거부하려는 **전송 대기 중** 상태의 인증서를 선택하고 세부 정보 페이지를 엽니다.

1. 인증서의 **세부 정보** 페이지의 **작업** 메뉴에서
   + 인증서를 수락하려면 **전송 수락**을 선택합니다.
   + 인증서를 수락하지 않으려면 **전송 거부**를 선택합니다.

### 인증서 전송 수락 또는 거부(CLI)
<a name="transfer-cert-accept-cli"></a>

이 절차를 완료하려면 수락 또는 거부하려는 인증서 전송의 *certificateId*가 필요합니다.

전송된 인증서를 수신하는 계정에서 이 절차를 수행하세요.

**로 전송된 인증서를 수락하거나 거부하려면 AWS 계정**

1. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html) 명령을 사용하여 인증서를 수락합니다.

   ```
   aws iot accept-certificate-transfer --certificate-id certificateId
   ```

1. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html) 명령을 사용하여 인증서를 거부합니다.

   ```
   aws iot reject-certificate-transfer --certificate-id certificateId
   ```

## 인증서 전송 취소
<a name="transfer-cert-cancel"></a>

[AWS IoT 콘솔](https://console.aws.amazon.com/iot/home) 또는 AWS CLI을(를) 사용하여 수락하기 전에 인증서 전송을 취소할 수 있습니다.

### 인증서 전송 취소(콘솔)
<a name="transfer-cert-cancel-console"></a>

이 절차를 완료하려면 취소하려는 인증서 전송의 ID가 필요합니다.

인증서 전송을 시작한 계정에서 이 절차를 수행하세요.

**인증서 전송을 취소하려면**

1.  AWS Management Console에 로그인하고 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 엽니다.

1. 왼쪽 탐색 창에서 **보안(Secure)**을 선택한 후 **인증서(Certificates)**를 선택합니다.

   취소하려는 **전송됨** 상태의 인증서를 선택하고 옵션 메뉴를 엽니다.

1. 인증서의 옵션 메뉴에서 **전송 취소** 옵션을 선택하여 인증서 전송을 취소합니다.
**중요**  
**전송 취소** 옵션을 **취소** 옵션과 혼동하지 않도록 주의하세요.  
**전송 취소** 옵션은 인증서 전송을 취소하고 **취소** 옵션은 인증서를 불가역적으로 사용 불가능하게 만듭니다. AWS IoT.

### 인증서 전송 취소(CLI)
<a name="transfer-cert-cancel-cli"></a>

이 절차를 완료하려면 취소하려는 인증서 전송의 *certificateId*가 필요합니다.

인증서 전송을 시작한 계정에서 이 절차를 수행하세요.

[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html) 명령을 사용하여 인증서 전송을 취소합니다.

```
aws iot cancel-certificate-transfer --certificate-id certificateId
```

# 사용자 지정 클라이언트 인증서 검증
<a name="customize-client-auth"></a>

AWS IoT Core 는 X.509 클라이언트 인증서에 대한 사용자 지정 클라이언트 인증서 검증을 지원하여 클라이언트 인증 관리를 개선합니다. 이 인증서 검증 방법은 사전 인증 인증서 검사라고도 하며, 이 검사에서는 자체 기준(Lambda 함수에 정의)을 기반으로 클라이언트 인증서를 평가하고 클라이언트 인증서 또는 인증서의 서명 인증 기관(CA) 인증서를 취소하여 클라이언트가 AWS IoT Core에 연결되지 않도록 합니다. 예를 들어 [온라인 인증서 상태 프로토콜(OCSP)](https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol) 또는 [인증서 해지 목록(CRL)](https://en.wikipedia.org/wiki/Certificate_revocation_list) 엔드포인트를 지원하는 검증 기관과 비교하여 인증서의 상태를 검증하고 취소된 인증서가 있는 클라이언트에 대한 연결을 방지하는 자체 인증서 해지 검사를 생성할 수 있습니다. 클라이언트 인증서를 평가하는 데 사용되는 기준은 Lambda 함수(사전 인증 Lambda라고도 함)에 정의됩니다. 도메인 구성에서 엔드포인트 세트를 사용해야 하며 [인증 유형](protocols.md#connection-protocol-auth-mode)은 X.509 인증서여야 합니다. 또한 클라이언트는 연결할 때 [서버 이름 표시(SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 확장을 제공해야 합니다 AWS IoT Core.

**참고**  
이 기능은 AWS GovCloud (US) 리전에서 지원되지 않습니다.

**Topics**
+ [1단계:에 X.509 클라이언트 인증서 등록 AWS IoT Core](#client-auth-cert-verification)
+ [2단계: Lambda 함수 생성](#customize-client-auth-lambda)
+ [3단계: Lambda 함수 AWS IoT 호출 권한 부여](#customize-client-configuration-grant-permission)
+ [4단계: 도메인에 대한 인증 구성 설정](#customize-client-configuration)

## 1단계:에 X.509 클라이언트 인증서 등록 AWS IoT Core
<a name="client-auth-cert-verification"></a>

아직 등록하지 않은 경우에 [X.509 클라이언트 인증서를](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) 등록하고 활성화합니다 AWS IoT Core. 그렇지 않은 경우 다음 단계로 건너뜁니다.

에 클라이언트 인증서를 등록하고 활성화하려면 다음 단계를 AWS IoT Core따릅니다.

1. [를 사용하여 직접 클라이언트 인증서를 생성하는 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html) 경우. 이러한 클라이언트 인증서는에 자동으로 등록됩니다 AWS IoT Core.

1. [자체 클라이언트 인증서를 생성하는](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html) 경우 [다음 지침에 따라 인증서를 등록합니다 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. 클라이언트 인증서를 활성화하려면 [다음 지침](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)을 따르세요.

## 2단계: Lambda 함수 생성
<a name="customize-client-auth-lambda"></a>

인증서 확인을 수행하고 구성된 엔드포인트에 대한 모든 클라이언트 연결 시도에 대해 호출되는 Lambda 함수를 생성해야 합니다. 이 Lambda 함수를 생성할 때는 [첫 번째 Lambda 함수 생성](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)의 일반 지침을 따릅니다. 또한 Lambda 함수가 다음과 같이 예상 요청 및 응답 형식을 준수하는지 확인합니다.

**Lambda 함수 이벤트 예제**

```
{
	"connectionMetadata": {
		"id": "string"
	},
	"principalId": "string",
	"serverName": "string",
	"clientCertificateChain": [
		"string",
		"string"
	]
}
```

`connectionMetadata`  
클라이언트의 AWS IoT Core에 대한 연결과 관련된 메타데이터 또는 추가 정보입니다.

`principalId`  
TLS 연결에서 클라이언트와 연결된 위탁자 식별자입니다.

`serverName`  
[서버 이름 표시(SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 호스트 이름 스트링입니다. AWS IoT Core 는 디바이스가 [SNI 확장](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)을 Transport Layer Security (TLS) 프로토콜로 전송하고 `host_name` 필드에 전체 엔드포인트 주소를 제공하도록 요구합니다.

`clientCertificateChain`  
클라이언트의 X.509 인증서 체인을 나타내는 문자열 배열입니다.

**Lambda 함수 응답 예제**

```
{
	"isAuthenticated": "boolean"
}
```

`isAuthenticated`  
요청 인증 여부를 나타내는 부울 값입니다.

**참고**  
Lambda 응답에서 추가 인증 및 권한 부여를 진행하려면 `isAuthenticated`가 반드시 `true`여야 합니다. 그렇지 않으면 IoT 클라이언트 인증서를 비활성화하고 추가 인증 및 권한 부여를 위해 X.509 클라이언트 인증서를 사용한 사용자 지정 인증을 차단할 수 있습니다.

## 3단계: Lambda 함수 AWS IoT 호출 권한 부여
<a name="customize-client-configuration-grant-permission"></a>

Lambda 함수를 생성한 후 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 명령을 사용하여 AWS IoT 에 호출 권한을 부여해야 합니다. 이 Lambda 함수는 구성된 엔드포인트에 연결할 때마다 간접적으로 호출됩니다. 자세한 내용은 [Lambda 함수 호출 권한 부여 AWS IoT 를 참조하세요](custom-auth-authorize.md).

## 4단계: 도메인에 대한 인증 구성 설정
<a name="customize-client-configuration"></a>

다음 섹션에서는 AWS CLI를 사용하여 사용자 지정 도메인에 대한 인증 구성을 설정하는 방법을 설명합니다.

### 도메인에 대한 클라이언트 인증서 구성 설정(CLI)
<a name="customize-client-auth-cli"></a>

도메인 구성이 없는 경우 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) CLI 명령을 사용하여 생성합니다. 도메인 구성이 이미 있는 경우 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) CLI 명령을 사용하여 도메인에 대한 클라이언트 인증서 구성을 업데이트합니다. 이전 단계에서 생성한 Lambda 함수의 ARN을 추가해야 합니다.

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config 'clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config '{"clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

`domain-configuration-name`  
도메인 구성의 이름입니다.

`authentication-type`  
도메인 구성의 인증 유형입니다. 자세한 내용은 [인증 유형 선택](protocols.md#connection-protocol-auth-mode)을 참조하세요.

`application-protocol`  
 AWS IoT Core와 통신하는 데 사용하는 디바이스의 애플리케이션 프로토콜입니다. 자세한 내용은 [애플리케이션 프로토콜 선택](protocols.md#protocol-selection)을 참조하세요.

`client-certificate-config`  
도메인의 클라이언트 인증 구성을 지정하는 객체입니다.

`clientCertificateCallbackArn`  
새 연결이 설정될 때 TLS 계층에서 AWS IoT 호출하는 Lambda 함수의 Amazon 리소스 이름(ARN)입니다. 사용자 지정 클라이언트 인증서 검증을 수행하도록 클라이언트 인증을 사용자 지정하려면 이전 단계에서 생성한 Lambda 함수의 ARN을 추가해야 합니다.

자세한 내용은 *AWS IoT API 참조*의 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html) 및 [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)을 참조하세요. 도메인 구성에 대한 자세한 내용은 [Domain configurations](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)를 참조하세요.

# IAM 사용자, 그룹 및 역할
<a name="iam-users-groups-roles"></a>

IAM 사용자, 그룹 및 역할은 AWS에서 자격 증명 및 인증을 관리하기 위한 표준 메커니즘입니다. SDK AWS 및를 사용하여 AWS IoT HTTP 인터페이스에 연결할 수 있습니다 AWS CLI.

또한 IAM 역할을 사용하면 AWS IoT 가 사용자를 대신하여 계정의 다른 AWS 리소스에 액세스할 수 있습니다. 예를 들어 디바이스가 DynamoDB 테이블에 상태를 게시하도록 하려면 IAM 역할을 통해가 Amazon DynamoDB와 상호 작용 AWS IoT 할 수 있습니다. 자세한 내용은 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)을 참조하세요.

HTTP를 통한 메시지 브로커 연결의 경우 서명 버전 4 서명 프로세스를 사용하여 사용자, 그룹 및 역할을 AWS IoT 인증합니다. 자세한 내용은 [AWS API 요청 서명을 참조하세요](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html).

에서 AWS 서명 버전 4를 사용하는 경우 AWS IoT클라이언트는 TLS 구현에서 다음을 지원해야 합니다.
+ TLS 1.2
+ SHA-256 RSA 인증서 서명 검증
+ TLS 암호 그룹 지원 섹션에서 암호 그룹 중 하나

자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 단원을 참조하세요.

# Amazon Cognito 자격 증명
<a name="cognito-identities"></a>

Amazon Cognito 자격 증명을 사용하면 모바일 및 웹 애플리케이션에서 사용할 수 있는 제한된 임시 권한 AWS 자격 증명을 생성할 수 있습니다. Amazon Cognito 자격 증명을 사용하는 경우, 사용자의 고유 자격 증명을 생성하는 ID 풀을 생성하여 Login with Amazon, Facebook 및 Google과 같은 자격 증명 공급자를 사용하여 인증하는 ID 풀을 생성합니다. 자체 개발자 인증 자격 증명과 함께 Amazon Cognito 자격 증명을 사용할 수도 있습니다. 자세한 내용은 [Amazon Cognito 자격 증명](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)을 참조하세요.

Amazon Cognito 자격 증명을 사용하려면 IAM 역할과 연결된 Amazon Cognito ID 풀을 정의합니다. IAM 역할은 ID 풀의 ID에 서비스 호출 AWS 과 같은 AWS 리소스에 액세스할 수 있는 권한을 부여하는 IAM 정책과 연결됩니다.

Amazon Cognito 자격 증명은 인증되지 않은 자격 증명 및 인증된 자격 증명을 생성합니다. 인증되지 않은 자격 증명은 로그인하지 않고 앱을 사용하려는 모바일 또는 웹 애플리케이션의 게스트 사용자에게 사용됩니다. 인증되지 않은 사용자에게는 자격 증명 풀과 연결된 IAM 정책에 지정된 권한만 부여됩니다.

인증된 자격 증명을 사용하는 경우 자격 증명 풀에 연결된 IAM 정책 외에도 Amazon Cognito 자격 증명에 AWS IoT 정책을 연결해야 합니다. AWS IoT 정책을 연결하려면 [AttachPolicy](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachPolicy.html) API를 사용하고 AWS IoT 애플리케이션의 개별 사용자에게 권한을 부여합니다. AWS IoT 정책을 사용하여 특정 고객과 디바이스에 세분화된 권한을 할당할 수 있습니다.

인증된 사용자와 인증되지 않은 사용자의 자격 증명 유형은 서로 다릅니다. Amazon Cognito 자격 증명에 AWS IoT 정책을 연결하지 않으면 인증된 사용자가에서 권한 부여에 실패 AWS IoT 하고 AWS IoT 리소스 및 작업에 액세스할 수 없습니다. Amazon Cognito 자격 증명에 대한 정책을 생성하는 방법에 대한 자세한 내용은 [게시/구독 정책 예제](pub-sub-policy.md) 및 [Amazon Cognito 자격 증명으로 권한 부여](cog-iot-policies.md) 섹션을 참조하세요.

![\[Amazon Cognito 자격 증명을 사용하여 디바이스에 액세스하는 앱입니다.\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/images/device-cognito.png)


# 사용자 지정 인증 및 권한 부여
<a name="custom-authentication"></a>

 AWS IoT Core 를 사용하면 사용자 지정 권한 부여자를 정의하여 자체 클라이언트 인증 및 권한 부여를 관리할 수 있습니다. 이는에서 AWS IoT Core 기본적으로 지원하는 인증 메커니즘 이외의 인증 메커니즘을 사용해야 하는 경우에 유용합니다. (기본적으로 지원되는 메커니즘에 대한 자세한 내용은 [클라이언트 인증](client-authentication.md) 단원을 참조하세요).  

 예를 들어 필드의 기존 디바이스를 로 마이그레이션 AWS IoT Core 하고 이러한 디바이스가 사용자 지정 보유자 토큰 또는 MQTT 사용자 이름과 암호를 사용하여 인증하는 경우 새 자격 증명을 프로비저닝 AWS IoT Core 하지 않고도 로 마이그레이션할 수 있습니다. 가 AWS IoT Core 지원하는 모든 통신 프로토콜에서 사용자 지정 인증을 사용할 수 있습니다. AWS IoT Core 이(가) 지원하는 프로토콜 및 포트에 대한 자세한 내용은 [디바이스 통신 프로토콜](protocols.md) 단원을 참조하세요.

**Topics**
+ [사용자 지정 인증 워크플로 이해](custom-authorizer.md)
+ [사용자 지정 권한 부여자 생성 및 관리(CLI)](config-custom-auth.md)
+ [X.509 클라이언트 인증서를 사용한 사용자 지정 인증](custom-auth-509cert.md)
+ [사용자 지정 인증을 사용하여 AWS IoT Core 에 연결](custom-auth.md)
+ [Lambda 권한 부여자 문제 해결](custom-auth-troubleshooting.md)

# 사용자 지정 인증 워크플로 이해
<a name="custom-authorizer"></a>

사용자 지정 인증은 [권한 부여자 리소스](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html)를 사용하여 클라이언트를 인증하고 권한을 부여하는 방법을 정의할 수 있도록 합니다.   각 권한 부여자에는 고객 관리형 Lambda 함수에 대한 참조, 디바이스 자격 증명을 검증하기 위한 공개 키 옵션 및 추가 구성 정보가 포함되어 있습니다. 다음 다이어그램은 AWS IoT Core에서 사용자 지정 인증에 대한 권한 부여 워크플로를 보여 줍니다.

![\[AWS IoT Core에서 사용자 지정 인증을 위한 사용자 지정 권한 부여 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core 사용자 지정 인증 및 권한 부여 워크플로
<a name="custom-authentication-workflow"></a>

다음 목록에서는 사용자 지정 인증 및 권한 부여 워크플로의 각 단계를 설명합니다.

1. 디바이스는 지원되는 중 하나를 사용하여 고객의 AWS IoT Core 데이터 엔드포인트에 연결합니다[디바이스 통신 프로토콜](protocols.md). 디바이스는 요청의 헤더 필드 또는 쿼리 파라미터(HTTP Publish 또는 WebSockets 프로토콜을 통한 MQTT의 경우) 중 하나에서, 또는 MQTT CONNECT 메시지의 사용자 이름 및 암호 필드(MQTT 및 WebSockets 프로토콜을 통한 MQTT의 경우)에서 자격 증명을 전달합니다.

1. AWS IoT Core 는 다음 두 가지 조건 중 하나를 확인합니다.
   + 수신되는 요청이 권한 부여자를 지정합니다.
   + 요청을 수신하는 AWS IoT Core 데이터 엔드포인트에는 기본 권한 부여자가 구성되어 있습니다.

   가 이러한 방법 AWS IoT Core 중 하나로 권한 부여자를 AWS IoT Core 찾으면는 권한 부여자와 연결된 Lambda 함수를 트리거합니다.

1.  (선택 사항) 토큰 서명을 활성화한 경우는 Lambda 함수를 트리거하기 전에 권한 부여자에 저장된 퍼블릭 키를 사용하여 요청 서명을 AWS IoT Core 확인합니다. 유효성 검사에 실패하면 AWS IoT Core 이(가) Lambda 함수를 호출하지 않고 요청을 중지합니다.  

1. Lambda 함수는 요청에서 자격 증명 및 연결 메타데이터를 수신하고 인증 결정을 내립니다.

1. Lambda 함수는 인증 결정 결과와 연결에서 허용되는 작업을 지정하는 AWS IoT Core 정책 문서를 반환합니다. 또한 Lambda 함수는가 Lambda 함수를 호출하여 요청의 자격 증명을 AWS IoT Core 재검증하는 빈도를 지정하는 정보도 반환합니다.

1. AWS IoT Core 는 Lambda 함수에서 수신한 정책을 기준으로 연결에 대한 활동을 평가합니다.

1. 연결이 설정되고 사용자 지정 권한 부여자 Lambda가 처음 호출되면 MQTT 작업 없이 유휴 연결에서 다음 간접 호출을 최대 5분 동안 지연할 수 있습니다. 그런 다음 후속 간접 호출은 사용자 지정 권한 부여자 Lambda의 새로 고침 간격을 따릅니다. 이 접근 방식은의 Lambda 동시성 제한을 초과할 수 있는 과도한 호출을 방지할 수 있습니다 AWS 계정.

## 스케일 아웃 고려 사항
<a name="custom-authentication-scaling"></a>

 Lambda 함수는 권한 부여자에 대한 인증 및 권한 부여를 처리하므로 동시 실행 속도와 같은 Lambda 요금 및 서비스 제한이 적용됩니다. Lambda 요금에 대한 자세한 내용은 [Lambda 요금](https://aws.amazon.com/lambda/pricing/) 단원을 참조하세요. Lambda 함수 응답에서 `refreshAfterInSeconds` 및 `disconnectAfterInSeconds` 파라미터를 조정하여 Lambda 함수의 로드를 관리할 수 있습니다. Lambda 함수 응답의 내용에 대한 자세한 내용은 [Lambda 함수 정의](custom-auth-lambda.md) 단원을 참조하세요.

**참고**  
서명을 활성화한 상태로 두면 인식할 수 없는 클라이언트가 Lambda를 과도하게 트리거하는 것을 방지할 수 있습니다. 권한 부여자의 로그인을 비활성화하기 전에 이 점을 고려하세요.

**참고**  
사용자 지정 권한 부여자에 대한 Lambda 함수 제한 시간은 5초입니다.

# 사용자 지정 권한 부여자 생성 및 관리(CLI)
<a name="config-custom-auth"></a>

AWS IoT Core 는 사용자 지정 권한 부여자를 사용하여 사용자 지정 인증 및 권한 부여 체계를 구현합니다. 사용자 지정 권한 부여자는 특정 요구 사항에 따라 규칙과 정책을 정의하고 구현할 수 있는 유연성을 제공하는 AWS IoT Core 리소스입니다. 단계별 지침에 따라 사용자 지정 권한 부여자를 생성하려면 [Tutorial: Creating a custom authorizer for AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html)를 참조하세요.

각 권한 부여자는 다음과 같은 구성 요소로 이루어집니다.
+  *이름*: 권한 부여자를 식별하는 고유한 사용자 정의 문자열입니다.
+  *ARN Lambda 함수*: 권한 부여 및 인증 논리를 구현하는 Lambda 함수의 Amazon 리소스 이름(ARN)입니다.  
+  *토큰 키 이름*: 서명 유효성 검사를 수행하기 위해 HTTP 헤더, 쿼리 파라미터 또는 MQTT CONNECT 사용자 이름에서 토큰을 추출하는 데 사용되는 키 이름입니다. 권한 부여자에서 서명이 활성화된 경우 이 값이 필요합니다.
+  *서명 비활성화 플래그(선택 사항)*: 자격 증명에서 서명 요구 사항을 사용하지 않도록 설정할지 여부를 지정하는 부울 값입니다. 이 기능은 MQTT 사용자 이름 및 암호를 사용하는 인증 스키마와 같이 자격 증명에 서명하는 것이 의미가 없는 시나리오에 유용합니다. 기본값은 `false`(으)로 설정되어 있으므로 기본적으로 서명이 활성화됩니다.
+  *토큰 서명 공개 키*: AWS IoT Core 이(가) 토큰 서명의 유효성을 검사하는 데 사용하는 퍼블릭 키입니다. 최소 길이는 2,048비트입니다. 권한 부여자에서 서명이 활성화된 경우 이 값이 필요합니다.  

Lambda는 Lambda 함수가 실행되는 횟수와 함수의 코드가 실행되는 데 걸리는 시간에 대해 요금을 청구합니다. Lambda 요금에 대한 자세한 내용은 [Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하세요. Lambda 함수에 대한 자세한 내용은 [Lambda 개발자 가이드](https://docs.aws.amazon.com/lambda/latest/dg/)를 참조하세요.

**참고**  
서명을 활성화한 상태로 두면 인식할 수 없는 클라이언트가 Lambda를 과도하게 트리거하는 것을 방지할 수 있습니다. 권한 부여자의 로그인을 비활성화하기 전에 이 점을 고려하세요.

**참고**  
사용자 지정 권한 부여자에 대한 Lambda 함수 제한 시간은 5초입니다.

**Topics**
+ [Lambda 함수 정의](custom-auth-lambda.md)
+ [권한 부여자 생성](custom-auth-create-authorizer.md)
+ [Lambda 함수 AWS IoT 호출 권한 부여](custom-auth-authorize.md)
+ [권한 부여자 테스트](custom-auth-testing.md)
+ [사용자 지정 권한 부여자 관리](custom-auth-manage.md)

# Lambda 함수 정의
<a name="custom-auth-lambda"></a>

 가 권한 부여자를 AWS IoT Core 호출하면 다음 JSON 객체가 포함된 이벤트와 함께 권한 부여자와 연결된 Lambda가 트리거됩니다. 예제 JSON 객체에는 가능한 모든 필드가 포함되어 있습니다. 연결 요청과 관련이 없는 필드는 포함되지 않습니다.

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 Lambda 함수는 이 정보를 사용하여 들어오는 연결을 인증하고 연결에 허용되는 작업을 결정해야 합니다. 함수는 다음 값을 포함하는 응답을 전송해야 합니다.
+  `isAuthenticated`: 요청 인증 여부를 나타내는 부울 값입니다.
+  `principalId`: 사용자 지정 권한 부여 요청에서 전송되는 토큰의 식별자 역할을 하는 영숫자 문자열입니다. 값은 1\$1128자의 영숫자 문자열이어야 하며 정규식(regex) 패턴 `([a-zA-Z0-9]){1,128}`과 일치해야 합니다. 영숫자가 아닌 특수 문자는 `principalId`에서와 함께 사용할 수 없습니다 AWS IoT Core. 에 영숫자가 아닌 특수 문자가 허용되는 경우 다른 AWS 서비스에 대한 설명서를 참조하세요`principalId`.
+  `policyDocuments`: JSON 형식의 AWS IoT Core 정책 문서 목록 AWS IoT Core 정책 생성에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT Core 정책](iot-policies.md). 정책 문서의 최대 수는 10개의 정책 문서입니다. 각 정책 문서는 최대 2,048자를 포함할 수 있습니다.
+  `disconnectAfterInSeconds`: AWS IoT Core 게이트웨이에 대한 연결의 최대 지속 시간(초)을 지정하는 정수입니다. 최소값은 300초이고 최대값은 86,400초입니다. 기본값은 86,400입니다.
**참고**  
`disconnectAfterInSeconds`(Lambda 함수에서 반환됨) 값은 연결이 설정될 때 설정됩니다. 후속 정책 새로 고침 Lambda 간접 호출 중에는 이 값을 수정할 수 없습니다.
+  `refreshAfterInSeconds`: 정책 새로 고침 사이의 간격을 지정하는 정수입니다. 이 간격이 경과하면 AWS IoT Core 은(는) Lambda 함수를 호출하여 정책 새로 고침을 허용합니다. 최소값은 300초이고 최대값은 86,400초입니다.

  다음 JSON 객체에는 Lambda 함수가 전송할 수 있는 응답의 예가 들어 있습니다.

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 `policyDocument` 값에는 유효한 AWS IoT Core 정책 문서가 포함되어야 합니다. AWS IoT Core 정책에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT Core 정책](iot-policies.md).  MQTT over TLS 및 MQTT over WebSockets 연결에서 `refreshAfterInSeconds` 필드 값에 지정된 간격 동안이 정책을 AWS IoT Core 캐시합니다. HTTP 연결의 경우 디바이스가 HTTP 지속 연결(HTTP 연결 유지 또는 HTTP 연결 재사용이라고도 함)을 사용하지 않는 한 모든 권한 부여 요청에 대해 Lambda 함수가 호출됩니다. 권한 부여자를 구성할 때 캐싱을 사용하도록 선택할 수 있습니다. 이 간격 동안는 Lambda 함수를 다시 트리거하지 않고이 캐시된 정책에 대해 설정된 연결의 작업을 AWS IoT Core 승인합니다. 사용자 지정 인증 중에 오류가 발생하면는 연결을 AWS IoT Core 종료합니다. AWS IoT Core 또한 `disconnectAfterInSeconds`파라미터에 지정된 값보다 오래 열려 있으면 연결을 종료합니다.

 다음 JavaScript에는 값이 인 MQTT Connect 메시지에서 암호를 찾고 이름이 인 클라이언트 AWS IoT Core 와 연결하고 동일한 클라이언트 이름이 포함된 주제에 `myClientName` 게시할 수 있는 권한을 부여하는 정책을 `test` 반환하는 샘플 Node.js Lambda 함수가 포함되어 있습니다. 예상된 암호를 찾지 못하면 이 두 작업을 거부하는 정책을 반환합니다.

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 앞의 Lambda 함수는 MQTT Connect 메시지에서 `test`의 예상 암호를 수신하면 다음 JSON 값을 반환합니다. `password` 및 `principalId` 속성의 값은 MQTT Connect 메시지의 값이 됩니다.

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# 권한 부여자 생성
<a name="custom-auth-create-authorizer"></a>

 [CreateAuthorizer API](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html)를 사용하여 권한 부여자를 생성할 수 있습니다. 다음 예에서는 이 명령에 대해 설명합니다.

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

`signing-disabled` 파라미터를 사용하여 권한 부여자를 호출할 때마다 서명 유효성 검사를 옵트아웃합니다. 필요한 경우가 아니면 서명을 비활성화하지 않는 것이 좋습니다. 서명 유효성 검사는 알 수 없는 디바이스에서 Lambda 함수를 과도하게 호출하지 않도록 보호합니다. 생성한 후에는 권한 부여자의 `signing-disabled` 상태를 업데이트 할 수 없습니다. 이 동작을 변경하려면 `signing-disabled` 파라미터에 대해 또 다른 값의 사용자 지정 권한 부여자를 생성해야 합니다.

`tokenKeyName` 및 `tokenSigningPublicKeys` 파라미터의 값은 서명을 사용하지 않도록 설정한 경우 선택 사항입니다. 서명이 활성화된 경우 필수 값입니다.

Lambda 함수와 사용자 지정 권한 부여자를 생성한 후에는 사용자를 대신하여 함수를 호출할 수 있는 AWS IoT Core 서비스 권한을 명시적으로 부여해야 합니다. 다음 명령을 사용하여이 작업을 수행할 수 있습니다.

**참고**  
기본 IoT 엔드포인트는 Lambda 함수와 함께 사용자 지정 권한 부여자를 사용하도록 지원하지 않을 수 있습니다. 그 대신, 도메인 구성을 사용하여 새 엔드포인트를 정의한 다음, 사용자 지정 권한 부여자에 대해 해당 엔드포인트를 지정할 수 있습니다.

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# Lambda 함수 AWS IoT 호출 권한 부여
<a name="custom-auth-authorize"></a>

이 섹션에서는 방금 생성한 사용자 지정 권한 부여자 리소스에 Lambda 함수를 실행할 수 있는 권한을 부여합니다. 권한을 부여하려면 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 명령을 사용할 수 있습니다.

**를 사용하여 Lambda 함수에 권한 부여 AWS CLI**

1. 값을 삽입한 후 다음 명령을 입력합니다. 참고: `statement-id` 값은 고유해야 합니다. `Id-1234`을(를) 정확한 값으로 바꿉니다. 그렇지 않으면 `ResourceConflictException` 오류가 발생할 수 있습니다.

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. 명령이 성공하면 이 예제와 같은 권한 문이 반환됩니다. 다음 단원을 계속하여 사용자 지정 권한 부여자를 테스트할 수 있습니다.

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   명령이 성공하지 못하면 이 예제와 같은 오류가 반환됩니다. 계속하기 전에 오류를 검토하고 수정해야 합니다.

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# 권한 부여자 테스트
<a name="custom-auth-testing"></a>

 [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html) API를 사용하여 권한 부여자의 호출 및 반환 값을 테스트합니다. 이 API를 사용하면 권한 부여자에서 프로토콜 메타데이터를 지정하고 서명 유효성 검사를 테스트할 수 있습니다.

다음 탭은를 사용하여 권한 부여자를 테스트 AWS CLI 하는 방법을 보여줍니다.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

`token-signature` 파라미터의 값은 서명된 토큰입니다. 이 값을 얻는 방법을 알아보려면 [토큰에 서명하기](custom-auth.md#custom-auth-token-signature) 단원을 참조하세요.

권한 부여자가 사용자 이름과 암호를 얻은 경우 `--mqtt-context` 파라미터를 사용하여 이 정보를 전달할 수 있습니다. 다음 탭은 `TestInvokeAuthorizer` API를 사용하여 사용자 이름, 암호 및 클라이언트 이름이 포함된 JSON 객체를 사용자 지정 권한 부여자에게 전송하는 방법을 보여줍니다.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

암호는 base64 인코딩해야 합니다. 다음 예제에서는 Unix 계열 환경에서 암호를 인코딩하는 방법을 보여 줍니다.

```
echo -n PASSWORD | base64
```

# 사용자 지정 권한 부여자 관리
<a name="custom-auth-manage"></a>

 다음 API를 사용하여 권한 부여자를 관리할 수 있습니다.
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): 계정에 속한 모든 권한 부여자를 표시합니다.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): 지정한 권한 부여자의 속성을 표시합니다. 이러한 값에는 생성 날짜, 마지막 수정 날짜 및 기타 속성이 포함됩니다.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): AWS IoT Core 데이터 엔드포인트의 기본 권한 부여자를 지정합니다. 디바이스가 AWS IoT Core 자격 증명을 전달하지 않고 권한 부여자를 지정하지 않은 경우이 권한 부여자를 AWS IoT Core 사용합니다. 자격 AWS IoT Core 증명 사용에 대한 자세한 내용은 섹션을 참조하세요[클라이언트 인증](client-authentication.md).
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): 지정된 권한 부여자의 상태, 토큰 키 이름 또는 퍼블릭 키를 변경합니다.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): 지정된 권한 부여자를 삭제합니다.

**참고**  
 권한 부여자의 서명 요구 사항은 업데이트할 수 없습니다. 즉, 필요한 기존 권한 부여자에서 로그인을 비활성화할 수 없습니다. 또한 필요하지 않은 기존 권한 부여자에는 로그인을 요구할 수 없습니다.

# X.509 클라이언트 인증서를 사용한 사용자 지정 인증
<a name="custom-auth-509cert"></a>

디바이스를 연결할 때 AWS IoT Core여러 [인증 유형을](protocols.md#connection-protocol-auth-mode) 사용할 수 있습니다. 클라이언트 및 디바이스 연결을 인증하는 데 사용할 수 있는 [X.509 클라이언트 인증서](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)를 사용하거나 사용자 [지정 권한 부여자](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)를 정의하여 자체 클라이언트 인증 및 권한 부여 로직을 관리할 수 있습니다. 이 주제에서는 X.509 클라이언트 인증서와 함께 사용자 지정 인증을 사용하는 방법을 다룹니다.

X.509 인증서를 사용하여 디바이스를 이미 인증하고 추가 검증 및 사용자 지정 인증을 수행하려는 경우 X.509 인증서를 사용하여 사용자 지정 인증을 사용하는 것이 도움이 될 수 있습니다. 예를 들어 X.509 클라이언트 인증서에 일련 번호와 같은 디바이스의 데이터를 저장하는 경우 X.509 클라이언트 인증서를 AWS IoT Core 인증한 후 사용자 지정 권한 부여자를 사용하여 인증서의 CommonName 필드에 저장된 정보를 기반으로 특정 디바이스를 식별할 수 있습니다. X.509 인증서와 함께 사용자 지정 인증을 사용하면 디바이스를에 연결할 때 디바이스 보안 관리를 개선하고 인증 및 권한 부여 로직을 보다 유연하게 관리할 수 있습니다. AWS IoT Core 는 X.509 인증서 및 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) 프로토콜과 [HTTPS](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) 프로토콜 모두에서 작동하는 사용자 지정 권한 부여자 인증 유형을 사용하여 X.509 인증서를 사용한 사용자 지정 인증을 AWS IoT Core 지원합니다. AWS IoT Core 디바이스 엔드포인트가 지원하는 인증 유형 및 애플리케이션 프로토콜에 대한 자세한 내용은 [Device communication protocols](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html) 섹션을 참조하세요.

**참고**  
X.509 클라이언트 인증서를 사용한 사용자 지정 인증은 AWS GovCloud (US) 리전에서 지원되지 않습니다.

**중요**  
[도메인 구성](iot-custom-endpoints-configurable.md) 을 사용하여 생성된 엔드포인트를 사용해야 합니다. 또한 클라이언트는 연결할 때 [서버 이름 표시(SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 확장을 제공해야 합니다 AWS IoT Core.

**Topics**
+ [1단계:에 X.509 클라이언트 인증서 등록 AWS IoT Core](#custom-auth-509cert-client)
+ [2단계: Lambda 함수 생성](#custom-auth-509cert-lambda)
+ [3단계: 사용자 지정 권한 부여자 생성](#custom-auth-509cert-authorizer)
+ [4단계: 도메인 구성에서 인증 유형 및 애플리케이션 프로토콜 설정](#custom-auth-509cert-domainconfig)

## 1단계:에 X.509 클라이언트 인증서 등록 AWS IoT Core
<a name="custom-auth-509cert-client"></a>

아직 등록하지 않은 경우에 [X.509 클라이언트 인증서를](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) 등록하고 활성화합니다 AWS IoT Core. 그렇지 않은 경우 다음 단계로 건너뜁니다.

에 클라이언트 인증서를 등록하고 활성화하려면 다음 단계를 AWS IoT Core따릅니다.

1. [를 사용하여 직접 클라이언트 인증서를 생성하는 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html) 경우. 이러한 클라이언트 인증서는에 자동으로 등록됩니다 AWS IoT Core.

1. [자체 클라이언트 인증서를 생성하는](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html) 경우 [다음 지침에 따라 인증서를 등록합니다 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. 클라이언트 인증서를 활성화하려면 [다음 지침](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)을 따르세요.

## 2단계: Lambda 함수 생성
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core 는 사용자 지정 권한 부여자를 사용하여 사용자 지정 인증 및 권한 부여 체계를 구현합니다. 사용자 지정 권한 부여자는 디바이스가 인증되었는지 여부와 디바이스가 수행할 수 있는 작업을 결정하는 Lambda 함수와 연결됩니다. 디바이스가에 연결되면 권한 부여자 이름 및 연결된 Lambda 함수를 포함한 권한 부여자 세부 정보를 AWS IoT Core AWS IoT Core 검색하고 Lambda 함수를 호출합니다. Lambda 함수는 디바이스의 X.509 클라이언트 인증서 데이터가 포함된 JSON 객체가 포함된 이벤트를 수신합니다. Lambda 함수는 이 이벤트 JSON 객체를 사용하여 인증 요청을 평가하고 수행할 작업을 결정한 다음 응답을 다시 보냅니다.

### Lambda 함수 이벤트 예제
<a name="custom-auth-509cert-event"></a>

다음 예제 JSON 객체에는 포함할 수 있는 모든 필드가 포함되어 있습니다. 실제 JSON 객체에는 특정 연결 요청과 관련된 필드만 포함됩니다.

```
{
	"token": "aToken",
	"signatureVerified": true,
	"protocols": [
		"tls",
		"mqtt"
	],
	"protocolData": {
		"tls": {
			"serverName": "serverName",
			"x509CertificatePem": "x509CertificatePem",
			"principalId": "principalId"
		},
		"mqtt": {
			"clientId": "myClientId",
                     "username": "myUserName",
                     "password": "myPassword"
		}
	},
	"connectionMetadata": {
		"id": "UUID"
	}
}
```

`signatureVerified`  
권한 부여자의 Lambda 함수를 호출하기 전에 권한 부여자에 구성된 토큰 서명이 확인되는지 여부를 나타내는 부울 값입니다. 권한 부여자가 토큰 서명을 비활성화하도록 구성된 경우 이 필드는 거짓입니다.

`protocols`  
요청에 대해 예상할 프로토콜이 포함된 배열입니다.

`protocolData`  
연결에 사용되는 프로토콜의 정보가 포함된 객체입니다. 인증, 권한 부여 등에 유용할 수 있는 프로토콜별 세부 정보를 제공합니다.  
`tls` - 이 객체는 TLS(Transport Layer Security) 프로토콜과 관련된 정보를 보유합니다.  
+ `serverName` - [서버 이름 표시(SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 호스트 이름 스트링입니다. AWS IoT Core 는 디바이스가 [SNI 확장](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)을 Transport Layer Security(TLS) 프로토콜로 전송하고 `host_name` 필드에 전체 엔드포인트 주소를 제공하도록 요구합니다.
+ `x509CertificatePem` - TLS 연결에서 클라이언트 인증에 사용되는 PEM 형식의 X.509 인증서입니다.
+ `principalId` - TLS 연결에서 클라이언트와 연결된 위탁자 식별자입니다.
`mqtt` - 이 객체에는 MQTT 프로토콜과 관련된 정보가 들어 있습니다.  
+ `clientId` - 디바이스가 이 값을 보내는 경우에만 문자열을 포함해야 합니다.
+ `username` - MQTT Connect 패킷에 제공된 사용자 이름입니다.
+ `password` - MQTT Connect 패킷에 제공된 암호입니다.

`connectionMetadata`  
연결의 메타데이터입니다.  
`id` - 로깅 및 문제 해결에 사용할 수 있는 연결 ID입니다.

**참고**  
이 경우 JSON 객체 `x509CertificatePem` 및 `principalId`는 요청의 두 가지 새 필드입니다. `principalId`의 값은 `certificateId`의 값과 동일합니다. 자세한 내용은 [인증서](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html)를 참조하세요.

### Lambda 함수 응답 예제
<a name="custom-auth-509cert-response"></a>

Lambda 함수는 이벤트 JSON 객체의 정보를 사용하여 수신 연결을 인증하고 연결에서 허용되는 작업을 결정해야 합니다.

다음 JSON 객체에는 Lambda 함수가 전송할 수 있는 응답의 예가 들어 있습니다.

```
{
	"isAuthenticated": true,
	"principalId": "xxxxxxxx",
	"disconnectAfterInSeconds": 86400,
	"refreshAfterInSeconds": 300,
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Effect": "Allow",
					"Action": "iot:Publish",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting"
				}
			]
		}
	]
}
```

이 예제에서는 이 함수가 다음 값을 포함하는 응답을 보내야 합니다.

`isAuthenticated`  
요청 인증 여부를 나타내는 부울 값입니다.

`principalId`  
사용자 지정 권한 부여 요청에서 전송되는 토큰의 식별자 역할을 하는 영숫자 문자열입니다. 값은 반드시 1\$1128개 글자의 영숫자 문자열이어야 합니다. 로그에서 연결을 식별합니다. `principalId` 값은 이벤트 JSON 객체(즉, X.509 인증서의 certificateId)의 `principalId` 값과 동일해야 합니다.

`policyDocuments`  
JSON 형식의 AWS IoT Core 정책 문서 목록입니다. 값은 선택 사항이며 [사물 정책 변수](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html) 및 [인증서 정책 변수](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html)를 지원합니다. 정책 문서의 최대 수는 10개입니다. 각 정책 문서는 최대 2,048자를 포함할 수 있습니다. 클라이언트 인증서와 Lambda 함수에 여러 정책이 연결되어 있는 경우 권한은 모든 정책의 모음입니다. AWS IoT Core 정책 생성에 대한 자세한 내용은 [정책을](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html) 참조하세요.

`disconnectAfterInSeconds`  
 AWS IoT Core 게이트웨이에 대한 연결의 최대 지속 시간(초)을 지정하는 정수입니다. 최솟값은 300초이고 최댓값은 86,400초입니다. `disconnectAfterInSeconds`는 연결 수명 동안 사용되며 연속 정책 새로 고침 시 새로 고쳐지지 않습니다.

`refreshAfterInSeconds`  
정책 새로 고침 사이의 간격을 지정하는 정수입니다. 이 간격이 경과하면가 Lambda 함수를 AWS IoT Core 호출하여 정책 새로 고침을 허용합니다. 최소값은 300초이고 최대값은 86,400초입니다.

### Lambda 함수 예제
<a name="custom-auth-509cert-js-example"></a>

다음은 샘플 Node.js Lambda 함수입니다. 이 함수는 클라이언트의 X.509 인증서를 검사하고 일련 번호, 지문 및 주제 이름과 같은 관련 정보를 추출합니다. 추출된 정보가 예상 값과 일치하면 클라이언트에 연결할 수 있는 액세스 권한이 부여됩니다. 이 메커니즘은 유효한 인증서가 있는 승인된 클라이언트만 연결을 설정할 수 있도록 합니다.

```
const crypto = require('crypto');

exports.handler = async (event) => {
    
    // Extract the certificate PEM from the event
    const certPem = event.protocolData.tls.x509CertificatePem;
    
    // Parse the certificate using Node's crypto module
    const cert = new crypto.X509Certificate(certPem);
    
    var effect = "Deny";
    // Allow permissions only for a particular certificate serial, fingerprint, and subject
    if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial
       && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint
       && cert.subject === "allow.example.com") {
      effect = "Allow";
    }
    
    return generateAuthResponse(event.protocolData.tls.principalId, effect);
};


// Helper function to generate the authorization response.
function generateAuthResponse(principalId, effect) {
    const authResponse = {
        isAuthenticated: true,
        principalId,
        disconnectAfterInSeconds: 3600,
        refreshAfterInSeconds: 300,
        policyDocuments: [
          {
            Version: "2012-10-17",		 	 	 
            Statement: [
              {
                Action: ["iot:Connect"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:client/myClientName"
                ]
              },
              {
                Action: ["iot:Publish"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Subscribe"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Receive"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              }
            ]
          }
        ]
      };

  return authResponse;
}
```

이전 Lambda 함수는 예상 직렬, 지문 및 제목이 포함된 인증서를 수신하면 다음 JSON을 반환합니다. `x509CertificatePem`의 값은 TLS 핸드셰이크에 제공된 클라이언트 인증서입니다. 자세한 내용은 [Defining your Lambda function](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda)을 참조하세요.

```
{
	"isAuthenticated": true,
	"principalId": "principalId in the event JSON object",
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Action": "iot:Connect",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName"
				},
				{
					"Action": "iot:Publish",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				},
				{
					"Action": "iot:Subscribe",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
				},
				{
					"Action": "iot:Receive",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				}
			]
		}
	],
	"disconnectAfterInSeconds": 3600,
	"refreshAfterInSeconds": 300
}
```

## 3단계: 사용자 지정 권한 부여자 생성
<a name="custom-auth-509cert-authorizer"></a>

[Lambda 함수 를 정의](#custom-auth-509cert-lambda)한 후 사용자 지정 권한 부여자를 생성하여 자체 클라이언트 인증 및 권한 부여 로직을 관리합니다. [3단계: 사용자 지정 권한 부여자 리소스 생성 및 권한 부여](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer)의 세부 지침을 따를 수 있습니다. 자세한 내용은 [권한 부여자 생성](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)을 참조하세요.

사용자 지정 권한 부여자를 생성하는 과정에서 Lambda 함수를 생성한 후 이를 호출할 수 있는 AWS IoT 권한을 부여해야 합니다. 자세한 지침은 [Lambda 함수 호출 권한 부여 AWS IoT 를 참조하세요](custom-auth-authorize.md).

## 4단계: 도메인 구성에서 인증 유형 및 애플리케이션 프로토콜 설정
<a name="custom-auth-509cert-domainconfig"></a>

X.509 클라이언트 인증서로 사용자 지정 인증을 사용하여 디바이스를 인증하려면 도메인 구성에서 인증 유형 및 애플리케이션 프로토콜을 설정하고 SNI 확장을 전송해야 합니다. `authenticationType`의 값은 `CUSTOM_AUTH_X509`이어야 하며, `applicationProtocol`의 값은 `SECURE_MQTT` 또는 `HTTPS`일 수 있습니다.

### 도메인 구성에서 인증 유형 및 애플리케이션 프로토콜 설정(CLI)
<a name="custom-auth-509cert-cli"></a>

도메인 구성이 없는 경우 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) 명령을 사용하여 생성합니다. `authenticationType`의 값은 `CUSTOM_AUTH_X509`이어야 하며, `applicationProtocol`의 값은 `SECURE_MQTT` 또는 `HTTPS`일 수 있습니다.

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \ 
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

도메인 구성이 이미 있는 경우 필요한 경우 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) 명령 업데이트 `authenticationType` 및 `applicationProtocol`를 사용합니다. 기본 엔드포인트`iot:Data-ATS`()에서는 인증 유형 또는 프로토콜을 변경할 수 없습니다.

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

`domain-configuration-name`  
도메인 구성의 이름입니다.

`authentication-type`  
도메인 구성의 인증 유형입니다. 자세한 내용은 [인증 유형 선택](protocols.md#connection-protocol-auth-mode)을 참조하세요.

`application-protocol`  
 AWS IoT Core와 통신하는 데 사용하는 디바이스의 애플리케이션 프로토콜입니다. 자세한 내용은 [애플리케이션 프로토콜 선택](protocols.md#protocol-selection)을 참조하세요.

`--authorizer-config`  
도메인 구성에서 권한 부여자 구성을 지정하는 객체입니다.

`defaultAuthorizerName`  
도메인 구성에 대한 권한 부여자의 이름입니다.

자세한 내용은 *AWS IoT API 참조*의 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html) 및 [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)을 참조하세요. 도메인 구성에 대한 자세한 내용은 [Domain configurations](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)를 참조하세요.

# 사용자 지정 인증을 사용하여 AWS IoT Core 에 연결
<a name="custom-auth"></a>

 디바이스는 AWS IoT Core 에서 디바이스 메시징을 AWS IoT Core 지원하는 모든 프로토콜에서 사용자 지정 인증을 사용하여에 연결할 수 있습니다. 지원되는 통신 프로토콜에 대한 자세한 내용은 [디바이스 통신 프로토콜](protocols.md) 단원을 참조하세요.   권한 부여자 Lambda 함수에 전달하는 연결 데이터는 사용하는 프로토콜에 따라 다릅니다. 권한 부여자 Lambda 함수를 만드는 방법에 대한 자세한 내용은 [Lambda 함수 정의](custom-auth-lambda.md) 단원을 참조하세요. 다음 단원에서는 지원되는 각 프로토콜을 사용하여 인증에 연결하는 방법을 설명합니다.

## HTTPS
<a name="custom-auth-http"></a>

[HTTP 게시 API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html)를 사용하여 AWS IoT Core 로 데이터를 전송하는 디바이스는 HTTP POST 요청의 요청 헤더 또는 쿼리 파라미터를 통해 자격 증명을 전달할 수 있습니다. 디바이스는 `x-amz-customauthorizer-name` 헤더 또는 쿼리 파라미터를 사용하여 호출할 권한 부여자를 지정할 수 있습니다. 권한 부여자에서 토큰 서명을 활성화한 경우 요청 헤더 또는 쿼리 파라미터 중 하나에서 `token-key-name` 및 `x-amz-customauthorizer-signature`을(를) 전달해야 합니다. 참고: 브라우저에서 JavaScript를 사용할 경우 `token-signature` 값은 URL로 인코딩해야 합니다.

**참고**  
HTTPS 프로토콜의 고객 권한 부여자는 게시 작업만 지원합니다. HTTPS 프로토콜에 대한 자세한 내용은 [디바이스 통신 프로토콜](protocols.md) 섹션을 참조하세요.

다음 예제 요청은 요청 헤더와 쿼리 파라미터 모두에서 이러한 파라미터를 전달하는 방법을 보여 줍니다.

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 MQTT 연결을 사용하여 AWS IoT Core 에 연결하는 디바이스는 MQTT 메시지의 `username` 및 `password` 필드를 통해 자격 증명을 전달할 수 있습니다. `username` 값에는 추가 값(토큰, 서명 및 권한 부여자 이름 포함)을 권한 부여자에게 전달하는 쿼리 문자열이 선택적으로 포함될 수도 있습니다. `username` 및 `password` 값 대신 토큰 기반 인증 체계를 사용하려는 경우 이 쿼리 문자열을 사용할 수 있습니다.  

**참고**  
 암호 필드의 데이터는 base64로 인코딩됩니다 AWS IoT Core. 디코딩은 Lambda 함수로 해야 합니다.

 다음 예제는 토큰 및 서명을 지정하는 추가 파라미터가 포함된 `username` 문자열을 포함합니다.  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

권한 부여자를 호출하려면 MQTT 및 사용자 지정 인증을 사용하여 AWS IoT Core 에 연결하는 디바이스가 포트 443에서 연결되어야 합니다. 또한 값이 인 Application Layer Protocol Negotiation(ALPN) TLS 확장`mqtt`과 AWS IoT Core 데이터 엔드포인트의 호스트 이름이 있는 Server Name Indication(SNI) 확장을 전달해야 합니다. 잠재적 오류를 방지하기 위해 `x-amz-customauthorizer-signature` 값은 URL 인코딩을 해야 합니다. 또한 `x-amz-customauthorizer-name` 및 `token-key-name` 값을 URL 인코딩하는 것을 적극 권장합니다. 이러한 값에 대한 자세한 정보는 [디바이스 통신 프로토콜](protocols.md) 섹션을 참조하세요. V2 [AWS IoT 디바이스 SDK, 모바일 SDK 및 AWS IoT 디바이스 클라이언트](iot-sdks.md)는 이 두 확장을 모두 구성할 수 있습니다. 

## WebSocket을 통한 MQTT
<a name="custom-auth-websockets"></a>

 MQTT over WebSockets AWS IoT Core 을 사용하여에 연결하는 디바이스는 다음 두 가지 방법 중 하나로 자격 증명을 전달할 수 있습니다.
+ WebSockets 연결 설정을 위해 HTTP 업그레이드 요청의 요청 헤더 또는 쿼리 파라미터를 통해.
+ MQTT 연결 메시지의 `username` 및 `password` 필드를 통해.

 MQTT 연결 메시지를 통해 자격 증명을 전달하면 ALPN 및 SNI TLS 확장이 필요합니다. 이러한 확장에 대한 자세한 내용은 [MQTT](#custom-auth-mqtt) 단원을 참조하세요. 다음 예에서는 HTTP 업그레이드 요청을 통해 자격 증명을 전달하는 방법을 보여 줍니다.

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## 토큰에 서명하기
<a name="custom-auth-token-signature"></a>

`create-authorizer` 호출에서 사용한 퍼블릭-프라이빗 키 페어의 프라이빗 키를 사용하여 토큰에 서명해야 합니다. 다음 예제에서는 UNIX 계열 명령과 JavaScript를 사용하여 토큰 서명을 생성하는 방법을 보여줍니다. 이들은 SHA-256 해시 알고리즘을 사용하여 서명을 인코딩합니다.

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# Lambda 권한 부여자 문제 해결
<a name="custom-auth-troubleshooting"></a>

 이 주제에서는 사용자 지정 인증 워크플로에서 문제를 일으킬 수 있는 일반적인 문제와 이를 해결하기 위한 단계를 안내합니다. 문제를 가장 효과적으로 해결하려면에 대해 CloudWatch 로그를 활성화 AWS IoT Core 하고 로그 수준을 **DEBUG**로 설정합니다. AWS IoT Core 콘솔([https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/))에서 CloudWatch 로그를 활성화할 수 있습니다. AWS IoT Core에 대해 로그를 활성화 및 구성하는 자세한 내용은 [AWS IoT 로깅 구성](configure-logging.md) 단원을 참조하세요.

**참고**  
로그 수준을 장기간 **디버그** 상태로 두면 CloudWatch에서 많은 양의 로깅 데이터를 저장할 것이고, 이렇게 하면 CloudWatch 요금이 증가할 수 있습니다. 특정 사물 그룹의 디바이스에 대해서만 상세도를 높이도록 리소스 기반 로깅을 사용하는 것이 좋습니다. 리소스 기반 로깅에 대한 자세한 내용은 [AWS IoT 로깅 구성](configure-logging.md) 단원을 참조하세요. 또한 문제 해결이 완료되면 로그 수준의 상세도를 낮추세요.

문제 해결을 시작하기 전에 사용자 지정 인증 프로세스를 자세히 볼 수 있도록 [사용자 지정 인증 워크플로 이해](custom-authorizer.md)을(를) 검토합니다. 이렇게 하면 문제의 원인을 찾을 위치를 파악하는 데 도움이 됩니다.

이 주제에서는 다음과 같은 두 가지 조사 영역에 대해 설명합니다.
+ 권한 부여자의 Lambda 함수와 관련된 문제.
+ 디바이스와 관련된 문제.

## 권한 부여자의 Lambda 함수에서 문제 확인
<a name="custom-auth-troubleshooting-lambda"></a>

장치의 연결 시도가 Lambda 함수를 호출하는지 확인하려면 다음 단계를 수행하세요.

1. 권한 부여자와 연결된 Lambda 함수를 확인합니다.

   [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html) API를 호출하거나 AWS IoT Core 콘솔의 **보안** 단원에서 원하는 권한 부여자를 클릭하여 수행합니다.

1. Lambda 함수의 호출 지표를 확인합니다. 이렇게 하려면 다음 단계를 수행하세요.

   1.  AWS Lambda 콘솔([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/))을 열고 권한 부여자와 연결된 함수를 선택합니다.

   1. **모니터링** 탭을 선택하고 문제와 관련된 시간 프레임에 대한 지표를 봅니다.

1. 호출이 표시되지 않으면 AWS IoT Core 에 Lambda 함수를 호출할 권한이 있는지 확인합니다. 호출이 표시되면 다음 단계로 건너뜁니다. Lambda 함수에 필요한 권한이 있는지 확인하려면 다음 단계를 수행하세요.

   1.  AWS Lambda 콘솔에서 함수에 대한 **권한** 탭을 선택합니다.

   1. 페이지 하단에서 **리소스 기반 정책** 단원을 찾습니다. Lambda 함수에 필요한 권한이 있는 경우 정책은 다음 예와 같습니다.  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. 이 정책은 AWS IoT Core 보안 주체에게 함수에 대한 `InvokeFunction` 권한을 부여합니다. 표시되지 않으면 [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) API를 사용하여 추가해야 합니다. 다음 예에서는 AWS CLI을(를) 사용하여 이 작업을 수행하는 방법을 보여줍니다. 

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. 호출이 표시되면 오류가 없는지 확인합니다. 오류는 Lambda 함수가에서 AWS IoT Core 전송한 연결 이벤트를 제대로 처리하지 못하고 있음을 나타낼 수 있습니다.

   Lambda 함수에서 이벤트를 처리하는 방법에 대한 자세한 내용은 [Lambda 함수 정의](custom-auth-lambda.md) 단원을 참조하세요. AWS Lambda 콘솔([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/))의 테스트 기능을 사용하여 함수의 테스트 값을 하드 코딩하여 함수가 이벤트를 올바르게 처리하고 있는지 확인할 수 있습니다.

1. 오류 없이 호출이 표시되지만 디바이스가 연결할 수 없거나 메시지를 게시, 구독 및 수신할 수 없는 경우 Lambda 함수가 반환하는 정책이 디바이스가 수행하려는 작업에 대한 권한을 부여하지 않는 문제일 수 있습니다. 함수가 반환하는 정책에 문제가 있는지 확인하려면 다음 단계를 수행하세요.

   1. Amazon CloudWatch Logs Insights 쿼리를 사용하여 짧은 기간 동안 로그를 스캔하여 실패를 확인합니다. 다음 예제 쿼리는 타임스탬프별로 이벤트를 정렬하고 실패를 찾습니다.

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. Lambda 함수를 업데이트하여 반환되는 데이터와 함수 AWS IoT Core 를 트리거하는 이벤트를 로깅합니다. 이러한 로그를 사용하여 함수가 만드는 정책을 검사할 수 있습니다.

1. 오류 없이 호출이 표시되지만 디바이스가 연결할 수 없거나 메시지를 게시, 구독 및 수신할 수 없는 경우 Lambda 함수가 제한 시간을 초과했기 때문일 수 있습니다. 사용자 지정 권한 부여자에 대한 Lambda 함수 제한 시간은 5초입니다. CloudWatch 로그 또는 지표에서 함수 기간을 확인할 수 있습니다.

## 디바이스 문제 조사
<a name="custom-auth-troubleshooting-investigate"></a>

Lambda 함수를 호출하거나 함수가 반환하는 정책에 문제가 없으면 디바이스의 연결 시도에 문제가 있는지 확인합니다. 잘못된 연결 요청으로 인해가 권한 부여자를 트리거 AWS IoT Core 하지 않을 수 있습니다. TLS 및 애플리케이션 계층 모두에서 연결 문제가 발생할 수 있습니다.

**가능한 TLS 계층 문제:**
+ 고객은 모든 사용자 지정 인증 요청에서 호스트 이름 헤더(HTTP, WebSockets을 통한 MQTT) 또는 서버 이름 표시 TLS 확장(HTTP, WebSockets을 통한 MQTT, MQTT)을 전달해야 합니다. 두 경우 모두 전달된 값은 계정의 AWS IoT Core 데이터 엔드포인트 중 하나와 일치해야 합니다. 이러한 엔드포인트는 다음 CLI 명령을 수행할 때 반환되는 엔드포인트입니다.
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`(레거시 VeriSign 엔드포인트용)
+ MQTT 연결에서 사용자 지정 인증을 사용하는 디바이스가 `mqtt` 값의 ALPN(Application Layer Protocol Negotiation) TLS 확장을 전달해야 합니다.
+ 사용자 지정 인증은 현재 포트 443에서만 사용할 수 있습니다.

**가능한 애플리케이션 계층 문제:**
+ 서명이 활성화된 경우(`signingDisabled` 필드가 false인 경우) 다음 서명 문제를 찾습니다.
  + 토큰 서명을 `x-amz-customauthorizer-signature` 헤더 또는 쿼리 문자열 파라미터로 전달하고 있는지 확인합니다.
  + 서비스가 토큰이 아닌 다른 값에 서명하고 있지 않은지 확인합니다.
  + 권한 지정자의 `token-key-name` 필드에 지정한 헤더 또는 쿼리 파라미터로 토큰을 전달하는지 확인합니다.
+ `x-amz-customauthorizer-name` 헤더 또는 쿼리 문자열 파라미터로 전달한 권한 부여자 이름이 유효하거나 계정에 대해 기본 권한 부여자가 정의되어 있어야 합니다.

# 권한 부여
<a name="iot-authorization"></a>

권한 부여는 인증된 자격 증명에 권한을 부여하는 프로세스입니다. AWS IoT Core 및 IAM 정책을 AWS IoT Core 사용하여에 권한을 부여합니다. 이 주제에서는 AWS IoT Core 정책을 다룹니다. IAM 정책에 대한 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 및 [AWS IoT 에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 단원을 참조하세요.

AWS IoT Core 정책은 인증된 자격 증명이 수행할 수 있는 작업을 결정합니다. 인증된 자격 증명은 디바이스, 모바일 애플리케이션, 웹 애플리케이션 및 데스크톱 애플리케이션이 사용합니다. 인증된 자격 증명은 AWS IoT Core CLI 명령을 입력하는 사용자일 수도 있습니다. 자격 증명은 해당 AWS IoT Core 작업에 대한 권한을 부여하는 정책이 있는 경우에만 작업을 실행할 수 있습니다.

 AWS IoT Core 정책 및 IAM 정책은 모두 자격 증명(보안 *주체*라고도 함)이 수행할 수 있는 작업을 제어하는 AWS IoT Core 데와 함께 사용됩니다. 사용하는 정책 유형은 인증에 사용하는 자격 증명 유형에 따라 다릅니다 AWS IoT Core.

AWS IoT Core 작업은 두 그룹으로 나뉩니다.
+ 컨트롤 플레인 API는 인증서, 사물, 규칙 등을 생성 또는 업데이트하는 것과 같은 관리 작업을 수행할 수 있습니다.
+ 데이터 영역 API를 사용하면 데이터를 로 보내고 받을 수 있습니다 AWS IoT Core.

사용하는 정책 유형은 제어 플레인 API 또는 데이터 플레인 API를 사용하는지에 따라 달라집니다.

다음 표에는 자격 증명, 사용되는 프로토콜, 인증에 사용될 수 있는 정책 유형이 나와 있습니다.


**AWS IoT Core 데이터 영역 API 및 정책 유형**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/iot-authorization.html)


**AWS IoT Core 컨트롤 플레인 API 및 정책 유형**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/iot-authorization.html)

AWS IoT Core 정책은 X.509 인증서, Amazon Cognito 자격 증명 또는 사물 그룹에 연결됩니다. IAM 정책은 IAM 사용자, 그룹 또는 역할에 연결됩니다. AWS IoT 콘솔 또는 AWS IoT Core CLI를 사용하여 정책을 연결하는 경우(인증서, Amazon Cognito 자격 증명 또는 사물 그룹에 연결) AWS IoT Core 정책을 사용합니다. 그렇지 않으면 사물 그룹에 연결된 IAM policy. AWS IoT Core policies가 해당 사물 그룹 내의 모든 사물에 적용됩니다. AWS IoT Core 정책을 적용하려면 `clientId` 및 사물 이름이 일치해야 합니다.

정책 기반 인증은 강력한 도구입니다. 이를 통해 AWS IoT Core에서 디바이스, 사용자 또는 애플리케이션이 수행할 수 있는 작업을 완벽하게 제어할 수 있습니다. 예를 들어 인증서를 사용하여 AWS IoT Core 에 연결하는 디바이스를 가정해 보겠습니다. 디바이스가 모든 MQTT 주제에 액세스하도록 허용할 수도 있고, 단일 주제에만 액세스하도록 제한할 수도 있습니다. 또 하나의 예로 명령줄에 CLI 명령을 입력하는 사용자를 생각해 봅시다. 정책을 사용하면 사용자의 명령 또는 AWS IoT Core 리소스에 대한 액세스를 허용하거나 거부할 수 있습니다. 또한 AWS IoT Core 리소스에 대한 애플리케이션의 액세스를 제어할 수도 있습니다.

 AWS IoT 이(가) 정책 문서를 캐시하는 방법 때문에 정책에 대한 변경 사항이 적용되는 데 몇 분이 소요될 수 있습니다. 즉, 최근에 액세스 권한이 부여된 리소스에 액세스하는 데 몇 분 정도 걸릴 수 있으며 액세스가 취소된 후 몇 분 동안 리소스에 액세스할 수 있습니다.

## AWS 교육 및 인증
<a name="iot-authorization-training"></a>

의 권한 부여에 대한 자세한 내용은 AWS 훈련 및 인증 웹 사이트의 인증 및 권한 부여에 대한 AWS IoT Core심층 분석 과정을 참조하십시오. [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 지원하므로 많은 자격 증명이 동일한 정책 문서를 참조할 수 있습니다. 명명된 정책은 버전 관리되므로 용이하게 롤백이 가능합니다.

AWS IoT Core 정책을 사용하면 AWS IoT Core 데이터 영역에 대한 액세스를 제어할 수 있습니다. AWS IoT Core 데이터 영역은 AWS IoT Core 메시지 브로커에 연결하고, MQTT 메시지를 송수신하고, 사물의 디바이스 섀도우를 가져오거나 업데이트할 수 있는 작업으로 구성됩니다.

 AWS IoT Core 정책은 하나 이상의 정책 문이 포함된 JSON 문서입니다. 각 문에는 다음이 포함됩니다.
+ `Effect` - 작업이 허용되는지 또는 거부되는지를 지정합니다.
+ `Action` - 정책이 허용하거나 거부하는 작업을 지정합니다.
+ `Resource` - 작업이 허용되거나 거부되는 리소스를 지정합니다.

가 정책 문서를 AWS IoT 캐싱하는 방식 때문에 정책에 대한 변경 사항이 적용되려면 6\$18분이 걸릴 수 있습니다. 즉, 최근에 액세스 권한이 부여된 리소스에 액세스하는 데 몇 분 정도 걸릴 수 있으며 액세스가 취소된 후 몇 분 동안 리소스에 액세스할 수 있습니다.

AWS IoT Core 정책은 X.509 인증서, Amazon Cognito 자격 증명 및 사물 그룹에 연결할 수 있습니다. 사물 그룹에 연결된 정책은 해당 그룹 내의 모든 사물에 적용됩니다. 정책이 발효되려면 `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 자격 증명으로 권한 부여](cog-iot-policies.md)

# AWS IoT Core 정책 작업
<a name="iot-policy-actions"></a>

 AWS IoT Core가 정의하는 정책 작업은 다음과 같습니다.MQTT 정책 작업

`iot:Connect`  
 AWS IoT Core 메시지 브로커에 연결할 수 있는 권한을 나타냅니다. `CONNECT` 요청이 브로커로 전송될 때마다 `iot:Connect` 권한이 확인됩니다. 메시지 브로커는 클라이언트 ID가 동일한 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`  
사물의 디바이스 섀도우를 삭제할 수 있는 권한을 나타냅니다. 사물의 디바이스 섀도우의 내용을 삭제하는 요청이 생성될 때마다 `iot:DeleteThingShadow` 권한이 확인됩니다.

`iot:GetThingShadow`  
사물의 디바이스 섀도우를 검색할 수 있는 권한을 나타냅니다. 사물의 디바이스 섀도우의 내용을 검색하는 요청이 생성될 때마다 `iot:GetThingShadow` 권한이 확인됩니다.

`iot:ListNamedShadowsForThing`  
사물의 이름 지정된 섀도우를 나열할 수 있는 권한을 나타냅니다. 사물의 이름 지정된 섀도우를 나열하는 요청이 생성될 때마다 `iot:ListNamedShadowsForThing` 권한이 확인됩니다.

`iot:UpdateThingShadow`  
디바이스 섀도우를 업데이트할 수 있는 권한을 나타냅니다. 사물의 디바이스 섀도우의 내용을 업데이트하는 요청이 생성될 때마다 `iot:UpdateThingShadow` 권한이 확인됩니다.

**참고**  
작업 실행 정책 작업은 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 역할을 수임할 수 있는 권한을 나타냅니다. 자격 AWS IoT Core 증명 공급자가 역할을 수임하도록 요청할 때마다 `iot:AssumeRoleWithCertificate` 권한이 확인됩니다.

# 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)을 참조하세요.


| 작업 | 리소스 유형 | 리소스 이름 | 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 정책과 유사한 규칙을 따를 수 있습니다. 문자열에 `*`(별표)를 삽입하면 임의의 문자와 일치하는 와일드카드로 취급될 수 있습니다. 예를 들어, 정책의 `*` 속성에서 여러 MQTT 이름을 설명하기 위해 `Resource`를 사용할 수 있습니다. `+` 및 `#` 문자는 정책에서 리터럴 문자열로 취급됩니다. 와일드카드를 사용하는 방법을 보여 주는 정책 예시는 [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`: AWS IoT Core 메시지 브로커에 연결하는 데 사용되는 클라이언트 ID입니다.
+ `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 정책은 정책 변수를 사용하는 정책을 보여줍니다.는 정책의 조건 요소에서 보안 주체가 특정 주소 범위 내에서만 API를 요청하도록 허용하는 데 사용할 `aws:SourceIp` 수 있습니다. 예시는 [사용자 및 클라우드 서비스에 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를 가진 어태처가 검증을 통과할 수 있지만 연결이 끊길 수 있습니다. `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 조건 연산자에 대한 자세한 내용은 IAM 사용 설명서의 [IAM JSON 정책 요소: 조건 연산자](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)를 참조하세요. 도메인 구성에 대한 자세한 내용은 [What is a domain configuration?](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 자격 증명)를 사물에 연결할 수 있습니다.
+ 비독점 사물 연결이 이루어졌을 경우, 사물 이름을 사물 정책 변수로 바꿀 때 MQTT 연결 메시지 또는 TLS 연결의 `clientId` 값이 사물 이름과 정확히 일치해야 합니다.

다음의 사물 정책 변수를 사용할 수 있습니다.
+ `iot:Connection.Thing.ThingName`

  이렇게 하면 정책이 평가되는 AWS IoT Core 레지스트리의 사물 이름으로 확인됩니다.는 디바이스가 인증할 때 제공하는 인증서를 AWS IoT Core 사용하여 연결을 확인하는 데 사용할 사물을 결정합니다. 이 정책 변수는 디바이스가 MQTT 또는 WebSocket 프로토콜을 통한 MQTT를 통해 연결하는 경우에만 사용할 수 있습니다.
+ `iot:Connection.Thing.ThingTypeName`

  이 변수는 정책이 평가되는 사물과 연결된 사물 유형으로 변환됩니다. MQTT/WebSocket 연결의 클라이언트 ID는 사물 이름과 동일해야 합니다. 이 정책 변수는 MQTT 또는 WebSocket 프로토콜을 통한 MQTT를 통해 연결하는 경우에만 사용할 수 있습니다.
+ `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 되고 보안 주체에 연결된 디바이스만 정책 내의 권한에 액세스할 수 있도록 합니다. 레지스트리의 IoT 사물에 AWS IoT Core 연결되지 않은 인증서를 제공하는 AWS IoT Core 경우이 변수를 사용하여 디바이스가에 연결되지 않도록 할 수 있습니다.이 변수에는 연결 사물이 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API를 사용하여 레지스트리의 인증서 또는 Amazon Cognito 자격 증명에 연결되었음을 `false` 나타내는 `true` 또는 값이 있습니다. 사물 이름은 클라이언트 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 인증서는 이러한 속성이 하나 이상의 값을 포함한 옵션을 가지도록 허용합니다. 기본적으로 각 다중 값 속성의 정책 변수는 첫 번째 값을 반환합니다. 예를 들어 `Certificate.Subject.Country` 속성에는 국가 이름 목록이 포함되었을 수 있지만, 정책에서 평가될 때 `iot:Certificate.Subject.Country`는 첫 번째 국가 이름으로 대체됩니다.

1 기반 인덱스를 사용하여 첫 번째 값 이외의 특정 속성 값을 요청할 수 있습니다. 예를 들어 `iot:Certificate.Subject.Country.1`은 `Certificate.Subject.Country` 속성의 두 번째 국가로 대체됩니다. 존재하지 않는 인덱스 값을 지정할 경우(예: 속성에 값이 2개만 할당되었지만 세 번째 값을 요청하는 경우) 값이 대체되지 않고 권한 부여가 실패합니다. 정책 변수 이름에 `.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/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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는 십진수 형식의 일련 번호여야 합니다.

와일드카드  
인증서 속성에 와일드카드 문자가 있을 경우 정책 변수가 인증서 속성 값으로 대체되지 않습니다. 이렇게 하면 정책 문서에 `${policy-variable}` 텍스트가 남습니다. 이는 인증 실패를 초래할 수 있습니다. `*`, `$`, `+`, `?`, `#` 등의 와일드카드 문자를 사용할 수 있습니다.

어레이 필드  
어레이를 포함하는 인증서 속성은 5개 항목으로 제한됩니다. 추가 항목은 무시됩니다.

문자열 길이  
모든 문자열 값은 1,024자로 제한됩니다. 인증서 속성이 1,024자를 초과하는 문자열을 포함할 경우 정책 변수가 인증서 속성 값으로 대체되지 않습니다. 이렇게 하면 정책 문서에 `${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는 `arn:aws:iot:region:account-id:resource-type/resource-id` 리소스별 권한 또는의 형식을 준수해야 `aws:SourceArn` 합니다`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 보안 토큰 서비스(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:SourceArn` AWS IoT 역할 신뢰 정책의 값은 프로비저닝 템플릿을 정의하는 방법에 따라 달라집니다.

#### 프로비저닝 템플릿을 별도의 리소스로 정의
<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) 직접 호출 중에는 CA 인증서의 ARN이 `aws:SourceArn` 조건에 지정되지 않습니다.

이를 해결하려면, 즉에 등록된 특정 CA 인증서에 프로비저닝 역할 신뢰 정책을 지정하려면 다음을 수행할 AWS IoT Core수 있습니다.
+ 먼저 `RegistrationConfig` 파라미터를 제공하지 않고 [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html)를 직접적으로 호출합니다.
+ CA 인증서가에 등록된 후 CA 인증서에서 [UpdateCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html)를 AWS IoT Core호출합니다.

  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는 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`을(를) 사용하면 IAM 정책의 연결 메시지에 사용할 속성(예: `PersistentConnect` 또는 `LastWill`)을 지정할 수 있습니다. 자세한 내용은 [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) 규칙을 따릅니다. 정책 문서에서 `*`는 문자 조합을 나타내고 `?`는 단일 문자를 나타냅니다. 정책 문서에서 MQTT 와일드카드 문자 `+` 및 `#`은 특별한 의미가 없는 문자로 취급됩니다. 정책의 `resource` 속성에서 여러 주제 이름과 주제 필터를 설명하려면 MQTT 와일드카드 문자 대신 `*` 및 `?` 와일드카드 문자를 사용하세요.

정책 문서에서 사용할 와일드카드 문자를 선택할 때는 `*` 문자가 하나의 주제 수준에 국한되지 않는다는 점을 고려하세요. `+` 문자는 MQTT 주제 필터에서 단일 주제 수준으로 제한됩니다. 와일드카드 사양을 단일 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\$1specific \$1topic'이라는 주제에 대해 메시지를 게시, 구독 및 수신하는 예를 보여줍니다. 또한 예제에서는 `Publish` 및 `Receive`가이 'topic'을 리소스로 사용하고 `Subscribe`가 topicfilter'를 리소스로 사용함을 강조합니다.

------
#### [ 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'라는 접두사가 붙은 주제에 대해 메시지를 게시, 구독 및 수신하는 예를 보여줍니다.

**참고**  
이 예제에서는 와일드카드 문자 `*`를 사용한다는 점에 유의하세요. `*`는 단일 명령문에서 여러 주제 이름에 대한 권한을 제공하는 데 유용하지만 디바이스에 필요한 것보다 더 많은 권한을 제공하여 의도하지 않은 결과를 초래할 수 있습니다. 따라서 와일드카드 문자 `*`는 신중하게 고려한 후에만 사용하는 것이 좋습니다.

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

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 또한 'topic\$1prefix' 접두사가 붙은 주제에 대한 `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을 사용하여 연결하도록 허용합니다. 또한 'topic\$1prefix' 접두사가 붙은 주제에 대한 `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' 주제는 구독할 수 없습니다. 마찬가지로, 디바이스는 '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/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 자격 증명은 인증되거나 인증되지 않을 수 있습니다. 인증된 자격 증명은 지원되는 자격 증명 공급자가 인증한 사용자를 위한 것이고, 인증되지 않은 자격 증명은 대개 자격 증명 공급자를 통해 인증하지 않는 게스트 사용자에 속합니다. Amazon Cognito는 인증되지 않은 자격 증명을 지원하는 고유한 식별자 및 AWS 자격 증명을 제공합니다. 자세한 내용은 [Amazon Cognito 자격 증명으로 권한 부여](cog-iot-policies.md) 단원을 참조하십시오.

다음 작업의 경우 `AttachPolicy` API를 통해 Amazon Cognito 자격 증명에 연결된 AWS IoT Core 정책을 AWS IoT Core 사용합니다. 이렇게 하면 인증된 자격 증명이 있는 Amazon Cognito ID 풀에 연결된 권한의 범위가 줄어듭니다.
+ `iot:Connect`
+ `iot:Publish`
+ `iot:Subscribe`
+ `iot:Receive`
+ `iot:GetThingShadow`
+ `iot:UpdateThingShadow`
+ `iot:DeleteThingShadow`

즉, Amazon Cognito 자격 증명에는 IAM 역할 정책 및 AWS IoT Core 정책의 권한이 필요합니다. `AttachPolicy` API를 통해 풀에 IAM 역할 정책을 연결하고 Amazon Cognito 자격 증명에 AWS IoT Core AWS IoT Core 정책을 연결합니다.

인증된 사용자와 인증되지 않은 사용자의 자격 증명 유형은 서로 다릅니다. Amazon Cognito 자격 증명에 AWS IoT 정책을 연결하지 않으면 인증된 사용자가에서 권한 부여에 실패 AWS IoT 하고 AWS IoT 리소스 및 작업에 액세스할 수 없습니다.

**참고**  
다른 AWS IoT Core 작업 또는 인증되지 않은 자격 증명의 경우 AWS IoT Core 는 Amazon Cognito 자격 증명 풀 역할에 연결된 권한의 범위를 좁히지 않습니다. 인증된 자격 증명과 인증되지 않은 자격 증명 모두에 대해 이 정책은 Amazon Cognito 풀 역할에 연결하도록 권장되는 가장 허용적인 정책입니다.

**HTTP**

인증되지 않은 Amazon Cognito 자격 증명이 Amazon Cognito 자격 증명별 주제에 HTTP를 통해 메시지를 게시하도록 허용하려면 Amazon Cognito 자격 증명 풀 역할에 다음 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}"
            ]
        }
    ]
}
```

인증된 사용자를 허용하려면 이전 정책을 Amazon Cognito 자격 증명 풀 역할과 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API를 사용하여 Amazon Cognito 자격 증명에 연결합니다.

**참고**  
Amazon Cognito 자격 증명을 승인할 때는 정책을 모두 AWS IoT Core 고려하고 지정된 최소 권한을 부여합니다. 두 정책이 모두 요청된 작업을 허용하는 경우에만 작업이 허용됩니다. 어느 한 정책이 작업을 허용하지 않을 경우 해당 작업은 승인되지 않습니다.

**MQTT**

인증되지 않은 Amazon Cognito 자격 증명이 사용자 계정의 Amazon Cognito 자격 증명별 주제에 WebSocket를 통해 MQTT 메시지를 게시하도록 허용하려면 Amazon Cognito 자격 증명 풀 역할에 다음 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}"]
        }
    ]
}
```

인증된 사용자를 허용하려면 이전 정책을 Amazon Cognito 자격 증명 풀 역할과 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API를 사용하여 Amazon Cognito 자격 증명에 연결합니다.

**참고**  
Amazon Cognito 자격 증명을 승인할 때 AWS IoT Core 는 지정된 최소 권한을 고려하고 부여합니다. 두 정책이 모두 요청된 작업을 허용하는 경우에만 작업이 허용됩니다. 어느 한 정책이 작업을 허용하지 않을 경우 해당 작업은 승인되지 않습니다.

# 연결 및 게시 정책 예제
<a name="connect-and-pub"></a>

 AWS IoT Core 레지스트리에 사물로 등록된 디바이스의 경우 다음 정책은 사물 이름과 일치하는 클라이언트 ID AWS IoT Core 를 사용하여에 연결할 수 있는 권한을 부여하고 디바이스가 클라이언트 ID 또는 사물 이름별 MQTT 주제에 게시하도록 제한합니다. 연결이 성공하려면 사물 이름을 AWS IoT Core 레지스트리에 등록하고 사물에 연결된 자격 증명 또는 보안 주체를 사용하여 인증해야 합니다.

****  

```
{
  "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 보관된 메시지를 연결하고 게시할 수 있어야 합니다. 다음 정책은 주제에 대해 이러한 권한을 부여합니다(클라이언트 **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는 이러한 메시지를 [*Will* 메시지](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Will_Flag)라고 합니다. Will 메시지를 포함하려면 클라이언트의 연결 권한에 조건이 더 추가되어야 합니다.

다음 정책 문서는 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>

서비스 및 애플리케이션은 [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)를 호출하여 MQTT 클라이언트를 지원할 필요 없이 보관된 메시지에 액세스할 수 있습니다. 이러한 작업을 호출하는 서비스 및 애플리케이션은 다음 예와 같은 정책을 사용하여 권한이 부여되어야 합니다.

****  

```
{
    "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, , `client2` `client3` 및 AWS IoT Core 를 사용하여 `client1`에 연결하고 디바이스가 자체 인증에 사용한 인증서`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}"]
        }
    ]
}
```

**참고**  
이 예에서는 인증서 제목 공통 이름이 주제 식별자로 사용되고, 주제 공통 이름이 등록된 인증서마다 고유하다고 가정합니다. 인증서를 여러 디바이스에서 공유하는 경우, 제목 공통 이름은 이 인증서를 공유하는 모든 디바이스에서 동일하므로, 여러 디바이스에서 동일한 주제에 게시 권한을 허용하게 됩니다(권장되지 않음).

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 클라이언트 IDs, , `client2`및 AWS IoT Core 를 사용하여 `client1`에 연결하고 디바이스가 자체 인증에 사용한 인증서의 제목 `CommonName` 필드`client3`와 이름이 동일한 주제에 게시할 수 있는 권한을 부여합니다.

****  

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

**참고**  
이 예에서는 인증서 제목 공통 이름이 주제 식별자로 사용되고, 주제 공통 이름이 등록된 인증서마다 고유하다고 가정합니다. 인증서를 여러 디바이스에서 공유하는 경우, 제목 공통 이름은 이 인증서를 공유하는 모든 디바이스에서 동일하므로, 여러 디바이스에서 동일한 주제에 게시 권한을 허용하게 됩니다(권장되지 않음).

 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`, `client2` `client3` 및 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/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 레지스트리에 등록된 디바이스의 경우 `Administrator`다음 정책은 디바이스 인증에 사용된 인증서에 `Subject.CommonName` 필드 중 하나가 로 설정된 `ThingName` 경우 디바이스가 사물 이름을 사용하여 `admin/` 로 구성된 특정 주제에 게시할 수 있도록 허용합니다.

****  

```
{
    "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` 필드 중 하나가 AWS IoT Core 로 설정된 `admin` 경우 클라이언트 IDs `client1`, `client2` `client3` 및를 사용하여에 연결하고 주제에 게시할 수 있는 권한을 부여합니다. `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.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.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 자격 증명으로 권한 부여
<a name="cog-iot-policies"></a>

Amazon Cognito 자격 증명에는 인증된 자격 증명과 인증되지 않은 자격 증명이라는 두 가지 유형이 있습니다. 앱이 인증되지 않은 Amazon Cognito 자격 증명을 지원하는 경우 인증이 수행되지 않으므로 사용자가 누구인지 알 수 없습니다.

**인증되지 않은 자격 증명:** 인증되지 않은 Amazon Cognito 자격 증명의 경우 인증되지 않은 자격 증명 풀에 IAM 역할을 연결하여 권한을 부여합니다. 알 수 없는 사용자가 사용할 수 있도록 하려는 리소스에 대해서만 액세스 권한을 부여하는 것이 좋습니다.

**중요**  
에 연결하는 인증되지 않은 Amazon Cognito 사용자의 경우 IAM 정책에서 매우 제한된 리소스에 대한 액세스 권한을 부여하는 AWS IoT Core것이 좋습니다.

**인증된 자격 증명:** 인증된 Amazon Cognito 자격 증명의 경우 다음 두 곳에서 권한을 지정해야 합니다.
+ 인증된 Amazon Cognito 자격 증명 풀에 IAM 정책을 연결합니다.
+ Amazon Cognito 자격 증명(인증된 사용자)에 AWS IoT Core 정책을 연결합니다.

## 에 연결하는 미인증 및 인증된 Amazon Cognito 사용자에 대한 정책 예제 AWS IoT Core
<a name="cog-iot-policies-auth-unauth-examples"></a>

다음 예제는 Amazon Cognito 자격 증명의 IAM 정책과 IoT 정책에 있는 권한을 보여줍니다. 인증된 사용자가 디바이스별 주제(예: device/DEVICE\$1ID/status)에 게시하려고 합니다.

****  

```
{
    "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)
+ [MQTT 게시/구독 AWS AmplifyAWS IoT Device SDK for JavaScript, 및 Lambda 함수를 사용한 React 웹 애플리케이션](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda)

Amplify는 서비스와 통합되는 웹 및 모바일 애플리케이션을 구축하는 데 도움이 되는 도구 및 AWS 서비스 세트입니다. Amplify에 대한 자세한 내용은 [Amplify 프레임워크 설명서](https://docs.amplify.aws/)를 참조하세요.

두 예 모두 다음 단계를 수행합니다.

1. 사용자가 계정에 가입하면 애플리케이션에서 Amazon Cognito 사용자 풀과 자격 증명을 생성합니다.

1. 사용자가 인증하면 애플리케이션이 정책을 생성하여 자격 증명에 연결합니다. 이렇게 하면 사용자에게 게시 및 구독 권한이 부여됩니다.

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) 파일에 나타납니다.

두 번째 예는 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 자격 증명 풀을 통해 얻은 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와 보안 액세스 키를 요구합니다. AWS IoT Core 에는 기본 제공 [X.509 인증서를](x509-client-certs.html) 고유한 디바이스 자격 증명으로 사용하여 AWS 요청을 인증할 수 있는 자격 증명 공급자가 있습니다. 따라서 디바이스에 액세스 키 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 에 대한 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 단원을 참조하세요.

 AWS IoT 에서는 디바이스가 [전송 계층 보안(TLS) 프로토콜로 SNI(Server Name Indication) 확장](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)을 전송하고 `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/ko_kr/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`을(를) context 변수로 추가합니다. 디바이스가 요청에 사물 이름을 제시하지 않더라도 자격 증명 공급자는 context 변수로 `credentials-iot:AwsCertificateId`를 제공합니다. `x-amzn-iot-thingname` HTTP 요청 헤더의 값으로 그 사물 이름을 전달하세요.

   이 세 가지 변수는 AWS IoT Core 정책이 아니라 IAM 정책을 위해서만 작동합니다.

1. 다음 단계(역할 별칭 생성)를 수행하는 사용자가 새로 생성된 역할을 AWS IoT Core로 전달할 권한을 가지고 있는지 확인합니다. 다음 정책은 AWS 사용자에게 `iam:GetRole` 및 `iam:PassRole` 권한을 모두 부여합니다. `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-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 사용 설명서의 [ 역할 최대 세션 기간(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 사물 리소스의 이름과 일치해야 합니다. 일치하지 않으면 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` 등록된 사물 이름을 사용하여에 연결하고 이름이 접두사가 인 클라이언트 ID별 주제에 게시 AWS IoT Core 할 수 있는 권한을 부여합니다. `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"
        }
    ]
}
```

# 의 데이터 보호 AWS IoT Core
<a name="data-protection"></a>

 AWS [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)의 데이터 보호에 적용됩니다 AWS IoT Core. 이 모델에 설명된 대로 AWS 는 모든를 실행하는 글로벌 인프라를 보호할 책임이 있습니다 AWS 클라우드. 사용자는 이 인프라에 호스팅되는 콘텐츠에 대한 통제 권한을 유지할 책임이 있습니다. 사용하는 AWS 서비스 의 보안 구성과 관리 태스크에 대한 책임도 사용자에게 있습니다. 데이터 프라이버시에 관한 자세한 내용은 [데이터 프라이버시 FAQ](https://aws.amazon.com/compliance/data-privacy-faq/)를 참조하세요. 유럽의 데이터 보호에 대한 자세한 내용은 *AWS 보안 블로그*의 [AWS 공동 책임 모델 및 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 블로그 게시물을 참조하세요.

데이터 보호를 위해 자격 증명을 보호하고 AWS 계정 AWS IAM Identity Center 또는 AWS Identity and Access Management (IAM)를 사용하여 개별 사용자를 설정하는 것이 좋습니다. 이렇게 하면 개별 사용자에게 자신의 직무를 충실히 이행하는 데 필요한 권한만 부여됩니다. 또한 다음과 같은 방법으로 데이터를 보호하는 것이 좋습니다.
+ 각 계정에 다중 인증(MFA)을 사용합니다.
+ SSL/TLS를 사용하여 AWS 리소스와 통신합니다. TLS 1.2는 필수이며 TLS 1.3을 권장합니다.
+ 를 사용하여 API 및 사용자 활동 로깅을 설정합니다 AWS CloudTrail. CloudTrail 추적을 사용하여 AWS 활동을 캡처하는 방법에 대한 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [ CloudTrail 추적 작업을 참조하세요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html).
+ 내부의 모든 기본 보안 제어와 함께 AWS 암호화 솔루션을 사용합니다 AWS 서비스.
+ Amazon S3에 저장된 민감한 데이터를 검색하고 보호하는 데 도움이 되는 Amazon Macie와 같은 고급 관리형 보안 서비스를 사용합니다.
+ 명령줄 인터페이스 또는 API를 AWS 통해에 액세스할 때 FIPS 140-3 검증 암호화 모듈이 필요한 경우 FIPS 엔드포인트를 사용합니다. 사용 가능한 FIPS 엔드포인트에 대한 자세한 내용은 [연방 정보 처리 표준(FIPS) 140-3](https://aws.amazon.com/compliance/fips/)을 참조하세요.

고객의 이메일 주소와 같은 기밀 정보나 중요한 정보는 태그나 **이름** 필드와 같은 자유 형식 텍스트 필드에 입력하지 않는 것이 좋습니다. 여기에는 AWS IoT 또는 기타 AWS 서비스 에서 콘솔, API AWS CLI또는 AWS SDKs를 사용하여 작업하는 경우가 포함됩니다. 이름에 사용되는 태그 또는 자유 형식 텍스트 필드에 입력하는 모든 데이터는 청구 또는 진단 로그에 사용될 수 있습니다. 외부 서버에 URL을 제공할 때 해당 서버에 대한 요청을 검증하기 위해 자격 증명을 URL에 포함해서는 안 됩니다.

데이터 보호에 대한 자세한 내용은 *AWS 보안 블로그*의 [AWS 공동 책임 모델 및 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 블로그 게시물을 참조하세요.

AWS IoT 디바이스는 데이터를 수집하고 해당 데이터에 대한 일부 조작을 수행한 다음 해당 데이터를 다른 웹 서비스로 전송합니다. 짧은 기간 동안 디바이스에 일부 데이터를 저장하도록 선택할 수 있습니다. 사용자는 해당 유휴 데이터에 대해 모든 데이터 보호를 제공할 책임이 있습니다. 디바이스가 데이터를 전송할 때이 섹션의 뒷부분에서 설명한 대로 TLS 연결을 통해 데이터를 AWS IoT전송합니다. AWS IoT 디바이스는 모든 AWS 서비스로 데이터를 전송할 수 있습니다. 각 서비스의 데이터 보안에 대한 자세한 내용은 해당 서비스에 대한 설명서를 참조하세요. CloudWatch Logs에 로그를 쓰고 AWS IoT API 호출을 로깅하도록 구성할 AWS IoT 수 있습니다 AWS CloudTrail. 이러한 서비스의 데이터 보안에 대한 자세한 내용은 [ Amazon CloudWatch에 대한 인증 및 액세스 제어](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/auth-and-access-control-cw.html)와 [AWS KMS 관리형 키를 사용한 CloudTrail 로그 파일 암호화를 참조하세요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/encrypting-cloudtrail-log-files-with-aws-kms.html).

## 의 데이터 암호화 AWS IoT
<a name="data-protection-encrypt"></a>

기본적으로 전송 AWS IoT 중 및 저장 데이터는 모두 암호화됩니다. [전송 중인 데이터는 TLS를 사용하여 암호화](transport-security.md)되고 저장 데이터는 AWS 소유 키를 사용하여 암호화됩니다.는 AWS Key Management Service AWS KMS keys ()의 고객 관리형(KMS 키)을 AWS IoT 지원합니다AWS KMS. 그러나 Device Advisor 및 AWS IoT Wireless는 만 사용하여 고객 데이터를 암호화 AWS 소유 키 합니다.

 

# 의 전송 보안 AWS IoT Core
<a name="transport-security"></a>

전송 계층 보안(TLS)은 컴퓨터 네트워크를 통한 보안 통신을 위해 설계된 암호화 프로토콜입니다. AWS IoT Core Device Gateway를 사용하려면 디바이스에서 게이트웨이로의 연결에 TLS를 사용하여 전송 중 모든 통신을 암호화해야 합니다. TLS는 AWS IoT Core에서 지원하는 애플리케이션 프로토콜(MQTT, HTTP, WebSocket)의 기밀성을 달성하는 데 사용됩니다. TLS 지원은 다수의 프로그래밍 언어 및 운영 체제를 지원합니다. 내의 데이터는 특정 AWS 서비스에 의해 암호화 AWS 됩니다. 다른 AWS 서비스의 데이터 암호화에 대한 자세한 내용은 해당 서비스의 보안 설명서를 참조하세요.

**Topics**
+ [TLS 프로토콜](#tls-ssl-policy)
+ [보안 정책](#tls-policy-table)
+ [의 전송 보안을 위한 중요 참고 사항 AWS IoT Core](#tls-ssl-core)
+ [LoRaWAN 무선 디바이스를 위한 전송 보안](#tls-lorawan)

## TLS 프로토콜
<a name="tls-ssl-policy"></a>

AWS IoT Core 는 다음 버전의 TLS 프로토콜을 지원합니다.
+ TLS 1.3 
+ TLS 1.2

를 사용하면 도메인 구성에서 TLS 설정([TLS 1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2) 및 [TLS 1.3](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3)용)을 AWS IoT Core구성할 수 있습니다. 자세한 내용은 [도메인 구성에서 TLS 설정 구성](iot-endpoints-tls-config.md) 단원을 참조하십시오.

## 보안 정책
<a name="tls-policy-table"></a>

보안 정책은 클라이언트와 서버 간의 TLS 협상 중에 지원되는 프로토콜과 암호를 결정하는 TLS 프로토콜과 해당 암호의 조합입니다. 필요에 따라 미리 정의된 보안 정책을 사용하도록 디바이스를 구성할 수 있습니다. AWS IoT Core 는 사용자 지정 보안 정책을 지원하지 않습니다.

디바이스를 연결할 때 디바이스에 대해 사전 정의된 보안 정책 중 하나를 선택할 수 있습니다 AWS IoT Core. 에서 사전 정의된 최신 보안 정책의 이름에는 릴리스된 연도 및 월을 기반으로 한 버전 정보가 AWS IoT Core 포함됩니다. 기본 사전 정의 보안 정책은 `IoTSecurityPolicy_TLS13_1_2_2022_10`입니다. 보안 정책을 지정하려면 AWS IoT 콘솔 또는를 사용할 수 있습니다 AWS CLI. 자세한 내용은 [도메인 구성에서 TLS 설정 구성](iot-endpoints-tls-config.md) 단원을 참조하십시오.

다음 테이블에는 AWS IoT Core 에서 지원하는 가장 최근의 사전 정의된 보안 정책이 설명되어 있습니다. `IotSecurityPolicy_`가 제목 행의 정책 이름에서 제거되어 해당 위치에 맞게 조정되었습니다.


| **보안 정책** | TLS13\$11\$13\$12022\$110 | TLS13\$11\$12\$12022\$110 | TLS12\$11\$12\$12022\$110 | TLS12\$11\$10\$12016\$101\$1 | TLS12\$11\$10\$12015\$101\$1 | 
| --- | --- | --- | --- | --- | --- | 
| TCP 포트 |  443/8443/8883  |  443/8443/8883  |  443/8443/8883  | 443 | 8443/8883 | 443 | 8443/8883 | 
| TLS 프로토콜 | 
| TLS 1.2 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| TLS 1.3 | ✓ | ✓ |  |  |  |  |  | 
| TLS 암호 | 
| TLS\$1AES\$1128\$1GCM\$1SHA256 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1AES\$1256\$1GCM\$1SHA384 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1CHACHA20\$1POLY1305\$1SHA256 | ✓ | ✓ |  |  |  |  |  | 
| ECDHE-RSA-AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES128-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-SHA256 |  | ✓ | ✓ | ✓ |  | ✓ | ✓ | 
| AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| DHE-RSA-AES256-SHA |  |  |  |  |  | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 

**참고**  
`TLS12_1_0_2016_01`는 AWS 리전 ap-east-1, ap-northeast-2, ap-south-1, ap-southeast-2, ca-central-1, cn-north-1, cn-northwest-1, eu-north-1, eu-west-2, eu-west-3, me-south-1, sa-east-1, us-east-2, us-gov-west-1, us-gov-west-2, us-west-1에서만 사용할 수 있습니다.  
`TLS12_1_0_2015_01`는 AWS 리전 ap-northeast-1, ap-southeast-1, eu-central-1, eu-west-1, us-east-1, us-west-2에서만 사용할 수 있습니다.

## 의 전송 보안을 위한 중요 참고 사항 AWS IoT Core
<a name="tls-ssl-core"></a>

[MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html)를 AWS IoT Core 사용하여에 연결하는 디바이스의 경우 TLS는 디바이스와 브로커 간의 연결을 암호화하고 TLS 클라이언트 인증을 AWS IoT Core 사용하여 디바이스를 식별합니다. 자세한 내용은 [클라이언트 인증](https://docs.aws.amazon.com//iot/latest/developerguide/client-authentication.html)을 참조하세요. [HTTP](https://docs.aws.amazon.com//iot/latest/developerguide/http.html)를 AWS IoT Core 사용하여에 연결하는 디바이스의 경우 TLS는 디바이스와 브로커 간의 연결을 암호화하고 인증은 AWS 서명 버전 4에 위임됩니다. 자세한 내용은 **AWS 일반 참조에서 [서명 버전 4를 사용하여 요청에 서명](https://docs.aws.amazon.com//general/latest/gr/create-signed-request.html)을 참조하세요.

디바이스를 연결할 때 [SNI(Server Name Indication) 확장](https://tools.ietf.org/html/rfc3546#section-3.1)을 AWS IoT Core보낼 필요는 없지만 적극 권장됩니다. [다중 계정 등록](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html#multiple-account-cert), [사용자 지정 도메인](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable-custom.html), [VPC 엔드포인트](https://docs.aws.amazon.com//iot/latest/developerguide/IoTCore-VPC.html) 및 [구성된 TLS 정책](https://docs.aws.amazon.com//iot/latest/developerguide/iot-endpoints-tls-config.html)과 같은 기능을 사용하려면, SNI 확장을 사용하고 `host_name` 필드에 전체 엔드포인트 주소를 제공해야 합니다. `host_name` 필드에는 호출하는 엔드포인트가 포함되어야 합니다. 이 엔드포인트는 다음 중 하나여야 합니다.
+ `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:Data-ATS`에서 반환한 `endpointAddress`
+ `aws iot [describe-domain-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-domain-configuration.html) –-domain-configuration-name "domain_configuration_name"`에서 반환한 `domainName`

올바르지 않거나 잘못된 `host_name` 값을 가진 디바이스에서 시도한 연결은 실패합니다. AWS IoT Core 는 [사용자 지정 인증](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)의 인증 유형에 대해 CloudWatch에 실패를 기록합니다.

AWS IoT Core 는 [SessionTicket TLS 확장](https://www.ietf.org/rfc/rfc5077.txt)을 지원하지 않습니다.

## LoRaWAN 무선 디바이스를 위한 전송 보안
<a name="tls-lorawan"></a>

LoRaWAN 디바이스는 [LoRaWAN™ 보안: LoRa Alliance™에 Gemalto, Actility 및 Semtech이 준비한 백서](https://lora-alliance.org/sites/default/files/2019-05/lorawan_security_whitepaper.pdf)에 설명된 보안 연습을 따릅니다.

LoRaWAN 디바이스를 사용한 전송 보안에 대한 자세한 내용은 [LoRaWAN 데이터 및 전송 보안](https://docs.aws.amazon.com/iot-wireless/latest/developerguide/iot-lorawan-security.html) 섹션을 참조하세요.

# 의 데이터 암호화 AWS IoT
<a name="data-encryption"></a>

데이터 보호는 전송 중(로/에서 이동하는 동안 AWS IoT Core) 및 저장 중(디바이스 또는 다른 AWS 서비스에 저장되는 동안) 데이터를 보호하는 것을 말합니다. 로 전송되는 모든 데이터는 MQTT, HTTPS 및 WebSocket 프로토콜을 사용하여 TLS 연결을 통해 전송되므로 전송 중에 기본적으로 안전합니다. AWS IoT Core 는 디바이스에서 데이터를 AWS IoT Core 수집한 다음 추가 처리를 위해 다른 AWS 서비스로 전송합니다. 다른 AWS 서비스의 데이터 암호화에 대한 자세한 내용은 해당 서비스의 보안 설명서를 참조하세요. 자세한 내용은 [유휴 시 저장된 데이터 암호화](encryption-at-rest.md)를 참조하세요.

FreeRTOS는 키 스토리지를 추상화하여 암호화 객체에 액세스하고 세션을 관리하는 PKCS \$111 라이브러리를 제공합니다. 이 라이브러리를 사용하여 디바이스에 저장된 데이터를 암호화하는 것은 사용자의 책임입니다. 자세한 내용은 [ FreeRTOS퍼블릭 키 암호화 표준(PKCS) \$111 라이브러리](https://docs.aws.amazon.com/freertos/latest/userguide/security-pkcs.html)를 참조하세요.

# 에서 저장 데이터 암호화 AWS IoT Core
<a name="encryption-at-rest"></a>

기본적으로 모든 저장 AWS IoT Core 데이터는 AWS 소유 키를 사용하여 암호화됩니다.는 AWS Key Management Service ()의 대칭 고객 관리형 키 AWS IoT Core 도 지원합니다AWS KMS. 고객 관리형 키를 사용하면 AWS 계정에서 AWS KMS 키를 생성, 소유 및 관리할 수 있습니다. AWS IoT Core 는 KMS 키를 사용하여 저장 데이터를 암호화합니다. 키 정책 생성 및 유지 관리를 포함하여, 이러한 KMS 키를 완전히 제어할 수 있습니다. 이러한 키에 대한 권한을 제어 AWS KMS 하기 위해에 액세스하는 역할에 대한 IAM 정책을 구성할 수도 있습니다.

## AWS 소유 키
<a name="aws-owned-keys"></a>

AWS 소유 키는 AWS 서비스가 여러 AWS 계정에서 사용하기 위해 소유하고 관리하는 KMS 키 모음입니다. AWS 서비스는 AWS 소유 키를 사용하여 데이터를 보호할 수 있습니다. 기본적으로는 AWS 소유 키를 사용하여 저장 데이터를 AWS IoT Core 암호화합니다. 이러한 키는 해당 서비스에서 관리합니다. AWS 소유 키를 보거나 관리하거나 사용할 수 없습니다. 그러나 이러한 키를 보호하기 위해 조치를 취할 필요는 없습니다.

 AWS 소유 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS 소유 키를](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key) 참조하세요.

## 고객 관리형 키
<a name="customer-managed-keys"></a>

고객 관리형 키는 사용자가 생성, 소유 및 관리하는 AWS 계정의 KMS 키입니다. 키 정책 생성 및 유지 관리를 포함하여, 이러한 AWS KMS 키를 완전히 제어할 수 있습니다. 이러한 키에 대한 권한을 제어 AWS KMS 하기 위해에 액세스하는 역할에 대한 IAM 정책을 구성할 수도 있습니다. 고객 관리형 KMS 키를 사용하여 데이터를 암호화 AWS IoT Core 하도록를 구성할 수 있습니다.

고객 관리형 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 참조하세요.

고객 관리형 키를 옵트인하려면 다음 단계를 AWS IoT Core따르세요.

**Topics**
+ [1단계: 고객 관리형 키 만들기](#encryption-at-rest-cmk-create)
+ [2단계: KMS 키를 사용할 수 있는 AWS IoT Core 권한을 부여하는 IAM 역할 생성](#create-an-iam-role)
+ [3단계:에서 고객 관리형 키에 옵트인 AWS IoT Core](#opt-in-customer-managed-keys)
+ [4단계: AWS IoT Core 컨트롤 플레인 작업에 필요한 추가 권한](#cmk-control-plane-permissions)
+ [5단계: 키 관리](#understanding-key-health)
+ [6단계: 키 상태 모니터링](#health-status-monitoring)

### 1단계: 고객 관리형 키 만들기
<a name="encryption-at-rest-cmk-create"></a>

 AWS KMS 콘솔 또는 AWS KMS CLI 명령을 사용하여 대칭 고객 관리형 키를 생성할 수 있습니다. `keySpec`는 `SYMMETRIC_DEFAULT`여야 하고, `keyUsage`는 `ENCRYPT_DECRYPT`여야 합니다.

**참고**  
AWS IoT Core 는 고객 관리형 AWS KMS 키에 대한 `SYMMETRIC_DEFAULT` 키 사양 및 `ENCRYPT_DECRYPT` 키 사용이 있는 키만 지원합니다.

다음은 AWS IoT Core 고객 관리형 키에와 함께 사용할 수 있는 KMS 키를 생성하는 AWS CLI 명령의 예입니다.

```
aws kms create-key --key-spec SYMMETRIC_DEFAULT --key-usage ENCRYPT_DECRYPT --region us-west-2
```

다음은 명령의 출력 예제입니다.

```
{
    "KeyMetadata": {
        "AWSAccountId": "111122223333",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "CreationDate": "2024-09-19T11:45:23.982000-07:00",
        "Enabled": true,
        "Description": "",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "Origin": "AWS_KMS",
        "KeyManager": "CUSTOMER",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeySpec": "SYMMETRIC_DEFAULT",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ],
        "MultiRegion": false
    }
}
```

자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [대칭 고객 관리형 키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)을 참조하세요.

#### 키 정책
<a name="key-policy"></a>

고객 관리형 키를 만들 때 키 정책을 지정할 수 있습니다. 키 정책에서는 고객 관리형 키에 대한 액세스를 제어합니다. 모든 고객 관리형 키에는 키를 사용할 수 있는 사람과 키를 사용하는 방법을 결정하는 문장이 포함된 정확히 하나의 키 정책이 있어야 합니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)을 참조하세요.

AWS IoT Core 는 계정의 IAM 역할을 사용하여 고객 관리형 키에 액세스합니다. 사용자 지정 키 정책을 사용하는 경우, 이 키에서 생성된 IAM 역할에 다음 권한이 있는지 확인합니다.
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

### 2단계: KMS 키를 사용할 수 있는 AWS IoT Core 권한을 부여하는 IAM 역할 생성
<a name="create-an-iam-role"></a>

 AWS IoT Core 가 저장 데이터를 암호화하기 위해 생성한 KMS 키를 사용하려면 계정에 IAM 역할도 생성해야 합니다.이 역할은가 KMS 키에 액세스하는 것으로 가정할 AWS IoT Core 수 있습니다.

가 역할을 AWS IoT Core 수임하도록 허용하려면 역할에 다음 신뢰 정책이 있어야 합니다.

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

IAM 역할에 연결된 IAM 정책에 KMS 키에 대한 다음 권한이 있는지 확인합니다.
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

다음은 고객 관리형 키에 필요한 권한이 있는 IAM 정책의 예입니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowIoTToAccessKMSResource",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:ReEncryptTo",
                "kms:ReEncryptFrom",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": [
                "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            ],
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws-crypto-ec:vendor": "iot.amazonaws.com"
                }
            }
        }
    ]
}
```

자세한 정보는 *AWS Identity and Access Management 사용 설명서*의 [IAM 사용자에게 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)을 참조하세요.

### 3단계:에서 고객 관리형 키에 옵트인 AWS IoT Core
<a name="opt-in-customer-managed-keys"></a>

이전 단계를 모두 완료한 후, AWS IoT Core에서 고객 관리형 키를 사용해 `update-encryption-configuration` CLI 명령을 실행하여 옵트인합니다. 고객 관리형 키를 옵트인하면 AWS 계정의 모든 AWS IoT Core 리소스가 지정된 AWS KMS 키를 사용하여 암호화됩니다.

1. 를 AWS IoT Core 사용하여에서 고객 관리형 키를 옵트인하려면 `update-encryption-configuration` CLI 명령을 AWS CLI실행합니다.

   ```
   aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \
   --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \
   --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" --region us-west-2
   ```

1. 를 AWS IoT Core 사용하여에서 고객 관리형 키를 확인하려면 `describe-encryption-configuration` CLI 명령을 AWS CLI실행합니다.

   ```
   aws iot describe-encryption-configuration --region us-west-2
   ```

   에서 고객 관리형 키를 활성화한 경우 출력 AWS IoT Core은 다음과 같을 수 있습니다.

   ```
   {
       "encryptionType": "CUSTOMER_MANAGED_KMS_KEY",
       "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
       "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole",
       "configurationDetails": {
           "configurationStatus": "HEALTHY"
       },
       "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00"
   }
   ```

   `lastModifiedDate` 필드는 암호화 구성이 마지막으로 업데이트된 날짜를 나타냅니다.

   고객 관리형 키를 활성화하지 않은 경우 출력은 다음과 같을 수 있습니다.

   ```
   {
       "encryptionType": "AWS_OWNED_KMS_KEY",
       "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00"
   }
   ```

### 4단계: AWS IoT Core 컨트롤 플레인 작업에 필요한 추가 권한
<a name="cmk-control-plane-permissions"></a>

고객 관리형 키를 옵트인하면 AWS 계정에 속한 모든 AWS IoT Core 리소스가 제공된 KMS 키로 암호화됩니다. 이제 모든 컨트롤 플레인 작업을 수행하려면 호출자에게 AWS IoT Core 리소스의 특정 작업에 필요한 `kms:Decrypt` 권한 외에도 KMS 키에 대한 권한이 있어야 합니다. 호출자에게 `kms:Decrypt` 권한이 없고 데이터 암호화 또는 복호화가 필요한 API 직접 호출(예: `GetPolicy`)을 수행하는 경우, 호출자는 `UnauthorizedException`을 수신합니다.

예를 들어, `GetPolicy`를 직접 호출할 때, API 직접 호출이 성공하려면 고객 관리형 KMS 키에 대한 `iot:GetPolicy` 및 `kms:Decrypt` 권한이 모두 필요합니다.

**참고**  
암호화 구성에 사용되는 키에 대한 AWS KMS 권한을 부여하도록 IAM 사용자 또는 역할을 업데이트할 때 KMS 키 정책이 각 IAM 사용자 또는 역할에 필요한 권한도 부여하는지 확인합니다.

#### AWS KMS 에 대한 권한 `UpdateEncryptionConfiguration`
<a name="kms-permissions-update-encryption-configuration"></a>

고객 관리형 키를 옵트인하거나 키 구성을 수정하려면 `UpdateEncryptionConfiguration` API 호출에 KMS 키에 대한 다음 AWS KMS 권한이 필요합니다.
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

#### AWS KMS 다른 모든 컨트롤 플레APIs에 대한 권한
<a name="kms-permissions-control-plane-apis"></a>

대부분의 컨트롤 플레인 API는 고객 관리형 키가 활성화된 경우 `kms:Decrypt` 권한이 필요합니다. 그러나 특정 API는 다음과 같은 추가 권한이 필요하지 않습니다.

 AWS KMS 권한이 필요하지 않은 APIs   
`List*` 및 `Delete*` API는 이 버킷에 포함되지 않습니다. 고객은 언제든지 `List*` 또는 `Delete*` 컨트롤 플레인 API를 간접적으로 호출할 수 있으며, 호출자에게 `kms:Decrypt` 권한이 없더라도 해당 API 직접 호출이 성공합니다. `List*` 및 `Delete*` API가 복호화를 수행하지 않아 고객 관리형 키가 비정상이더라도 이러한 API 직접 호출은 성공합니다.  
+ **List\$1 API** - 모든 나열 작업(예: `ListThings`, `ListPolicies`, `ListCertificates`)
+ **Delete\$1 API** - 모든 삭제 작업(예: `DeleteThing`, `DeletePolicy`, `DeleteCertificate`)

### 5단계: 키 관리
<a name="understanding-key-health"></a>

AWS IoT Core 는 고객 관리형 키 구성을 정기적으로 확인하여 암호화 및 복호화 작업이 영향을 받지 않도록 합니다. 이러한 상태 확인은 1분마다 한 번씩 실행되며 암호화 및 복호화 작업을 위해 AWS KMS 키 및 연결된 IAM 역할에 액세스하고 사용할 수 AWS IoT Core있는지 확인합니다.

HEALTHY  
AWS IoT Core 는 지정된 IAM 역할을 통해 AWS KMS 키에 성공적으로 액세스하고 암호화/복호화 작업을 수행할 수 있습니다. 모든 구성 요소가 올바르게 작동합니다.

UNHEALTHY  
AWS IoT Core 는 AWS KMS 키에 액세스하거나 사용할 수 없습니다. 이로 인해 새 암호화 작업을 방해하고 서비스 기능에 영향을 미칠 수 있습니다. `errorCode` 필드는 문제가 해당 키 또는 IAM 역할에 있는지 여부를 나타냅니다.

#### 키 상태에 영향을 미칠 수 있는 고객 작업
<a name="customer-actions-affecting-health"></a>

몇 가지 고객 작업으로 인해 키 상태가 `HEALTHY`에서 `UNHEALTHY`로 변경될 수 있습니다.

키 관련 작업  
+ ** AWS KMS 키 삭제 **- 키 삭제를 예약하면 키가 `Pending deletion` 상태이므로 사용할 수 없습니다.
+ ** AWS KMS 키 비활성화** - KMS 키를 비활성화하면 더 이상 암호화/복호화 작업에 사용할 수 없습니다.
+ **키 삭제 예약** - 삭제가 완료되면 키를 사용할 수 없게 됩니다.
+ **키 정책 수정 **- AWS IoT Core 액세스에 필요한 권한 제거
+ **키 사용 권한 변경** - 필요한 AWS KMS 작업 제한

IAM 역할 관련 작업  
+ **IAM 역할 삭제 **- 키에 액세스하기 위해 역할을 수임할 수 AWS IoT Core 없음
+ **역할 권한 수정 **- 역할 정책에서 필요한 AWS KMS 권한 제거
+ **신뢰 정책 변경** - AWS IoT Core 서비스가 역할을 수임하지 못하도록 방지
+ **제한적인 조건 추가** -가 역할을 AWS IoT Core 사용하지 못하게 하는 조건

계정 수준 작업  
+ **교차 계정 키 액세스 변경** - 서로 다른 계정의 키에 대한 권한 수정
+ **서비스 제어 정책(SCPs)** - AWS KMS 액세스를 제한하는 조직 수준 정책
+ **계정 수준 IAM 정책** - 키 액세스를 재정의하거나 키 액세스와 충돌하는 정책

**중요**  
에서 사용하는 AWS KMS 키, IAM 역할 또는 정책에 대한 모든 변경 사항은 먼저 개발 환경에서 테스트해야 AWS IoT Core 합니다. 변경 후 키 상태를 면밀히 모니터링하여 AWS IoT Core 기능에 영향을 주지 않도록 합니다.

#### 암호화 구성 업데이트
<a name="key-transition"></a>

한 고객 관리형 키에서 다른 고객 관리형 키로 또는 AWS 소유 키와 고객 관리형 키 간에 변경 AWS IoT Core 하도록에서 암호화 구성을 업데이트합니다.

구성을 다른 고객 관리형 키로 변경하려면 다음을·수행하세요.

1. [1단계: 고객 관리형 키 만들기](#encryption-at-rest-cmk-create)의 단계에 따라 새 고객 관리형 키를 생성합니다.

1. 업데이트 기간 동안 이전 키와 새 키 모두에 대한 권한을 포함하도록 IAM 역할 정책을 업데이트합니다.

1. 다음과 같이 새 키를 사용하도록 암호화 구성을 업데이트합니다.

   ```
   aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \
   --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \
   --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/new-key-id"
   ```

고객 관리형 키에서 AWS 소유 키로 구성을 변경하려면:

```
aws iot update-encryption-configuration --encryption-type "AWS_OWNED_KMS_KEY"
```

**참고**  
새 고객 관리형 키의 암호화 구성을 업데이트할 때, 이전 키와 새 키 모두에 계속 액세스할 수 있어야 작업이 성공할 수 있습니다.

##### 일반적인 장애 시나리오 및 영향
<a name="failure-scenarios"></a>

다음 표에서는 키가 삭제되거나 비활성화되는 일반적인 장애 시나리오를 설명합니다.


| 시나리오 | 즉각적인 영향 | 장기적인 결과 | 
| --- | --- | --- | 
|  키가 비활성화됨  |  모든 새 암호화/복호화 작업이 즉시 실패합니다.  |  키가 다시 활성화되거나 교체될 때까지 서비스 중단  | 
|  키 삭제 예약  |  키 상태가 삭제 보류 중으로 변경되고 모든 암호화/복호화 작업이 실패합니다.  |  삭제 완료 시 자동 서비스 장애 발생  | 
|  키가 영구적으로 삭제됨  |  모든 작업이 즉각적, 영구적으로 실패  |  영구 데이터 손실 및 암호화된 데이터 복구 불가  | 
|  키 정책이 잘못 수정됨  |  AWS IoT Core 키에 대한 액세스 권한을 잃음  |  정책이 수정될 때까지 서비스 장애 발생  | 
|  IAM 역할 삭제됨  |  AWS IoT Core 는 키에 액세스하기 위한 역할을 수임할 수 없습니다.  |  전체 암호화 서비스 장애 발생  | 
|  IAM 역할이 잘못 수정됨  |  AWS IoT Core 는 역할을 수임하거나 역할을 사용하여 키에 액세스할 수 없습니다.  |   IAM 역할이 수정될 때까지 서비스 장애 발생  | 

##### 예방 및 모범 사례
<a name="prevention-best-practices"></a>

우발적인 키 삭제 또는 비활성화를 방지하고 서비스 장애 위험을 최소화하려면 다음을 수행합니다.

키 수명 주기 정책 구현  
키 생성, 교체 및 사용 중지에 대한 명확한 절차를 설정합니다. 어떤 키가 어떤 AWS IoT Core 리소스에서 사용되는지 문서화하고 활성 키의 인벤토리를 유지 관리합니다.

IAM 정책을 사용하여 키 삭제 제한  
권한이 없는 사용자가 중요한 암호화 키를 삭제하거나 비활성화하지 못하도록 방지하는 IAM 정책을 생성합니다. 조건을 사용하여 키 삭제 작업에 대한 추가 승인이 필요합니다.

CloudTrail 로깅 활성화  
CloudTrail을 통해 모든 AWS KMS 키 작업을 모니터링하여 무단 또는 우발적 키 관리 활동을 탐지합니다. 키 삭제, 비활성화 또는 정책 변경에 대한 알림을 설정합니다.

키 교체 절차 테스트  
비프로덕션 환경에서 키 교체 절차를 정기적으로 테스트하여, 키 관련 장애로부터 신속하게 복구할 수 있는지 확인합니다.

키 백업 유지 관리  
 AWS KMS 키 구성 요소를 내보낼 수는 없지만 필요한 경우 키 ARNs, 정책 및 관련 AWS IoT Core 구성에 대한 세부 레코드를 유지하여 키 교체를 신속하게 수행할 수 있습니다.

키 상태 모니터링  
`CMK.Health` 지표를 지속적으로 모니터링하고 주요 상태 변경에 대한 자동 알림을 설정합니다. 자동화된 응답을 구현하여 키 관련 문제를 신속하게 해결합니다.

**중요**  
프로덕션 환경에서 키 업데이트 절차를 구현하기 전에 항상 개발 환경에서 키 업데이트 절차를 테스트합니다. 문서화된 롤백 계획을 수립하고, 긴급 상황 발생 시 키 교체 절차를 신속하게 실행할 수 있는지 확인합니다.

### 6단계: 키 상태 모니터링
<a name="health-status-monitoring"></a>

정기 점검 AWS IoT Core 실행의 일부로 CloudWatch 지표 및 로그가 생성되어 고객 관리형 키 구성의 상태를 파악할 수 있습니다.

AWS IoT Core 는 1분에 한 번 이상 CloudWatch에 `CMK.Health` 지표를 내보냅니다. 지표는가 데이터를 암호화하고 해독하는 데 사용하는 고객 관리형 키의 상태에 AWS IoT Core 대한 정보를 제공합니다.

`CMK.Health` 지표에는 다음과 같은 값이 있습니다.
+ 값은 `1`: AWS IoT Core 이며 데이터 암호화 및 복호화에 암호화 키를 성공적으로 사용할 수 있습니다.
+ 값은 입니다`0`.는 데이터 암호화 및 복호화에 암호화 키를 사용할 수 AWS IoT Core 없습니다.

AWS IoT Core 는 암호화 키의 상태가 변경될 때 AWS IoT 도 V2 로그를 내보냅니다. 이러한 로그는 상태 업데이트에 대한 추가 세부 정보를 제공합니다. 이러한 로그를 보려면 AWS IoT V2 로그를 활성화해야 합니다. `HEALTHY` 로그는 `INFO` 수준에서 내보내고 `UNHEALTHY` 로그는 `ERROR` 수준에서 내보냅니다. 로그 수준에 대한 자세한 내용은 [로그 수준](https://docs.aws.amazon.com/iot/latest/developerguide/configure-logging.html#log-level) 섹션을 참조하세요.

다음 예는 고객 관리형 키의 상태 업데이트를 나타내기 AWS IoT Core 위해에서 내보낸 CloudWatch 로그 항목입니다.

주요 상태 변경을 효과적으로 모니터링하고 변경에 대응하려면 다음을·수행하세요.

1. `CMK.Health` 지표에 대한** CloudWatch 경보를 설정합니다**.

   ```
   aws cloudwatch put-metric-alarm --region us-west-2 \
     --alarm-name "IoTCore-CMK-Health-Alert" \
     --alarm-description "Alert when IoT Core CMK health is unhealthy" \
     --metric-name "CMK.Health" \
     --namespace "AWS/IoT" \
     --statistic "Minimum" \
     --period 300 \
     --evaluation-periods 1 \
     --threshold 1 \
     --comparison-operator "LessThanThreshold" \
     --alarm-actions "arn:aws:sns:us-west-2:111122223333:iot-alerts"
   ```

1. **Enable AWS IoT V2 로깅**을 사용하여 오류 코드 및 메시지와 함께 세부 상태 변경 이벤트를 캡처합니다.

1. 문제 해결을 위해 **구성 상태를 확인합니다**.

   ```
   aws iot describe-encryption-configuration --region us-west-2
   ```

1. `errorCode` 필드를 검사하여 **UNHEALTHY 상태를 조사**합니다.
   + `KMS_KEY_VALIDATION_ERROR` - AWS KMS 키 관련 문제(비활성화, 삭제 또는 정책 문제)
   + `ROLE_VALIDATION_ERROR` - IAM 역할 관련 문제(삭제, 정책 문제 또는 신뢰 문제)

#### UNHEALTHY에서 HEALTHY로
<a name="unhealthy-to-healthy"></a>

암호화 키의 상태가에서 `UNHEALTHY`로 업데이트되면는 다음 형식으로 AWS IoT V2 로그 메시지를 내`HEALTHY` AWS IoT Core 보냅니다.

```
{
    "timestamp": "2017-08-10 15:37:23.476",
    "logLevel": "INFO",
    "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d",
    "accountId": "111122223333",
    "status": "SUCCESS",
    "cmkStatus": "HEALTHY",
    "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole",
    "eventType": "CmkHealthCheck"
}
```

#### HEALTHY에서 UNHEALTHY로
<a name="healthy-to-unhealthy"></a>

암호화 키의 상태가에서 `HEALTHY`로 업데이트되면는 다음 형식으로 AWS IoT V2 로그 메시지를 내`UNHEALTHY` AWS IoT Core 보냅니다.

```
{
    "timestamp": "2017-08-10 15:37:23.476",
    "logLevel": "ERROR",
    "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d",
    "accountId": "111122223333",
    "status": "FAILURE",
    "cmkStatus": "UNHEALTHY",
    "errorCode": "KMS_KEY_VALIDATION_ERROR / ROLE_VALIDATION_ERROR",
    "errorMessage": "Error message on why there was a failure",
    "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole",
    "eventType": "CmkHealthCheck"
}
```

**주의**  
키 상태가 되면 `UNHEALTHY` AWS IoT Core 작업이 즉시 실패합니다. 이 경우에 키 구성, IAM 역할 권한 및 정책을 검토합니다. `CMK.Health` 지표에서 상태 변경을 모니터링합니다. 구성을 검토한 후에도 작업이 계속 실패하면, 계정 관리자 또는 [AWS 지원 센터에](https://console.aws.amazon.com/support/home#/) 문의하여 추가 지원을 받으세요.

#### AWS CloudTrail 이벤트
<a name="aws-cloudtrail-events"></a>

암호화 복호화 작업에 대한 KMS 키 AWS IoT Core사용을 모니터링할 수도 있습니다. `Decrypt` AWS IoT Core 는 KMS 키에 대해 `DescribeKey`, `ReEncrypt`, 및 `GenerateDataKeyWithoutPlaintext` 작업을 수행하여 저장 시 저장된 AWS 계정에 속한 데이터를 암호화/복호화합니다.

`DescribeKey`, `Decrypt`, `ReEncrypt` 및 `GenerateDataKeyWithoutPlaintext`에 대한 CloudTrail 이벤트가 있습니다. 이러한 이벤트는에서 호출한 AWS KMS 작업을 모니터링 AWS IoT Core 하여 고객 관리형 키로 암호화된 데이터에 액세스합니다.

##### `Decrypt` 예
<a name="decrypt"></a>

```
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "accessKeyId": "*********************",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01",
                "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
                "accountId": "111122223333",
                "userName": "*****"
            },
            "attributes": {
                "creationDate": "2024-09-16T20:23:39Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "iot.amazonaws.com"
    },
    "eventTime": "2024-09-16T20:32:48Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "iot.amazonaws.com",
    "userAgent": "iot.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "kms-arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "aws-crypto-ec:vendor": "iot.amazonaws.com",
            "branch-key-id": "111122223333",
            "type": "branch:ACTIVE"
        },
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    },
    "responseElements": null,
    "requestID": "1afb6d98-8388-455d-8b48-e62c9e0cf7f4",
    "eventID": "b59a5f16-0d98-46d8-a590-0e040a48b39b",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

# 에 대한 자격 증명 및 액세스 관리 AWS IoT
<a name="security-iam"></a>

AWS Identity and Access Management (IAM)는 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어하는 데 도움이 AWS 서비스 되는 입니다. IAM 관리자는 AWS IoT 리소스를 사용할 수 있는 *인증*(로그인) 및 *권한*(권한 있음)을 받을 수 있는 사용자를 제어합니다. IAM은 추가 비용 없이 사용할 수 AWS 서비스 있는 입니다.

**Topics**
+ [대상](#security_iam_audience)
+ [IAM 자격 증명을 통한 인증](#security_iam_authentication)
+ [정책을 사용하여 액세스 관리](#security_iam_access-manage)
+ [AWS IoT 에서 IAM을 사용하는 방법](security_iam_service-with-iam.md)
+ [AWS IoT 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md)
+ [AWS 에 대한 관리형 정책 AWS IoT](security-iam-awsmanpol.md)
+ [AWS IoT 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md)

## 대상
<a name="security_iam_audience"></a>

 AWS Identity and Access Management (IAM)를 사용하는 방법은 역할에 따라 다릅니다.
+ **서비스 사용자** - 기능에 액세스할 수 없는 경우 관리자에게 권한 요청(참조[AWS IoT 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md))
+ **서비스 관리자** - 사용자 액세스 결정 및 권한 요청 제출([AWS IoT 에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 참조)
+ **IAM 관리자** - 액세스를 관리하기 위한 정책 작성([AWS IoT 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 참조)

## IAM 자격 증명을 통한 인증
<a name="security_iam_authentication"></a>

에서 AWS IoT ID는 디바이스(X.509) 인증서, Amazon Cognito ID 또는 IAM 사용자 또는 그룹일 수 있습니다. 이 주제에서는 IAM 자격 증명에 대해서만 설명합니다. 에서 AWS IoT 지원하는 다른 자격 증명에 대한 자세한 내용은 섹션을 참조하세요[클라이언트 인증](client-authentication.md).

인증은 자격 증명 자격 증명을 AWS 사용하여에 로그인하는 방법입니다. AWS 계정 루트 사용자, IAM 사용자 또는 IAM 역할을 수임하여 인증해야 합니다.

 AWS IAM Identity Center (IAM Identity Center), Single Sign-On 인증 또는 Google/Facebook 자격 증명과 같은 자격 증명 소스의 자격 증명을 사용하여 페더레이션 자격 증명으로 로그인할 수 있습니다. 로그인하는 방법에 대한 자세한 내용은 *AWS Sign-In 사용 설명서*의 [AWS 계정에 로그인하는 방법](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 섹션을 참조하세요.

프로그래밍 방식 액세스를 위해는 요청에 암호화 방식으로 서명할 수 있는 SDK 및 CLI를 AWS 제공합니다. 자세한 내용은 *IAM 사용 설명서*의 [API 요청용AWS Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 섹션을 참조하세요.

### AWS 계정 루트 사용자
<a name="security_iam_authentication-rootuser"></a>

 를 생성할 때 모든 AWS 서비스 및 리소스에 대한 완전한 액세스 권한이 있는 AWS 계정 *theroot 사용자*라는 하나의 로그인 자격 증명으로 AWS 계정시작합니다. 일상적인 태스크에 루트 사용자를 사용하지 않을 것을 강력히 권장합니다. 루트 사용자가 필요한 작업 목록은 *IAM 사용자 설명서*의 [루트 사용자 자격 증명이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 참조하세요.

### IAM 사용자 및 그룹
<a name="security_iam_authentication-iamuser"></a>

*[IAM 사용자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*는 단일 개인 또는 애플리케이션에 대한 특정 권한을 가진 ID입니다. 장기 자격 증명이 있는 IAM 사용자 대신 임시 자격 증명을 사용하는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 자격 [증명 공급자와의 페더레이션을 사용하여 임시 자격 증명을 AWS 사용하여에 액세스하도록 인간 사용자에게 요구](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)하기를 참조하세요.

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)은 IAM 사용자 모음을 지정하고 대규모 사용자 집합에 대한 관리 권한을 더 쉽게 만듭니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자 사용 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html) 섹션을 참조하세요.

### IAM 역할
<a name="security_iam_authentication-iamrole"></a>

*[IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*은 임시 자격 증명을 제공하는 특정 권한이 있는 자격 증명입니다. [사용자에서 IAM 역할(콘솔)로 전환하거나 또는 API 작업을 호출하여 역할을](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html) 수임할 수 있습니다. AWS CLI AWS 자세한 내용은 *IAM 사용 설명서*의 [역할 수임 방법](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)을 참조하세요.

IAM 역할은 페더레이션 사용자 액세스, 임시 IAM 사용자 권한, 교차 계정 액세스, 교차 서비스 액세스 및 Amazon EC2에서 실행되는 애플리케이션에 유용합니다. 자세한 내용은 *IAM 사용 설명서*의 [교차 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

## 정책을 사용하여 액세스 관리
<a name="security_iam_access-manage"></a>

정책을 AWS 생성하고 자격 증명 또는 리소스에 연결하여 AWS 에서 액세스를 제어합니다. 정책은 자격 증명 또는 리소스와 연결될 때 권한을 정의합니다.는 보안 주체가 요청할 때 이러한 정책을 AWS 평가합니다. 대부분의 정책은에 JSON 문서 AWS 로 저장됩니다. JSON 정책 문서에 대한 자세한 내용은 *IAM 사용 설명서*의 [JSON 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json) 섹션을 참조하세요.

정책을 사용하여 관리자는 어떤 **보안 주체**가 어떤 **리소스**에 대해 어떤 **조건**에서 **작업**을 수행할 수 있는지 정의하여 누가 무엇을 액세스할 수 있는지 지정합니다.

기본적으로 사용자 및 역할에는 어떠한 권한도 없습니다. IAM 관리자는 IAM 정책을 생성하고 사용자가 수임할 수 있는 역할에 추가합니다. IAM 정책은 작업을 수행하기 위해 사용하는 방법과 관계없이 작업에 대한 권한을 정의합니다.

### ID 기반 정책
<a name="security_iam_access-manage-id-based-policies"></a>

ID 기반 정책은 ID(사용자, 사용자 그룹 또는 역할)에 연결하는 JSON 권한 정책 문서입니다. 이러한 정책은 자격 증명이 수행할 수 있는 작업, 대상 리소스 및 이에 관한 조건을 제어합니다. ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*에서 [고객 관리형 정책으로 사용자 지정 IAM 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)를 참조하세요.

ID 기반 정책은 *인라인 정책*(단일 ID에 직접 포함) 또는 *관리형 정책*(여러 ID에 연결된 독립 실행형 정책)일 수 있습니다. 관리형 정책 또는 인라인 정책을 선택하는 방법을 알아보려면 *IAM 사용 설명서*의 [관리형 정책 및 인라인 정책 중에서 선택](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html) 섹션을 참조하세요.

### 리소스 기반 정책
<a name="security_iam_access-manage-resource-based-policies"></a>

리소스 기반 정책은 리소스에 연결하는 JSON 정책 설명서입니다. 예를 들어 IAM *역할 신뢰 정책* 및 Amazon S3 *버킷 정책*이 있습니다. 리소스 기반 정책을 지원하는 서비스에서 서비스 관리자는 이러한 정책을 사용하여 특정 리소스에 대한 액세스를 통제할 수 있습니다. 리소스 기반 정책에서 [보안 주체를 지정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)해야 합니다.

리소스 기반 정책은 해당 서비스에 있는 인라인 정책입니다. 리소스 기반 정책에서는 IAM의 AWS 관리형 정책을 사용할 수 없습니다.

### 액세스 제어 목록(ACL)
<a name="security_iam_access-manage-acl"></a>

액세스 제어 목록(ACL)은 어떤 위탁자(계정 멤버, 사용자 또는 역할)가 리소스에 액세스할 수 있는 권한을 가지고 있는지를 제어합니다. ACL은 JSON 정책 문서 형식을 사용하지 않지만 리소스 기반 정책과 유사합니다.

Amazon S3 AWS WAF및 Amazon VPC는 ACLs. ACL에 관한 자세한 내용은 *Amazon Simple Storage Service 개발자 가이드*의 [액세스 제어 목록(ACL) 개요](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html)를 참조하세요.

### 기타 정책 타입
<a name="security_iam_access-manage-other-policies"></a>

AWS 는 보다 일반적인 정책 유형에서 부여한 최대 권한을 설정할 수 있는 추가 정책 유형을 지원합니다.
+ **권한 경계** - ID 기반 정책에서 IAM 엔터티에 부여할 수 있는 최대 권한을 설정합니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM 엔터티의 권한 범위](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)를 참조하세요.
+ **서비스 제어 정책(SCP)** - AWS Organizations내 조직 또는 조직 단위에 대한 최대 권한을 지정합니다. 자세한 내용은AWS Organizations 사용 설명서의 [서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)을 참조하세요.**
+ **리소스 제어 정책(RCP)** – 계정의 리소스에 사용할 수 있는 최대 권한을 설정합니다. 자세한 내용은 *AWS Organizations 사용 설명서*의 [리소스 제어 정책(RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)을 참조하세요.
+ **세션 정책** – 역할 또는 페더레이션 사용자에 대해 임시 세션을 프로그래밍 방식으로 생성할 때 파라미터로 전달하는 고급 정책입니다. 자세한 내용은 *IAM 사용 설명서*의 [세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)을 참조하세요.

### 여러 정책 유형
<a name="security_iam_access-manage-multiple-policies"></a>

여러 정책 유형이 요청에 적용되는 경우, 결과 권한은 이해하기가 더 복잡합니다. 에서 여러 정책 유형이 관련될 때 요청을 허용할지 여부를 AWS 결정하는 방법을 알아보려면 *IAM 사용 설명서*의 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)을 참조하세요.

# AWS IoT 에서 IAM을 사용하는 방법
<a name="security_iam_service-with-iam"></a>

IAM을 사용하여에 대한 액세스를 관리하기 전에 사용할 수 있는 IAM 기능을 이해해야 AWS IoT합니다 AWS IoT. AWS IoT 및 기타 AWS 서비스에서 IAM을 사용하는 방법을 개괄적으로 알아보려면 *IAM 사용 설명서*의 [AWS IAM으로 작업하는 서비스를](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_aws-services-that-work-with-iam.html) 참조하세요.

**Topics**
+ [AWS IoT 자격 증명 기반 정책](#security_iam_service-with-iam-id-based-policies)
+ [AWS IoT 리소스 기반 정책](#security_iam_service-with-iam-resource-based-policies)
+ [AWS IoT 태그 기반 권한 부여](#security_iam_service-with-iam-tags)
+ [AWS IoT IAM 역할](#security_iam_service-with-iam-roles)

## AWS IoT 자격 증명 기반 정책
<a name="security_iam_service-with-iam-id-based-policies"></a>

IAM ID 기반 정책을 사용하면 허용되거나 거부되는 작업과 리소스 및 작업이 허용되거나 거부되는 조건을 지정할 수 있습니다. AWS IoT 는 특정 작업, 리소스 및 조건 키를 지원합니다. JSON 정책에서 사용하는 모든 요소에 대해 알고 싶다면 *IAM 사용 설명서*의 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements.html)를 참조하세요.

### 작업
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

JSON 정책의 `Action`요소는 정책에서 액세스를 허용하거나 거부하는 데 사용할 수 있는 작업을 설명합니다. 연결된 작업을 수행할 수 있는 권한을 부여하기 위한 정책에 작업을 포함하세요.

다음 표에는 IAM IoT 작업, 연결된 AWS IoT API 및 작업이 조작하는 리소스가 나열되어 있습니다.


****  

| 정책 작업 | AWS IoT API | 리소스 | 
| --- | --- | --- | 
| iot:AcceptCertificateTransfer | AcceptCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN에 AWS 계정 지정된는 인증서가 전송되는 계정이어야 합니다.   | 
| iot:AddThingToThingGroup | AddThingToThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:AssociateTargetsWithJob | AssociateTargetsWithJob | 없음  | 
| iot:AttachPolicy | AttachPolicy |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 또는 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachPrincipalPolicy | AttachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachSecurityProfile | AttachSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:AttachThingPrincipal | AttachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:CancelCertificateTransfer | CancelCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN에 AWS 계정 지정된는 인증서가 전송되는 계정이어야 합니다.   | 
| iot:CancelJob | CancelJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:CancelJobExecution | CancelJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ClearDefaultAuthorizer | ClearDefaultAuthorizer | 없음 | 
| iot:CreateAuthorizer | CreateAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:CreateCertificateFromCsr | CreateCertificateFromCsr | \$1 | 
| iot:CreateDimension | CreateDimension | `arn:aws:iot:region:account-id:dimension/dimension-name` | 
| iot:CreateJob | CreateJob |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateJobTemplate | CreateJobTemplate |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateKeysAndCertificate | CreateKeysAndCertificate | \$1 | 
| iot:CreatePolicy | CreatePolicy | `arn:aws:iot:region:account-id:policy/policy-name` | 
| iot:CreatePolicyVersion | CreatePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  이는 IAM AWS IoT 정책이 아닌 정책이어야 합니다.   | 
| iot:CreateRoleAlias | CreateRoleAlias |  (파라미터: roleAlias) `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:CreateSecurityProfile | CreateSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:CreateThing | CreateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:CreateThingGroup | CreateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 사용할 경우 생성 그룹 및 상위 그룹에 필요  | 
| iot:CreateThingType | CreateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:CreateTopicRule | CreateTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteAuthorizer | DeleteAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-name`  | 
| iot:DeleteCACertificate | DeleteCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DeleteCertificate | DeleteCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DeleteDimension | DeleteDimension |  `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:DeleteJob | DeleteJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DeleteJobTemplate | DeleteJobTemplate |  `arn:aws:iot:region:account-id:job/job-template-id`  | 
| iot:DeleteJobExecution | DeleteJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeletePolicy | DeletePolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeletePolicyVersion | DeletePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeleteRegistrationCode | DeleteRegistrationCode | \$1 | 
| iot:DeleteRoleAlias | DeleteRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DeleteSecurityProfile | DeleteSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:DeleteThing | DeleteThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeleteThingGroup | DeleteThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeleteThingType | DeleteThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DeleteTopicRule | DeleteTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteV2LoggingLevel | DeleteV2LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeprecateThingType | DeprecateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DescribeAuthorizer | DescribeAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name` (파라미터: authorizerName) 없음  | 
| iot:DescribeCACertificate | DescribeCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DescribeCertificate | DescribeCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DescribeDefaultAuthorizer | DescribeDefaultAuthorizer | 없음  | 
| iot:DescribeEndpoint | DescribeEndpoint | \$1 | 
| iot:DescribeEventConfigurations | DescribeEventConfigurations | 없음  | 
| iot:DescribeIndex | DescribeIndex |  `arn:aws:iot:region:account-id:index/index-name`  | 
| iot:DescribeJob | DescribeJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DescribeJobExecution | DescribeJobExecution | 없음 | 
| iot:DescribeJobTemplate | DescribeJobTemplate |  `arn:aws:iot:region:account-id:job/job-template-id`  | 
| iot:DescribeRoleAlias | DescribeRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DescribeThing | DescribeThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DescribeThingGroup | DescribeThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DescribeThingRegistrationTask | DescribeThingRegistrationTask | 없음 | 
| iot:DescribeThingType | DescribeThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DetachPolicy | DetachPolicy |  `arn:aws:iot:region:account-id:cert/cert-id` 또는 `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DetachPrincipalPolicy | DetachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DetachSecurityProfile | DetachSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:DetachThingPrincipal | DetachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DisableTopicRule | DisableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:EnableTopicRule | EnableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:GetEffectivePolicies | GetEffectivePolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:GetIndexingConfiguration | GetIndexingConfiguration | 없음 | 
| iot:GetJobDocument | GetJobDocument |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:GetLoggingOptions | GetLoggingOptions | \$1 | 
| iot:GetPolicy | GetPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetPolicyVersion | GetPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetRegistrationCode | GetRegistrationCode | \$1 | 
| iot:GetTopicRule | GetTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:ListAttachedPolicies | ListAttachedPolicies |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 또는 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListAuthorizers | ListAuthorizers | 없음 | 
| iot:ListCACertificates | ListCACertificates | \$1 | 
| iot:ListCertificates | ListCertificates | \$1 | 
| iot:ListCertificatesByCA | ListCertificatesByCA | \$1 | 
| iot:ListIndices | ListIndices | 없음 | 
| iot:ListJobExecutionsForJob | ListJobExecutionsForJob | 없음 | 
| iot:ListJobExecutionsForThing | ListJobExecutionsForThing | 없음 | 
| iot:ListJobs | ListJobs |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` thingGroupName 파라미터를 사용하는 경우  | 
| iot:ListJobTemplates | ListJobs | 없음 | 
| iot:ListOutgoingCertificates | ListOutgoingCertificates | \$1 | 
| iot:ListPolicies | ListPolicies | \$1 | 
| iot:ListPolicyPrincipals | ListPolicyPrincipals | \$1 | 
| iot:ListPolicyVersions | ListPolicyVersions |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListPrincipalPolicies | ListPrincipalPolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListPrincipalThings | ListPrincipalThings |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListRoleAliases | ListRoleAliases | 없음 | 
| iot:ListTargetsForPolicy | ListTargetsForPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListThingGroups | ListThingGroups | 없음 | 
| iot:ListThingGroupsForThing | ListThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingPrincipals | ListThingPrincipals |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingRegistrationTaskReports | ListThingRegistrationTaskReports | 없음 | 
| iot:ListThingRegistrationTasks | ListThingRegistrationTasks | 없음 | 
| iot:ListThingTypes | ListThingTypes | \$1 | 
| iot:ListThings | ListThings | \$1 | 
| iot:ListThingsInThingGroup | ListThingsInThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:ListTopicRules | ListTopicRules | \$1 | 
| iot:ListV2LoggingLevels | ListV2LoggingLevels | 없음 | 
| iot:RegisterCACertificate | RegisterCACertificate | \$1 | 
| iot:RegisterCertificate | RegisterCertificate | \$1 | 
| iot:RegisterThing | RegisterThing | 없음 | 
| iot:RejectCertificateTransfer | RejectCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:RemoveThingFromThingGroup | RemoveThingFromThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ReplaceTopicRule | ReplaceTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:SearchIndex | SearchIndex |  `arn:aws:iot:region:account-id:index/index-id`  | 
| iot:SetDefaultAuthorizer | SetDefaultAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:SetDefaultPolicyVersion | SetDefaultPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:SetLoggingOptions | SetLoggingOptions |  `arn:aws:iot:region:account-id:role/role-name`  | 
| iot:SetV2LoggingLevel | SetV2LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:SetV2LoggingOptions | SetV2LoggingOptions |  `arn:aws:iot:region:account-id:role/role-name`  | 
| iot:StartThingRegistrationTask | StartThingRegistrationTask | 없음 | 
| iot:StopThingRegistrationTask | StopThingRegistrationTask | 없음 | 
| iot:TestAuthorization | TestAuthorization |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:TestInvokeAuthorizer | TestInvokeAuthorizer | 없음 | 
| iot:TransferCertificate | TransferCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateAuthorizer | UpdateAuthorizer |  `arn:aws:iot:region:account-id:authorizerfunction/authorizer-function-name`  | 
| iot:UpdateCACertificate | UpdateCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:UpdateCertificate | UpdateCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateDimension | UpdateDimension |  `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:UpdateEventConfigurations | UpdateEventConfigurations | 없음 | 
| iot:UpdateIndexingConfiguration | UpdateIndexingConfiguration | 없음 | 
| iot:UpdateRoleAlias | UpdateRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:UpdateSecurityProfile | UpdateSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:UpdateThing | UpdateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:UpdateThingGroup | UpdateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:UpdateThingGroupsForThing | UpdateThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 

의 정책 작업은 작업 앞에 접두사를 AWS IoT 사용합니다`iot:`. 예를 들어 API를 사용하여에 등록된 모든 IoT 사물을 나열할 수 AWS 계정 있는 권한을 부여하려면 해당 정책에 `iot:ListThings` 작업을 `ListThings` 포함합니다. 정책 설명에는 `Action` 또는 `NotAction` 요소가 포함되어야 합니다.는이 서비스로 수행할 수 있는 작업을 설명하는 고유한 작업 세트를 AWS IoT 정의합니다.

명령문 하나에 여러 태스크를 지정하려면 다음과 같이 쉼표로 구분합니다.

```
"Action": [
      "ec2:action1",
      "ec2:action2"
```

와일드카드(\$1)를 사용하여 여러 작업을 지정할 수 있습니다. 예를 들어, `Describe`라는 단어로 시작하는 모든 작업을 지정하려면 다음 작업을 포함합니다.

```
"Action": "iot:Describe*"
```

 AWS IoT 작업 목록을 보려면 *IAM 사용 설명서*의 [에서 정의한 작업을 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) 참조하세요.

#### Device Advisor 작업
<a name="security_iam_service-actions-device-advisor"></a>

다음 표에는 IAM IoT Device Advisor 작업, 연결된 AWS IoT Device Advisor API 및 해당 작업이 조작하는 리소스가 나열되어 있습니다.


****  

| 정책 작업 | AWS IoT API | 리소스 | 
| --- | --- | --- | 
| iotdeviceadvisor:CreateSuiteDefinition | CreateSuiteDefinition |  없음  | 
| iotdeviceadvisor:DeleteSuiteDefinition | DeleteSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:GetSuiteDefinition | GetSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:GetSuiteRun | GetSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-run-id`  | 
| iotdeviceadvisor:GetSuiteRunReport | GetSuiteRunReport |  `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:ListSuiteDefinitions | ListSuiteDefinitions | 없음 | 
| iotdeviceadvisor:ListSuiteRuns | ListSuiteRuns |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:ListTagsForResource | ListTagsForResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:StartSuiteRun | StartSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:TagResource | TagResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:UntagResource | UntagResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:UpdateSuiteDefinition | UpdateSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:StopSuiteRun | StopSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 

 AWS IoT Device Advisor의 정책 작업은 작업 앞에 접두사를 사용합니다`iotdeviceadvisor:`. 예를 들어 ListSuiteDefinitions API를 사용하여에 등록된 모든 제품군 정의를 나열할 수 AWS 계정 있는 권한을 부여하려면 해당 정책에 `iotdeviceadvisor:ListSuiteDefinitions` 작업을 포함합니다.

### 리소스
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Resource` JSON 정책 요소는 작업이 적용되는 하나 이상의 객체를 지정합니다. 모범 사례에 따라 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)을 사용하여 리소스를 지정합니다. 리소스 수준 권한을 지원하지 않는 작업의 경우, 와일드카드(\$1)를 사용하여 해당 문이 모든 리소스에 적용됨을 나타냅니다.

```
"Resource": "*"
```


**AWS IoT 리소스**  

| 정책 작업 | AWS IoT API | 리소스 | 
| --- | --- | --- | 
| iot:AcceptCertificateTransfer | AcceptCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN에 AWS 계정 지정된는 인증서가 전송되는 계정이어야 합니다.   | 
| iot:AddThingToThingGroup | AddThingToThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:AssociateTargetsWithJob | AssociateTargetsWithJob | 없음  | 
| iot:AttachPolicy | AttachPolicy | `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 또는 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachPrincipalPolicy | AttachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachThingPrincipal | AttachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:CancelCertificateTransfer | CancelCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN에 AWS 계정 지정된는 인증서가 전송되는 계정이어야 합니다.   | 
| iot:CancelJob | CancelJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:CancelJobExecution | CancelJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ClearDefaultAuthorizer | ClearDefaultAuthorizer | 없음 | 
| iot:CreateAuthorizer | CreateAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:CreateCertificateFromCsr | CreateCertificateFromCsr | \$1 | 
| iot:CreateJob | CreateJob |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateJobTemplate | CreateJobTemplate |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateKeysAndCertificate | CreateKeysAndCertificate | \$1 | 
| iot:CreatePolicy | CreatePolicy | `arn:aws:iot:region:account-id:policy/policy-name` | 
| CreatePolicyVersion | iot:CreatePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  이는 IAM AWS IoT 정책이 아닌 정책이어야 합니다.   | 
| iot:CreateRoleAlias | CreateRoleAlias |  (파라미터: roleAlias) `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:CreateThing | CreateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:CreateThingGroup | CreateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 사용할 경우 생성 그룹 및 상위 그룹에 필요  | 
| iot:CreateThingType | CreateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:CreateTopicRule | CreateTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteAuthorizer | DeleteAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-name`  | 
| iot:DeleteCACertificate | DeleteCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DeleteCertificate | DeleteCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DeleteJob | DeleteJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DeleteJobExecution | DeleteJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeleteJobTemplate | DeleteJobTemplate |  `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:DeletePolicy | DeletePolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeletePolicyVersion | DeletePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeleteRegistrationCode | DeleteRegistrationCode | \$1 | 
| iot:DeleteRoleAlias | DeleteRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DeleteThing | DeleteThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeleteThingGroup | DeleteThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeleteThingType | DeleteThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DeleteTopicRule | DeleteTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteV2LoggingLevel | DeleteV2LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeprecateThingType | DeprecateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DescribeAuthorizer | DescribeAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name` (파라미터: authorizerName) 없음  | 
| iot:DescribeCACertificate | DescribeCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DescribeCertificate | DescribeCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DescribeDefaultAuthorizer | DescribeDefaultAuthorizer | 없음  | 
| iot:DescribeEndpoint | DescribeEndpoint | \$1 | 
| iot:DescribeEventConfigurations | DescribeEventConfigurations | 없음  | 
| iot:DescribeIndex | DescribeIndex |  `arn:aws:iot:region:account-id:index/index-name`  | 
| iot:DescribeJob | DescribeJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DescribeJobExecution | DescribeJobExecution | 없음 | 
| iot:DescribeJobTemplate | DescribeJobTemplate |  `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:DescribeRoleAlias | DescribeRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DescribeThing | DescribeThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DescribeThingGroup | DescribeThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DescribeThingRegistrationTask | DescribeThingRegistrationTask | 없음 | 
| iot:DescribeThingType | DescribeThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DetachPolicy | DetachPolicy |  `arn:aws:iot:region:account-id:cert/cert-id` 또는 `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DetachPrincipalPolicy | DetachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DetachThingPrincipal | DetachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DisableTopicRule | DisableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:EnableTopicRule | EnableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:GetEffectivePolicies | GetEffectivePolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:GetIndexingConfiguration | GetIndexingConfiguration | 없음 | 
| iot:GetJobDocument | GetJobDocument |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:GetLoggingOptions | GetLoggingOptions | \$1 | 
| iot:GetPolicy | GetPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetPolicyVersion | GetPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetRegistrationCode | GetRegistrationCode | \$1 | 
| iot:GetTopicRule | GetTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:ListAttachedPolicies | ListAttachedPolicies |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 또는 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListAuthorizers | ListAuthorizers | 없음 | 
| iot:ListCACertificates | ListCACertificates | \$1 | 
| iot:ListCertificates | ListCertificates | \$1 | 
| iot:ListCertificatesByCA | ListCertificatesByCA | \$1 | 
| iot:ListIndices | ListIndices | 없음 | 
| iot:ListJobExecutionsForJob | ListJobExecutionsForJob | 없음 | 
| iot:ListJobExecutionsForThing | ListJobExecutionsForThing | 없음 | 
| iot:ListJobs | ListJobs |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` thingGroupName 파라미터를 사용하는 경우  | 
| iot:ListJobTemplates | ListJobTemplates | 없음 | 
| iot:ListOutgoingCertificates | ListOutgoingCertificates | \$1 | 
| iot:ListPolicies | ListPolicies | \$1 | 
| iot:ListPolicyPrincipals | ListPolicyPrincipals |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListPolicyVersions | ListPolicyVersions |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListPrincipalPolicies | ListPrincipalPolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListPrincipalThings | ListPrincipalThings |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListRoleAliases | ListRoleAliases | 없음 | 
| iot:ListTargetsForPolicy | ListTargetsForPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListThingGroups | ListThingGroups | 없음 | 
| iot:ListThingGroupsForThing | ListThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingPrincipals | ListThingPrincipals |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingRegistrationTaskReports | ListThingRegistrationTaskReports | 없음 | 
| iot:ListThingRegistrationTasks | ListThingRegistrationTasks | 없음 | 
| iot:ListThingTypes | ListThingTypes | \$1 | 
| iot:ListThings | ListThings | \$1 | 
| iot:ListThingsInThingGroup | ListThingsInThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:ListTopicRules | ListTopicRules | \$1 | 
| iot:ListV2LoggingLevels | ListV2LoggingLevels | 없음 | 
| iot:RegisterCACertificate | RegisterCACertificate | \$1 | 
| iot:RegisterCertificate | RegisterCertificate | \$1 | 
| iot:RegisterThing | RegisterThing | 없음 | 
| iot:RejectCertificateTransfer | RejectCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:RemoveThingFromThingGroup | RemoveThingFromThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ReplaceTopicRule | ReplaceTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:SearchIndex | SearchIndex |  `arn:aws:iot:region:account-id:index/index-id`  | 
| iot:SetDefaultAuthorizer | SetDefaultAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:SetDefaultPolicyVersion | SetDefaultPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:SetLoggingOptions | SetLoggingOptions | \$1 | 
| iot:SetV2LoggingLevel | SetV2LoggingLevel | \$1 | 
| iot:SetV2LoggingOptions | SetV2LoggingOptions | \$1 | 
| iot:StartThingRegistrationTask | StartThingRegistrationTask | 없음 | 
| iot:StopThingRegistrationTask | StopThingRegistrationTask | 없음 | 
| iot:TestAuthorization | TestAuthorization |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:TestInvokeAuthorizer | TestInvokeAuthorizer | 없음 | 
| iot:TransferCertificate | TransferCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateAuthorizer | UpdateAuthorizer |  `arn:aws:iot:region:account-id:authorizerfunction/authorizer-function-name`  | 
| iot:UpdateCACertificate | UpdateCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:UpdateCertificate | UpdateCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateEventConfigurations | UpdateEventConfigurations | 없음 | 
| iot:UpdateIndexingConfiguration | UpdateIndexingConfiguration | 없음 | 
| iot:UpdateRoleAlias | UpdateRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:UpdateThing | UpdateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:UpdateThingGroup | UpdateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:UpdateThingGroupsForThing | UpdateThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 

ARN 형식에 대한 자세한 내용은 [Amazon 리소스 이름(ARNs) 및 AWS 서비스 네임스페이스를 참조하세요](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html).

리소스를 생성하기 위한 작업과 같은 일부 AWS IoT 작업은 특정 리소스에서 수행할 수 없습니다. 이러한 경우, 와일드카드(\$1)를 사용해야 합니다.

```
"Resource": "*"
```

 AWS IoT 리소스 유형 및 해당 ARNs 목록을 보려면 *IAM 사용 설명서*의 [에서 정의한 리소스를 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-resources-for-iam-policies) 참조하세요. 각 리소스의 ARN을 지정할 수 있는 작업을 알아보려면 [AWS IoT가 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)을 참조하세요.

#### Device Advisor 리소스
<a name="security_iam_service-device-advisor-resources"></a>

 AWS IoT Device Advisor IAM 정책에 대한 리소스 수준 제한을 정의하려면 제품군 정의 및 제품군 실행에 다음 리소스 ARN 형식을 사용합니다.

스위트 정의 리소스 ARN 형식  
`arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`

스위트 실행 리소스 ARN 형식  
`arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`

### 조건 키
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Condition` 요소는 정의된 기준에 따라 문이 실행되는 시기를 지정합니다. 같음(equals) 또는 미만(less than)과 같은 [조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)를 사용하여 정책의 조건을 요청의 값과 일치시키는 조건식을 생성할 수 있습니다. 모든 AWS 전역 조건 키를 보려면 *IAM 사용 설명서*의 [AWS 전역 조건 컨텍스트 키를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html) 참조하세요.

AWS IoT 는 자체 조건 키 세트를 정의하고 일부 전역 조건 키 사용을 지원합니다. 모든 AWS 전역 조건 키를 보려면 *IAM 사용 설명서*의 [AWS 전역 조건 컨텍스트 키를 참조하세요](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_condition-keys.html).


**AWS IoT 조건 키**  

| AWS IoT 조건 키 | 설명 | 형식 | 
| --- | --- | --- | 
| aws:RequestTag/\$1\$1tag-key\$1 | 사용자가 AWS IoT에 수행하는 요청에 있는 태그 키입니다. | 문자열 | 
| aws:ResourceTag/\$1\$1tag-key\$1 |  AWS IoT 리소스에 연결된 태그의 태그 키 구성 요소입니다. | 문자열 | 
| aws:TagKeys | 요청의 리소스와 연결된 모든 태그 키 이름의 목록입니다. | 문자열 | 

 AWS IoT 조건 키 목록을 보려면 *IAM 사용 설명서*의에 [대한 조건 키를 참조하세요 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-policy-keys). 조건 키를 사용할 수 있는 작업과 리소스를 알아보려면 [에서 정의한 작업을 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) 참조하세요.

### 예제
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



자격 AWS IoT 증명 기반 정책의 예를 보려면 섹션을 참조하세요[AWS IoT 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md).

## AWS IoT 리소스 기반 정책
<a name="security_iam_service-with-iam-resource-based-policies"></a>

리소스 기반 정책은 지정된 보안 주체가 AWS IoT 리소스에 대해 수행할 수 있는 작업과 조건을 지정하는 JSON 정책 문서입니다.

AWS IoT 는 IAM 리소스 기반 정책을 지원하지 않습니다. 그러나 AWS IoT 리소스 기반 정책을 지원합니다. 자세한 내용은 [AWS IoT Core 정책](iot-policies.md) 단원을 참조하십시오.

## AWS IoT 태그 기반 권한 부여
<a name="security_iam_service-with-iam-tags"></a>

 AWS IoT 리소스에 태그를 연결하거나 요청에서 태그를에 전달할 수 있습니다 AWS IoT. 태그에 근거하여 액세스를 제어하려면 `iot:ResourceTag/key-name`, `aws:RequestTag/key-name`또는 `aws:TagKeys`조건 키를 사용하여 정책의 [조건 요소](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements_condition.html)에 태그 정보를 제공합니다. 자세한 내용은 [IAM 정책에 태그 사용](tagging-iot-iam.md) 단원을 참조하십시오. AWS IoT 리소스 태그 지정에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT 리소스에 태그 지정](tagging-iot.md).

리소스의 태그를 기반으로 리소스에 대한 액세스를 제한하는 자격 증명 기반 정책의 예시는 [태그를 기반으로 AWS IoT 리소스 보기](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-view-thing-tags)에서 확인할 수 있습니다.

## AWS IoT IAM 역할
<a name="security_iam_service-with-iam-roles"></a>

[IAM 역할은](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html) 특정 권한이 AWS 계정 있는 내의 엔터티입니다.

### 에서 임시 자격 증명 사용 AWS IoT
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

임시 보안 인증을 사용하여 페더레이션을 통해 로그인하거나, IAM 역할을 맡거나, 교차 계정 역할을 맡을 수 있습니다. [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 또는 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html)과 같은 AWS STS API 작업을 호출하여 임시 보안 자격 증명을 얻습니다.

AWS IoT 는 임시 자격 증명 사용을 지원합니다.

### 서비스 연결 역할
<a name="security_iam_service-with-iam-roles-service-linked"></a>

[서비스 연결 역할을](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles_terms-and-concepts.html#iam-term-service-linked-role) 사용하면 AWS 서비스가 다른 서비스의 리소스에 액세스하여 사용자를 대신하여 작업을 완료할 수 있습니다. 서비스 연결 역할은 IAM 계정에 나타나고 서비스가 소유합니다. IAM 관리자는 서비스 연결 역할의 권한을 볼 수 있지만 편집할 수 없습니다.

AWS IoT 는 서비스 연결 역할을 지원하지 않습니다.

### 서비스 역할
<a name="security_iam_service-with-iam-roles-service"></a>

이 기능을 사용하면 서비스가 사용자를 대신하여 [서비스 역할](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles_terms-and-concepts.html#iam-term-service-role)을 수임할 수 있습니다. 이 역할을 사용하면 서비스가 다른 서비스의 리소스에 액세스해 사용자를 대신해 작업을 완료할 수 있습니다. 서비스 역할은 IAM 계정에 나타나고, 해당 계정이 소유합니다. 즉, IAM 관리자가 이 역할에 대한 권한을 변경할 수 있습니다. 그러나 권한을 변경하면 서비스의 기능이 손상될 수 있습니다.

# AWS IoT 자격 증명 기반 정책 예제
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 IAM 사용자 및 역할은 AWS IoT 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 또한 AWS Management Console AWS CLI또는 AWS API를 사용하여 작업을 수행할 수 없습니다. IAM 관리자는 지정된 리소스에서 특정 API 작업을 수행할 수 있는 권한을 사용자와 역할에게 부여하는 IAM 정책을 생성해야 합니다. 그런 다음 관리자는 해당 권한이 필요한 사용자 또는 그룹에 이러한 정책을 연결해야 합니다.

이러한 예제 JSON 정책 문서를 사용하여 IAM ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용자 설명서*의 [JSON 탭에서 정책 생성](https://docs.aws.amazon.com/service-authorization/latest/reference/access_policies_create.html#access_policies_create-json-editor)을 참조하세요.

**Topics**
+ [정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [AWS IoT 콘솔 사용](#security_iam_id-based-policy-examples-console)
+ [사용자가 자신이 권한을 볼 수 있도록 허용](#security_iam_id-based-policy-examples-view-own-permissions)
+ [태그를 기반으로 AWS IoT 리소스 보기](#security_iam_id-based-policy-examples-view-thing-tags)
+ [태그를 기반으로 AWS IoT Device Advisor 리소스 보기](#security_iam-device-advisor-tags)

## 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

자격 증명 기반 정책에 따라 계정에서 사용자가 AWS IoT 리소스를 생성, 액세스 또는 삭제할 수 있는지 여부가 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ ** AWS 관리형 정책을 시작하고 최소 권한으로 전환 -** 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반적인 사용 사례에 대한 권한을 부여하는 *AWS 관리형 정책을* 사용합니다. 에서 사용할 수 있습니다 AWS 계정. 사용 사례에 맞는 AWS 고객 관리형 정책을 정의하여 권한을 추가로 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS 직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. AWS 서비스와 같은 특정를 통해 사용되는 경우 조건을 사용하여 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다 CloudFormation. 자세한 내용은 *IAM 사용 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요 -**에서 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우 추가 보안을 위해 MFA를 AWS 계정켭니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## AWS IoT 콘솔 사용
<a name="security_iam_id-based-policy-examples-console"></a>

 AWS IoT 콘솔에 액세스하려면 최소 권한 집합이 있어야 합니다. 이러한 권한은의 AWS IoT 리소스에 대한 세부 정보를 나열하고 볼 수 있도록 허용해야 합니다 AWS 계정. 최소 필수 권한보다 더 제한적인 ID 기반 정책을 생성하는 경우, 콘솔이 해당 정책에 연결된 엔티티(사용자 또는 역할)에 대해 의도대로 작동하지 않습니다.

이러한 엔터티가 AWS IoT 콘솔을 계속 사용할 수 있도록 하려면 엔터티에 AWS 관리형 정책 도 연결합니다`AWSIoTFullAccess`. 자세한 내용은 *IAM 사용 설명서*의 [사용자에게 권한 추가](https://docs.aws.amazon.com/service-authorization/latest/reference/id_users_change-permissions.html#users_change_permissions-add-console)를 참조하십시오.

 AWS CLI 또는 AWS API만 호출하는 사용자에게는 최소 콘솔 권한을 허용할 필요가 없습니다. 그 대신, 수행하려는 API 작업과 일치하는 작업에만 액세스할 수 있도록 합니다.

## 사용자가 자신이 권한을 볼 수 있도록 허용
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

이 예제는 IAM 사용자가 자신의 사용자 ID에 연결된 인라인 및 관리형 정책을 볼 수 있도록 허용하는 정책을 생성하는 방법을 보여줍니다. 이 정책에는 콘솔에서 또는 AWS CLI 또는 AWS API를 사용하여 프로그래밍 방식으로이 작업을 완료할 수 있는 권한이 포함됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## 태그를 기반으로 AWS IoT 리소스 보기
<a name="security_iam_id-based-policy-examples-view-thing-tags"></a>

자격 증명 기반 정책의 조건을 사용하여 태그를 기반으로 AWS IoT 리소스에 대한 액세스를 제어할 수 있습니다. 이 예제에서는 사물을 보도록 허용하는 정책을 생성할 수 있는 방법을 보여줍니다. 하지만 사물 태그 `Owner`에 해당 사용자의 사용자 이름 값이 있는 경우에만 권한이 부여됩니다. 이 정책은 콘솔에서 이 태스크를 완료하는 데 필요한 권한도 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListBillingGroupsInConsole",
            "Effect": "Allow",
            "Action": "iot:ListBillingGroups",
            "Resource": "*"
        },
        {
            "Sid": "ViewBillingGroupsIfOwner",
            "Effect": "Allow",
           "Action": "iot:DescribeBillingGroup",
            "Resource": "arn:aws:iot:*:*:billinggroup/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/Owner": "${aws:username}"}
        }
        }
    ]
}
```

이 정책을 계정의 IAM 사용자에게 연결할 수 있습니다. 라는 사용자가 AWS IoT 결제 그룹을 보`richard-roe`려고 하면 결제 그룹에 `Owner=richard-roe` 또는 태그가 지정되어야 합니다`owner=richard-roe`. 그렇지 않으면 액세스가 거부됩니다. 조건 키 이름은 대소문자를 구분하지 않기 때문에 조건 태그 키 `Owner`는 `Owner` 및 `owner` 모두와 일치합니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements_condition.html)을 참조하세요.

## 태그를 기반으로 AWS IoT Device Advisor 리소스 보기
<a name="security_iam-device-advisor-tags"></a>

자격 증명 기반 정책의 조건을 사용하여 태그를 기반으로 AWS IoT Device Advisor 리소스에 대한 액세스를 제어할 수 있습니다. 다음 예는 특정 스위트 정의를 볼 수 있는 정책을 생성하는 방법을 보여줍니다. 그러나 스위트 정의 태그가 `SuiteType`을(를) `MQTT` 값으로 설정하는 경우에만 권한이 부여됩니다. 이 정책은 콘솔에서 이 작업을 완료하는 데 필요한 권한도 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewSuiteDefinition",
            "Effect": "Allow",
            "Action": "iotdeviceadvisor:GetSuiteDefinition",
            "Resource": "arn:aws:iotdeviceadvisor:*:*:suitedefinition/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/SuiteType": "MQTT"}
        }
        }
    ]
}
```

# AWS 에 대한 관리형 정책 AWS IoT
<a name="security-iam-awsmanpol"></a>







사용자, 그룹 및 역할에 권한을 추가하려면 직접 정책을 작성하는 것보다 AWS 관리형 정책을 사용하는 것이 더 쉽습니다. 팀에 필요한 권한만 제공하는 [IAM 고객 관리형 정책을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)하기 위해서는 시간과 전문 지식이 필요합니다. 빠르게 시작하려면 AWS 관리형 정책을 사용할 수 있습니다. 이 정책은 일반적인 사용 사례를 다루며 사용자의 AWS 계정에서 사용할 수 있습니다. AWS 관리형 정책에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책을](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 참조하세요.

AWS 서비스는 AWS 관리형 정책을 유지 관리하고 업데이트합니다. AWS 관리형 정책에서는 권한을 변경할 수 없습니다. 서비스에서 때때로 추가 권한을 AWS 관리형 정책에 추가하여 새로운 기능을 지원합니다. 이 유형의 업데이트는 정책이 연결된 모든 ID(사용자, 그룹 및 역할)에 적용됩니다. 서비스는 새로운 기능이 시작되거나 새 작업을 사용할 수 있을 때 AWS 관리형 정책에 업데이트됩니다. 서비스는 AWS 관리형 정책에서 권한을 제거하지 않으므로 정책 업데이트로 인해 기존 권한이 손상되지 않습니다.

또한 여러 서비스에 걸쳐 있는 직무에 대한 관리형 정책을 AWS 지원합니다. 예를 들어 **ReadOnlyAccess** AWS 관리형 정책은 모든 AWS 서비스 및 리소스에 대한 읽기 전용 액세스를 제공합니다. 서비스에서 새 기능을 시작하면 AWS 가 새 작업 및 리소스에 대한 읽기 전용 권한을 추가합니다. 직무 정책의 목록과 설명은 *IAM 사용 설명서*의 [직무에 관한AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.

**참고**  
AWS IoT 는 AWS IoT 및 IAM 정책 모두에서 작동합니다. 이 주제에서는 컨트롤 플레인 및 데이터 영역 API 작업에 대한 정책 작업을 정의하는 IAM 정책에만 대해서만 설명합니다. 또한 [AWS IoT Core 정책](iot-policies.md) 섹션도 참조하세요.









## AWS 관리형 정책: AWSIoTConfigAccess
<a name="security-iam-awsmanpol-AWSIoTConfigAccess"></a>





`AWSIoTConfigAccess` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 연결된 자격 증명에 모든 AWS IoT 구성 작업에 액세스할 수 있는 권한을 부여합니다. 이 정책은 데이터 처리와 저장에 영향을 줄 수 있습니다. 에서이 정책을 보려면 [AWSIoTConfigAccess](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTConfigAccess$jsonEditor?section=permissions)를 AWS Management Console참조하세요.



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - AWS IoT 데이터를 검색하고 IoT 구성 작업을 수행합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AcceptCertificateTransfer",
                "iot:AddThingToThingGroup",
                "iot:AssociateTargetsWithJob",
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CancelCertificateTransfer",
                "iot:CancelJob",
                "iot:CancelJobExecution",
                "iot:ClearDefaultAuthorizer",
                "iot:CreateAuthorizer",
                "iot:CreateCertificateFromCsr",
                "iot:CreateJob",
                "iot:CreateKeysAndCertificate",
                "iot:CreateOTAUpdate",
                "iot:CreatePolicy",
                "iot:CreatePolicyVersion",
                "iot:CreateRoleAlias",
                "iot:CreateStream",
                "iot:CreateThing",
                "iot:CreateThingGroup",
                "iot:CreateThingType",
                "iot:CreateTopicRule",
                "iot:DeleteAuthorizer",
                "iot:DeleteCACertificate",
                "iot:DeleteCertificate",
                "iot:DeleteJob",
                "iot:DeleteJobExecution",
                "iot:DeleteOTAUpdate",
                "iot:DeletePolicy",
                "iot:DeletePolicyVersion",
                "iot:DeleteRegistrationCode",
                "iot:DeleteRoleAlias",
                "iot:DeleteStream",
                "iot:DeleteThing",
                "iot:DeleteThingGroup",
                "iot:DeleteThingType",
                "iot:DeleteTopicRule",
                "iot:DeleteV2LoggingLevel",
                "iot:DeprecateThingType",
                "iot:DescribeAuthorizer",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:DescribeDefaultAuthorizer",
                "iot:DescribeEndpoint",
                "iot:DescribeEventConfigurations",
                "iot:DescribeIndex",
                "iot:DescribeJob",
                "iot:DescribeJobExecution",
                "iot:DescribeRoleAlias",
                "iot:DescribeStream",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingRegistrationTask",
                "iot:DescribeThingType",
                "iot:DetachPolicy",
                "iot:DetachPrincipalPolicy",
                "iot:DetachThingPrincipal",
                "iot:DisableTopicRule",
                "iot:EnableTopicRule",
                "iot:GetEffectivePolicies",
                "iot:GetIndexingConfiguration",
                "iot:GetJobDocument",
                "iot:GetLoggingOptions",
                "iot:GetOTAUpdate",
                "iot:GetPolicy",
                "iot:GetPolicyVersion",
                "iot:GetRegistrationCode",
                "iot:GetTopicRule",
                "iot:GetV2LoggingOptions",
                "iot:ListAttachedPolicies",
                "iot:ListAuthorizers",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:ListCertificatesByCA",
                "iot:ListIndices",
                "iot:ListJobExecutionsForJob",
                "iot:ListJobExecutionsForThing",
                "iot:ListJobs",
                "iot:ListOTAUpdates",
                "iot:ListOutgoingCertificates",
                "iot:ListPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPolicyVersions",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListRoleAliases",
                "iot:ListStreams",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroups",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:ListThingRegistrationTaskReports",
                "iot:ListThingRegistrationTasks",
                "iot:ListThings",
                "iot:ListThingsInThingGroup",
                "iot:ListThingTypes",
                "iot:ListTopicRules",
                "iot:ListV2LoggingLevels",
                "iot:RegisterCACertificate",
                "iot:RegisterCertificate",
                "iot:RegisterThing",
                "iot:RejectCertificateTransfer",
                "iot:RemoveThingFromThingGroup",
                "iot:ReplaceTopicRule",
                "iot:SearchIndex",
                "iot:SetDefaultAuthorizer",
                "iot:SetDefaultPolicyVersion",
                "iot:SetLoggingOptions",
                "iot:SetV2LoggingLevel",
                "iot:SetV2LoggingOptions",
                "iot:StartThingRegistrationTask",
                "iot:StopThingRegistrationTask",
                "iot:TestAuthorization",
                "iot:TestInvokeAuthorizer",
                "iot:TransferCertificate",
                "iot:UpdateAuthorizer",
                "iot:UpdateCACertificate",
                "iot:UpdateCertificate",
                "iot:UpdateEventConfigurations",
                "iot:UpdateIndexingConfiguration",
                "iot:UpdateRoleAlias",
                "iot:UpdateStream",
                "iot:UpdateThing",
                "iot:UpdateThingGroup",
                "iot:UpdateThingGroupsForThing",
                "iot:UpdateAccountAuditConfiguration",
                "iot:DescribeAccountAuditConfiguration",
                "iot:DeleteAccountAuditConfiguration",
                "iot:StartOnDemandAuditTask",
                "iot:CancelAuditTask",
                "iot:DescribeAuditTask",
                "iot:ListAuditTasks",
                "iot:CreateScheduledAudit",
                "iot:UpdateScheduledAudit",
                "iot:DeleteScheduledAudit",
                "iot:DescribeScheduledAudit",
                "iot:ListScheduledAudits",
                "iot:ListAuditFindings",
                "iot:CreateSecurityProfile",
                "iot:DescribeSecurityProfile",
                "iot:UpdateSecurityProfile",
                "iot:DeleteSecurityProfile",
                "iot:AttachSecurityProfile",
                "iot:DetachSecurityProfile",
                "iot:ListSecurityProfiles",
                "iot:ListSecurityProfilesForTarget",
                "iot:ListTargetsForSecurityProfile",
                "iot:ListActiveViolations",
                "iot:ListViolationEvents",
                "iot:ValidateSecurityProfileBehaviors"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 관리형 정책: AWSIoTConfigReadOnlyAccess
<a name="security-iam-awsmanpol-AWSIoTConfigReadOnlyAccess"></a>





`AWSIoTConfigReadOnlyAccess` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 연결된 자격 증명에 모든 AWS IoT 구성 작업에 읽기 전용으로 액세스할 수 있는 권한을 부여합니다. 에서이 정책을 보려면 [AWSIoTConfigReadOnlyAccess](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTConfigReadOnlyAccess$jsonEditor?section=permissions)를 AWS Management Console참조하세요.



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - IoT 구성 작업의 읽기 전용 작업을 수행합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:DescribeAuthorizer",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:DescribeDefaultAuthorizer",
                "iot:DescribeEndpoint",
                "iot:DescribeEventConfigurations",
                "iot:DescribeIndex",
                "iot:DescribeJob",
                "iot:DescribeJobExecution",
                "iot:DescribeRoleAlias",
                "iot:DescribeStream",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingRegistrationTask",
                "iot:DescribeThingType",
                "iot:GetEffectivePolicies",
                "iot:GetIndexingConfiguration",
                "iot:GetJobDocument",
                "iot:GetLoggingOptions",
                "iot:GetOTAUpdate",
                "iot:GetPolicy",
                "iot:GetPolicyVersion",
                "iot:GetRegistrationCode",
                "iot:GetTopicRule",
                "iot:GetV2LoggingOptions",
                "iot:ListAttachedPolicies",
                "iot:ListAuthorizers",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:ListCertificatesByCA",
                "iot:ListIndices",
                "iot:ListJobExecutionsForJob",
                "iot:ListJobExecutionsForThing",
                "iot:ListJobs",
                "iot:ListOTAUpdates",
                "iot:ListOutgoingCertificates",
                "iot:ListPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPolicyVersions",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListRoleAliases",
                "iot:ListStreams",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroups",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:ListThingRegistrationTaskReports",
                "iot:ListThingRegistrationTasks",
                "iot:ListThings",
                "iot:ListThingsInThingGroup",
                "iot:ListThingTypes",
                "iot:ListTopicRules",
                "iot:ListV2LoggingLevels",
                "iot:SearchIndex",
                "iot:TestAuthorization",
                "iot:TestInvokeAuthorizer",
                "iot:DescribeAccountAuditConfiguration",
                "iot:DescribeAuditTask",
                "iot:ListAuditTasks",
                "iot:DescribeScheduledAudit",
                "iot:ListScheduledAudits",
                "iot:ListAuditFindings",
                "iot:DescribeSecurityProfile",
                "iot:ListSecurityProfiles",
                "iot:ListSecurityProfilesForTarget",
                "iot:ListTargetsForSecurityProfile",
                "iot:ListActiveViolations",
                "iot:ListViolationEvents",
                "iot:ValidateSecurityProfileBehaviors"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 관리형 정책: AWSIoTDataAccess
<a name="security-iam-awsmanpol-AWSIoTDataAccess"></a>





`AWSIoTDataAccess` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 모든 AWS IoT 데이터 작업에 대한 액세스를 허용하는 연결된 자격 증명 권한을 부여합니다. 데이터 작업을 사용하면 MQTT 또는 HTTP 프로토콜을 통해 데이터를 전송할 수 있습니다. AWS Management Console에서 이 정책을 보려면 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTDataAccess?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTDataAccess?section=permissions)를 확인하세요.



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - AWS IoT 데이터를 검색하고 AWS IoT 메시징 작업에 대한 전체 액세스를 허용합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive",
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",
                "iot:DeleteThingShadow",
                "iot:ListNamedShadowsForThing"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 관리형 정책: AWSIoTFullAccess
<a name="security-iam-awsmanpol-AWSIoTFullAccess"></a>





`AWSIoTFullAccess` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 연결된 자격 증명에 모든 AWS IoT 구성 및 메시징 작업에 액세할 수 있는 권한을 부여합니다. 에서이 정책을 보려면 섹션을 AWS Management Console참조하세요[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess?section=permissions).



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - AWS IoT 데이터를 검색하고 구성 및 메시징 작업에 대한 AWS IoT 전체 액세스를 허용합니다.
+ `iotjobsdata` - AWS IoT 작업 데이터를 검색하고 AWS IoT 작업 데이터 영역 API 작업에 대한 전체 액세스를 허용합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*",
                "iotjobsdata:*"
            ],
            "Resource": "*"
        }
    ]
}
```

## AWS 관리형 정책: AWSIoTLogging
<a name="security-iam-awsmanpol-AWSIoTLogging"></a>





`AWSIoTLogging` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 연결된 자격 증명에 Amazon CloudWatch Logs 그룹을 생성하고 해당 그룹에 로그를 스트리밍할 수 있는 권한을 부여합니다. 이 정책은 CloudWatch 로깅 역할에 연결됩니다. 에서이 정책을 보려면 섹션을 AWS Management Console참조하세요[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTLogging?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTLogging?section=permissions).



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `logs` - CloudWatch 로그를 검색합니다. 또한 CloudWatch Logs 그룹을 생성하고 해당 그룹에 로그를 스트리밍할 수 있도록 허용합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutMetricFilter",
                "logs:PutRetentionPolicy",
                "logs:GetLogEvents",
                "logs:DeleteLogStream"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

## AWS 관리형 정책: AWSIoTOTAUpdate
<a name="security-iam-awsmanpol-AWSIoTOTAUpdate"></a>





`AWSIoTOTAUpdate` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 연결된 자격 증명에 작업을 생성하고 AWS IoT , 서명 작업을 AWS IoT 코딩하고, AWS 코드 서명자 작업을 설명할 수 있는 액세스 권한을 부여합니다. 에서이 정책을 보려면 섹션을 AWS Management Console참조하세요[`AWSIoTOTAUpdate`.](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTOTAUpdate?section=permissions)



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - AWS IoT 작업 및 코드 서명 작업을 생성합니다.
+ `signer` - AWS 코드 서명자 작업 생성을 수행합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "iot:CreateJob",
            "signer:DescribeSigningJob"
        ],
        "Resource": "*"
    }
}
```

## AWS 관리형 정책: AWSIoTRuleActions
<a name="security-iam-awsmanpol-AWSIoTRuleActions"></a>





`AWSIoTRuleActions` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 AWS IoT 규칙 작업에서 AWS 서비스지원되는 모든에 대한 액세스를 허용하는 연결된 자격 증명 권한을 부여합니다. 에서이 정책을 보려면 섹션을 AWS Management Console참조하세요[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTRuleActions?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTRuleActions?section=permissions).



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - 규칙 작업 메시지를 게시하기 위한 작업을 수행합니다.
+ `dynamodb` - DynamoDB 테이블에 메시지를 삽입하거나 메시지를 DynamoDB 테이블의 여러 열로 분할합니다.
+ `s3` - Amazon S3 버킷에 객체를 저장합니다.
+ `kinesis` - Amazon Kinesis 스트림 객체에 메시지를 전송합니다.
+ `firehose` - Firehose 스트림 객체에 레코드를 삽입합니다.
+ `cloudwatch` - CloudWatch 경보 상태를 변경하거나 메시지 데이터를 CloudWatch 지표로 전송합니다.
+ `sns` - Amazon SNS를 사용하여 알림을 게시하기 위한 작업을 수행합니다. 이 작업은 AWS IoT SNS 주제로 범위가 지정됩니다.
+ `sqs` - SQS 대기열에 추가할 메시지를 삽입합니다.
+ `es` - OpenSearch Service 서비스에 메시지를 전송합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "dynamodb:PutItem",
            "kinesis:PutRecord",
            "iot:Publish",
            "s3:PutObject",
            "sns:Publish",
            "sqs:SendMessage*",
            "cloudwatch:SetAlarmState",
            "cloudwatch:PutMetricData",
            "es:ESHttpPut",
            "firehose:PutRecord"
        ],
        "Resource": "*"
    }
}
```

## AWS 관리형 정책: AWSIoTThingsRegistration
<a name="security-iam-awsmanpol-AWSIoTThingsRegistration"></a>





`AWSIoTThingsRegistration` 정책을 IAM ID에 연결할 수 있습니다.



이 정책은 연결된 자격 증명에 `StartThingRegistrationTask` API를 사용하여 사물을 대량으로 등록할 수 있는 권한을 부여합니다. 이 정책은 데이터 처리와 저장에 영향을 줄 수 있습니다. 에서이 정책을 보려면 섹션을 AWS Management Console참조하세요[https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTThingsRegistration?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTThingsRegistration?section=permissions).



**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.




+ `iot` - 사물을 생성하고 대량으로 등록 시 정책 및 인증서를 연결하기 위한 작업을 수행합니다.



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AddThingToThingGroup",
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CreateCertificateFromCsr",
                "iot:CreatePolicy",
                "iot:CreateThing",
                "iot:DescribeCertificate",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingType",
                "iot:DetachPolicy",
                "iot:DetachThingPrincipal",
                "iot:GetPolicy",
                "iot:ListAttachedPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:RegisterCertificate",
                "iot:RegisterThing",
                "iot:RemoveThingFromThingGroup",
                "iot:UpdateCertificate",
                "iot:UpdateThing",
                "iot:UpdateThingGroupsForThing",
                "iot:AddThingToBillingGroup",
                "iot:DescribeBillingGroup",
                "iot:RemoveThingFromBillingGroup"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```





## AWS IoT AWS 관리형 정책에 대한 업데이트
<a name="security-iam-awsmanpol-updates"></a>



이 서비스가 이러한 변경 사항을 추적하기 시작한 AWS IoT 이후부터의 AWS 관리형 정책 업데이트에 대한 세부 정보를 봅니다. 이 페이지의 변경 사항에 대한 자동 알림을 받으려면 AWS IoT 문서 기록 페이지에서 RSS 피드를 구독하세요.




| 변경 | 설명 | Date | 
| --- | --- | --- | 
|  [AWSIoTFullAccess](#security-iam-awsmanpol-AWSIoTFullAccess) - 기존 정책 업데이트  |  AWS IoT 는 사용자가 HTTP 프로토콜을 사용하여 AWS IoT 작업 데이터 영역 API 작업에 액세스할 수 있도록 허용하는 새 권한을 추가했습니다. 새로운 IAM 정책 접두사인 `iotjobsdata:`는 AWS IoT Jobs 데이터 영역 엔드포인트에 액세스할 수 있는 보다 세분화된 액세스 제어를 제공합니다. 컨트롤 플레인 API 작업의 경우 여전히 `iot:` 접두사를 사용합니다. 자세한 내용은 [AWS IoT Core HTTPS 프로토콜에 대한 정책](iot-data-plane-jobs.md#iot-jobs-data-http) 단원을 참조하십시오.  | 2022년 5월 11일 | 
|  AWS IoT 에서 변경 내용 추적 시작  |  AWS IoT 가 AWS 관리형 정책에 대한 변경 내용 추적을 시작했습니다.  | 2022년 5월 11일 | 

# AWS IoT 자격 증명 및 액세스 문제 해결
<a name="security_iam_troubleshoot"></a>

다음 정보를 사용하여 및 IAM으로 작업할 때 발생할 수 있는 일반적인 문제를 진단 AWS IoT 하고 수정할 수 있습니다.

**Topics**
+ [에서 작업을 수행할 권한이 없음 AWS IoT](#security_iam_troubleshoot-no-permissions)
+ [iam:PassRole을 수행하도록 인증되지 않음](#security_iam_troubleshoot-passrole)
+ [내 외부의 사람이 내 AWS IoT 리소스에 액세스 AWS 계정 하도록 허용하고 싶습니다.](#security_iam_troubleshoot-cross-account-access)

## 에서 작업을 수행할 권한이 없음 AWS IoT
<a name="security_iam_troubleshoot-no-permissions"></a>

작업을 수행할 권한이 없다는 오류가 표시되면 작업을 수행할 수 있도록 정책을 업데이트해야 합니다.

다음 예시 오류는 `mateojackson` IAM 사용자가 콘솔을 사용하여 사물 리소스에 대한 세부 정보를 보려고 하지만 `iot:DescribeThing` 권한이 없는 경우에 발생합니다.

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: iot:DescribeThing on resource: MyIoTThing
```

이 경우 `iot:DescribeThing` 작업을 사용하여 사물 리소스에 액세스할 수 있도록 `mateojackson` 사용자에 대한 정책을 업데이트해야 합니다.

도움이 필요한 경우 AWS 관리자에게 문의하세요. 관리자는 로그인 자격 증명을 제공한 사람입니다.

 AWS IoT Device Advisor 사용  
 AWS IoT Device Advisor를 사용하는 경우 다음 예제 오류는 사용자가 콘솔을 사용하여 제품군 정의에 대한 세부 정보를 보`mateojackson`려고 하지만 `iotdeviceadvisor:GetSuiteDefinition` 권한이 없는 경우에 발생합니다.  

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: iotdeviceadvisor:GetSuiteDefinition on resource: MySuiteDefinition
```
이 경우 `iotdeviceadvisor:GetSuiteDefinition` 작업을 사용하여 *`MySuiteDefinition`* 리소스에 액세스할 수 있도록 `mateojackson` 사용자 정책을 업데이트해야 합니다.

## iam:PassRole을 수행하도록 인증되지 않음
<a name="security_iam_troubleshoot-passrole"></a>

`iam:PassRole` 작업을 수행할 수 있는 권한이 없다는 오류가 수신되면 AWS IoT에 역할을 전달할 수 있도록 정책을 업데이트해야 합니다.

일부 AWS 서비스 에서는 새 서비스 역할 또는 서비스 연결 역할을 생성하는 대신 기존 역할을 해당 서비스에 전달할 수 있습니다. 이렇게 하려면 역할을 서비스에 전달할 권한이 있어야 합니다.

다음 예 오류는 `marymajor`라는 IAM 사용자가 콘솔을 사용하여 AWS IoT에서 작업을 수행하려고 하는 경우에 발생합니다. 하지만 작업을 수행하려면 서비스 역할이 부여한 권한이 서비스에 있어야 합니다. Mary는 서비스에 역할을 전달할 권한이 없습니다.

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

이 경우, Mary가 `iam:PassRole`작업을 수행할 수 있도록 Mary의 정책을 업데이트해야 합니다.

도움이 필요한 경우 AWS 관리자에게 문의하세요. 관리자는 로그인 자격 증명을 제공한 사람입니다.

## 내 외부의 사람이 내 AWS IoT 리소스에 액세스 AWS 계정 하도록 허용하고 싶습니다.
<a name="security_iam_troubleshoot-cross-account-access"></a>

다른 계정의 사용자 또는 조직 외부의 사람이 리소스에 액세스할 때 사용할 수 있는 역할을 생성할 수 있습니다. 역할을 수임할 신뢰할 수 있는 사람을 지정할 수 있습니다. 리소스 기반 정책 또는 액세스 제어 목록(ACL)을 지원하는 서비스의 경우, 이러한 정책을 사용하여 다른 사람에게 리소스에 대한 액세스 권한을 부여할 수 있습니다.

자세한 내용은 다음을 참조하세요.
+ 에서 이러한 기능을 AWS IoT 지원하는지 여부를 알아보려면 섹션을 참조하세요[AWS IoT 에서 IAM을 사용하는 방법](security_iam_service-with-iam.md).
+ 소유 AWS 계정 한의 리소스에 대한 액세스 권한을 제공하는 방법을 알아보려면 [IAM 사용 설명서의 소유한 다른의 IAM 사용자에게 액세스 권한 제공을 참조 AWS 계정 하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html). ** 
+ 리소스에 대한 액세스 권한을 타사에 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [타사 AWS 계정 소유에 대한 액세스 권한 제공을](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html) AWS 계정참조하세요.
+ ID 페더레이션을 통해 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [외부에서 인증된 사용자에게 액세스 권한 제공(ID 페더레이션)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)을 참조하세요.
+ 크로스 계정 액세스에 대한 역할과 리소스 기반 정책 사용의 차이점을 알아보려면 *IAM 사용 설명서*의 [IAM의 크로스 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

# 로깅 및 모니터링
<a name="security-logging"></a>

모니터링은 AWS IoT 및 AWS 솔루션의 안정성, 가용성 및 성능을 유지하는 데 중요한 부분입니다. 다중 지점 장애가 발생할 경우 보다 쉽게 디버깅할 수 있도록 AWS 솔루션의 모든 부분에서 모니터링 데이터를 수집해야 합니다. 로깅 및 모니터링 절차에 대한 자세한 내용은 단원을 참조하세요[모니터링 AWS IoT](monitoring_overview.md)

## 모니터링 도구
<a name="monitoring_automated_manual"></a>

AWS 는 모니터링에 사용할 수 있는 도구를 제공합니다 AWS IoT. 이러한 도구 중 일부를 구성하여 모니터링을 수행할 수 있습니다. 일부 도구는 수동 개입이 필요합니다. 모니터링 작업은 최대한 자동화하는 것이 좋습니다.

### 자동 모니터링 도구
<a name="monitoring_automated_tools"></a>

다음과 같은 자동 모니터링 도구를 사용하여 문제 발생 시 모니터링하고 AWS IoT 보고할 수 있습니다.
+ **Amazon CloudWatch 경보** – 지정한 기간 동안 단일 지표를 감시하고, 여러 기간에 대해 지정된 임곗값과 관련하여 지표 값을 기준으로 하나 이상의 작업을 수행합니다. 이 작업은 Amazon Simple Notification Service(Amazon SNS) 주제 또는 Amazon EC2 Auto Scaling 정책에 전송되는 알림입니다. CloudWatch 경보는 단순히 특정 상태에 있다고 해서 작업을 호출하지 않습니다. 상태가 변경되어 지정된 기간 수 동안 유지되어야 합니다. 자세한 내용은 [Amazon CloudWatch를 사용하여 AWS IoT 경보 및 지표 모니터링](monitoring-cloudwatch.md) 단원을 참조하십시오.
+ **Amazon CloudWatch Logs** - AWS CloudTrail 또는 기타 소스에서 로그 파일을 모니터링, 저장 및 액세스합니다. 또한 Amazon CloudWatch Logs를 사용하면 Device Advisor 테스트 사례가 수행하는 중요한 단계 AWS IoT , 생성된 이벤트 및 디바이스에서 전송되거나 테스트 실행 AWS IoT Core 중에 전송되는 MQTT 메시지를 볼 수 있습니다. 이러한 로그를 사용하면 장치에서 디버깅하고 수정 조치를 취할 수 있습니다. 자세한 내용은 [CloudWatch Logs AWS IoT 를 사용하여 모니터링](cloud-watch-logs.md) 단원을 참조하세요. Amazon CloudWatch 사용에 대한 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [로그 파일 모니터링](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)을 참조하세요.
+ **Amazon CloudWatch Events** – 이벤트를 일치시키고 하나 이상의 대상 함수 또는 스트림으로 라우팅하여 값을 변경하거나 상태 정보를 캡처하거나 수정 작업을 수행합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [Amazon CloudWatch Events란 무엇입니까](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchEvents.html)를 참조하세요.
+ **AWS CloudTrail 로그 모니터링** - 계정 간에 로그 파일을 공유하고, CloudTrail 로그 파일을 CloudWatch Logs로 전송하여 실시간으로 모니터링하고, Java로 로그 처리 애플리케이션을 작성하고, CloudTrail에서 전송한 후 로그 파일이 변경되지 않았는지 확인합니다. 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [를 사용하여 AWS IoT API 호출 로깅 AWS CloudTrail](iot-using-cloudtrail.md) 및 [CloudTrail 로그 파일 작업](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-working-with-log-files.html)을 참조하세요.

### 수동 모니터링 도구
<a name="monitoring_manual_tools"></a>

모니터링의 또 다른 중요한 부분은 CloudWatch 경보 AWS IoT 가 다루지 않는 항목을 수동으로 모니터링하는 것입니다. AWS IoT, CloudWatch 및 기타 AWS 서비스 콘솔 대시보드는 AWS 환경 상태를 at-a-glance 볼 수 있습니다. 로그 파일도 확인하는 것이 좋습니다 AWS IoT.
+ AWS IoT 대시보드에는 다음이 표시됩니다.
  + CA 인증서
  + 인증서
  + 정책
  + 규칙
  + 사물
+ CloudWatch 홈 페이지에 표시되는 항목은 다음과 같습니다.
  + 현재 경보 및 상태.
  + 경보 및 리소스 그래프.
  + 서비스 상태.

  CloudWatch를 사용하여 다음을 수행할 수 있습니다.
  + [사용자 지정 대시보드](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CloudWatch_Dashboards.html)를 만들어 원하는 서비스 모니터링.
  + 지표 데이터를 그래프로 작성하여 문제를 해결하고 추세 파악.
  + 모든 AWS 리소스 지표를 검색하고 검색합니다.
  + 문제에 대해 알려주는 경보 생성 및 편집

# AWS IoT 코어에 대한 규정 준수 검증
<a name="compliance"></a>

 AWS 서비스 가 특정 규정 준수 프로그램의 범위 내에 있는지 알아보려면 [AWS 서비스 규정 준수 프로그램 범위 내](https://aws.amazon.com/compliance/services-in-scope/)를 참조하고 관심 있는 규정 준수 프로그램을 선택합니다. 일반 정보는 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/).

를 사용하여 타사 감사 보고서를 다운로드할 수 있습니다 AWS Artifact. 자세한 내용은 [Downloading Reports inDownloading AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)을 참조하세요.

사용 시 규정 준수 책임은 데이터의 민감도, 회사의 규정 준수 목표, 관련 법률 및 규정에 따라 AWS 서비스 결정됩니다. 사용 시 규정 준수 책임에 대한 자세한 내용은 [AWS 보안 설명서를](https://docs.aws.amazon.com/security/) AWS 서비스참조하세요.

# AWS IoT Core의 복원력
<a name="disaster-recovery-resiliency"></a>

 AWS 글로벌 인프라는 및 가용 영역을 중심으로 구축됩니다.는 물리적으로 분리되고 격리된 여러 가용 영역을 AWS 리전제공하며,이 가용 영역은 지연 시간이 짧고 처리량이 AWS 리전높으며 중복성이 높은 네트워킹과 연결됩니다. 가용 영역을 사용하면 중단 없이 가용 영역 간에 자동으로 장애 조치가 이루어지는 애플리케이션 및 데이터베이스를 설계하고 운영할 수 있습니다. 가용 영역은 기존의 단일 또는 복수 데이터 센터 인프라보다 가용성, 내결함성, 확장성이 뛰어납니다.

 AWS 리전및 가용 영역에 대한 자세한 내용은 [AWS 글로벌 인프라를](https://aws.amazon.com/about-aws/global-infrastructure/) 참조하세요.

AWS IoT Core 는 디바이스에 대한 정보를 디바이스 레지스트리에 저장합니다. CA 인증서, 디바이스 인증서 및 디바이스 섀도우 데이터도 저장합니다. 이 데이터는 하드웨어 또는 네트워크 장애가 발생할 경우 자동으로 복제되지 않습니다.

AWS IoT Core 는 디바이스 레지스트리가 업데이트될 때 MQTT 이벤트를 게시합니다. 이러한 메시지를 사용하여 레지스트리 데이터를 백업하고 DynamoDB 테이블과 같은 특정 장소에 저장할 수 있습니다. 에서 AWS IoT Core 자동으로 생성하거나 직접 생성한 인증서를 저장할 책임은 사용자에게 있습니다. 디바이스 섀도우는 디바이스에 대한 상태 데이터를 저장하고 디바이스가 다시 온라인 상태가 되면 재전송할 수 있습니다. AWS IoT Device Advisor는 테스트 제품군 구성에 대한 정보를 저장합니다. 이 데이터는 하드웨어 또는 네트워크 장애가 발생할 경우 자동으로 복제됩니다.

AWS IoT Core 리소스는 리전별로 다르며 특별히 그렇게 하지 않는 AWS 리전 한 간에 복제되지 않습니다.

보안 모범 사례에 대한 자세한 내용은 [의 보안 모범 사례 AWS IoT Core](security-best-practices.md) 단원을 참조하세요.

# 인터페이스 VPC 엔드포인트 AWS IoT Core 와 함께 사용
<a name="IoTCore-VPC"></a>

를 사용하면 인터페이스 VPC 엔드포인트를 사용하여 Virtual Private Cloud(VPC) 내에 [IoT 컨트롤 플레](https://docs.aws.amazon.com//iot/latest/developerguide/connect-to-iot.html#iot-service-endpoint-intro)인 엔드포인트와 [IoT 데이터](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-devices.html) 엔드포인트를 생성할 AWS IoT Core수 있습니다. [https://docs.aws.amazon.com//vpc/latest/userguide/vpce-interface.html#create-interface-endpoint](https://docs.aws.amazon.com//vpc/latest/userguide/vpce-interface.html#create-interface-endpoint) 인터페이스 VPC 엔드포인트는 프라이빗 IP 주소를 사용하여 AWS 에서 실행되는 서비스에 액세스하는 데 사용할 수 있는 AWS PrivateLink기술로 구동 AWS 됩니다. 자세한 내용은 [Amazon Virtual Private Cloud(VPC)](https://docs.aws.amazon.com//AmazonVPC/latest/UserGuide/VPC_Introduction.html)를 참조하세요.

기업 네트워크와 같은 원격 네트워크의 현장에서 디바이스를 Amazon VPC에 연결하려면 [네트워크와 Amazon VPC 간 연결 매트릭스](https://docs.aws.amazon.com//whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)에 명시된 옵션 목록을 참조하세요.

**Topics**
+ [AWS IoT Core 컨트롤 플레인용 VPC 엔드포인트 생성](#Create-VPC-endpoints-CP)
+ [AWS IoT Core 데이터 영역에 대한 VPC 엔드포인트 생성](#Create-VPC-endpoints)
+ [AWS IoT Core 자격 증명 공급자를 위한 VPC 엔드포인트 생성](#Create-VPC-endpoints-credential-provider)
+ [Amazon VPC 엔드포인트 생성](#Create-VPC-endpoints-core-create-vpc)
+ [프라이빗 호스팅 영역 구성](#connect-iot-core-create-phz-lns)
+ [VPC 엔드포인트를 AWS IoT Core 통해에 대한 액세스 제어](#Control-VPC-access)
+ [제한 사항](#VPC-limitations)
+ [를 사용하여 VPC 엔드포인트 확장 AWS IoT Core](#Scaling-VPC-endpoints)
+ [VPC 엔드포인트에 사용자 지정 도메인 사용](#VPC-custom-domains)
+ [에 대한 VPC 엔드포인트의 가용성 AWS IoT Core](#VPC-availability)
+ [인터페이스 VPC 엔드포인트에서 AWS IoT Device Management 보안 터널링 사용](IoTCore-ST-VPC.md)

## AWS IoT Core 컨트롤 플레인용 VPC 엔드포인트 생성
<a name="Create-VPC-endpoints-CP"></a>

 AWS IoT Core 컨트롤 플레인 API용 VPC 엔드포인트를 생성하여 디바이스를 AWS IoT 서비스 및 기타 AWS 서비스에 연결할 수 있습니다. VPC 엔드포인트를 시작하려면 [인터페이스 VPC 엔드포인트를 생성하고](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint) AWS IoT Core 를 AWS 서비스로 선택합니다. CLI를 사용하는 경우 먼저 [describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)를 호출하여 AWS IoT Core 가 특정에 있는 가용 영역을 선택하는지 확인합니다 AWS 리전. 예를 들어 us-east-1에서 이 명령은 다음과 같습니다.

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.api
```

아래 AWS IoT Core 컨트롤 플레인용 [Amazon VPC 인터페이스 엔드포인트 생성에](#Create-VPC-endpoints-core-create-vpc) 대한 자세한 지침을 참조하세요.

## AWS IoT Core 데이터 영역에 대한 VPC 엔드포인트 생성
<a name="Create-VPC-endpoints"></a>

 AWS IoT Core 데이터 영역 API용 VPC 엔드포인트를 생성하여 디바이스를 AWS IoT 서비스 및 기타 AWS 서비스에 연결할 수 있습니다. VPC 엔드포인트를 시작하려면 [인터페이스 VPC 엔드포인트를 생성하고](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint) AWS IoT Core 를 AWS 서비스로 선택합니다. CLI를 사용하는 경우 먼저 [describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)를 호출하여 AWS IoT Core 가 특정에 있는 가용 영역을 선택하는지 확인합니다 AWS 리전. 예를 들어 us-east-1에서 이 명령은 다음과 같습니다.

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.data
```

**참고**  
DNS 레코드를 자동으로 생성하는 VPC 기능이 사용 중지됩니다. 이러한 엔드포인트에 연결하려면 프라이빗 DNS 레코드를 수동으로 생성해야 합니다. 프라이빗 VPC DNS 레코드에 대한 자세한 내용은 [인터페이스 엔드포인트용 프라이빗 DNS](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)를 참조하세요. AWS IoT Core VPC 제한 사항에 대한 자세한 내용은 섹션을 참조[제한 사항](#VPC-limitations)하세요.

MQTT 클라이언트를 VPC 엔드포인트 인터페이스에 연결하려면:
+ VPC에 연결된 프라이빗 호스팅 영역에 DNS 레코드를 수동으로 생성해야 합니다. 시작하려면 [프라이빗 호스팅 영역 생성](https://docs.aws.amazon.com//Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)을 참조하세요.
+ 프라이빗 호스팅 영역 내에서 VPC 엔드포인트에 대한 각 탄력적 네트워크 인터페이스 IP에 대한 별칭 레코드를 생성합니다. 여러 VPC 엔드포인트에 대해 여러 네트워크 인터페이스 IP가 있는 경우 모든 가중치 레코드에서 가중치가 동일한 가중치 DNS 레코드를 생성합니다. 이러한 IP 주소는 설명 필드에서 VPC 엔드포인트 ID로 필터링되는 경우 [DescribeNetworkInterfaces](https://docs.aws.amazon.com//AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html) API 호출에서 이용 가능합니다.

[Amazon VPC 인터페이스 엔드포인트 생성](#Create-VPC-endpoints-core-create-vpc) 및 AWS IoT Core 데이터 영역에 대한 [프라이빗 호스팅 영역 구성](#connect-iot-core-create-phz-lns)에 대한 자세한 지침은 아래를 참조하세요.

## AWS IoT Core 자격 증명 공급자를 위한 VPC 엔드포인트 생성
<a name="Create-VPC-endpoints-credential-provider"></a>

VPC 엔드포인트 AWS IoT Core [forcredential 공급자](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)를 생성하여 클라이언트 인증서 기반 인증을 사용하여 디바이스를 연결하고 [AWS 서명 버전 4 형식으로](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_aws-signing.html) 임시 AWS 자격 증명을 가져올 수 있습니다. AWS IoT Core 자격 증명 공급자의 VPC 엔드포인트를 시작하려면 [create-vpc-endpoint](https://docs.aws.amazon.com//cli/latest/reference/ec2/create-vpc-endpoint.html) CLI 명령을 실행하여 [인터페이스 VPC 엔드포인트를 생성하고](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint) 자격 AWS IoT Core 증명 공급자를 AWS 서비스로 선택합니다. 가 특정에 AWS IoT Core 있는 가용 영역을 선택하도록 하려면 AWS 리전먼저 [describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html) 명령을 실행합니다. 예를 들어 us-east-1에서 이 명령은 다음과 같습니다.

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.credentials
```

**참고**  
DNS 레코드를 자동으로 생성하는 VPC 기능이 사용 중지됩니다. 이러한 엔드포인트에 연결하려면 프라이빗 DNS 레코드를 수동으로 생성해야 합니다. 프라이빗 VPC DNS 레코드에 대한 자세한 내용은 [인터페이스 엔드포인트용 프라이빗 DNS](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)를 참조하세요. AWS IoT Core VPC 제한 사항에 대한 자세한 내용은 섹션을 참조[제한 사항](#VPC-limitations)하세요.

HTTP 클라이언트를 VPC 엔드포인트 인터페이스에 연결하려면:
+ VPC에 연결된 프라이빗 호스팅 영역에 DNS 레코드를 수동으로 생성해야 합니다. 시작하려면 [프라이빗 호스팅 영역 생성](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)을 참조하세요.
+ 프라이빗 호스팅 영역 내에서 VPC 엔드포인트에 대한 각 탄력적 네트워크 인터페이스 IP에 대한 별칭 레코드를 생성합니다. 여러 VPC 엔드포인트에 대해 여러 네트워크 인터페이스 IP가 있는 경우 모든 가중치 레코드에서 가중치가 동일한 가중치 DNS 레코드를 생성합니다. 이러한 IP 주소는 설명 필드에서 VPC 엔드포인트 ID로 필터링되는 경우 [DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html) API 호출에서 이용 가능합니다.

[Amazon VPC 인터페이스 엔드포인트 생성](#Create-VPC-endpoints-core-create-vpc) 및 AWS IoT Core 자격 증명 공급자를 위한 [프라이빗 호스팅 영역 구성](#connect-iot-core-create-phz-lns)에 대한 자세한 지침은 아래를 참조하세요.

## Amazon VPC 엔드포인트 생성
<a name="Create-VPC-endpoints-core-create-vpc"></a>

인터페이스 VPC 엔드포인트를 생성하여 로 구동되는 AWS 서비스에 연결할 수 있습니다 AWS PrivateLink. 다음 절차에 따라 AWS IoT Core 데이터 영역 또는 AWS IoT Core 자격 증명 공급자에 연결하는 인터페이스 VPC 엔드포인트를 생성합니다. 자세한 내용은 [인터페이스 VPC 엔드포인트를 사용하여 AWS 서비스 액세스를 참조하세요](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html).

**참고**  
 AWS IoT Core 데이터 영역 및 AWS IoT Core 자격 증명 공급자에 대한 Amazon VPC 인터페이스 엔드포인트를 생성하는 프로세스는 비슷하지만 연결을 작동하려면 엔드포인트별 변경을 수행해야 합니다.

 **[VPC](https://console.aws.amazon.com/vpc/home#/endpoints) **엔드포인트** 콘솔**을 사용해 인터페이스 VPC 엔드포인트 생성 

1. [VPC](https://console.aws.amazon.com/vpc/home#/endpoints) **엔드포인트** 콘솔로 이동한 다음 왼쪽 메뉴의 **Virtual Private Cloud(VPC)**에서 **엔드포인트**를 선택한 다음 **엔드포인트 생성**을 선택합니다.

1. **엔드포인트 생성** 페이지에서 다음 정보를 지정합니다.
   + **서비스 범주**에서 **AWS 서비스**를 선택합니다.
   + **서비스 이름**에 키워드 `iot`를 입력하여 검색합니다. 표시된 `iot` 서비스 목록에서 엔드포인트를 선택합니다.

      AWS IoT Core 컨트롤 플레인에 대한 VPC 엔드포인트를 생성하는 경우에 대한 AWS IoT Core 컨트롤 플레인 API 엔드포인트를 선택합니다 AWS 리전. 엔드포인트 형식은 `com.amazonaws.region.iot.api`이(가) 될 것입니다.

      AWS IoT Core 데이터 영역에 대한 VPC 엔드포인트를 생성하는 경우 해당 리전의 AWS IoT Core 데이터 영역 API 엔드포인트를 선택합니다. 엔드포인트 형식은 `com.amazonaws.region.iot.data`이(가) 될 것입니다.

      AWS IoT Core 자격 증명 공급자에 대한 VPC 엔드포인트를 생성하는 경우 해당 리전의 AWS IoT Core 자격 증명 공급자 엔드포인트를 선택합니다. 엔드포인트 형식은 `com.amazonaws.region.iot.credentials`이(가) 될 것입니다.

     FIPS(연방 정보 처리 표준) 리전에 대한 VPC 엔드포인트를 생성하는 경우에 대한 FIPS API 엔드포인트를 선택합니다 AWS 리전. 엔드포인트 형식은 `com.amazonaws.region.iot-fips.api`이(가) 될 것입니다. 이는 컨트롤 플레인에만 해당됩니다.
**참고**  
중국 리전의 AWS IoT Core 데이터 영역에 대한 서비스 이름은 형식입니다`cn.com.amazonaws.region.iot.data`. 중국 리전에서 AWS IoT Core 컨트롤 플레인의 서비스 이름은 형식입니다`com.amazonaws.region.iot.api`.
   + **VPC** 및 **서브넷**에서 엔드포인트를 생성하려는 VPC 및 엔드포인트 네트워크를 생성하려는 가용 영역(AZ)을 선택합니다.
   + **DNS 이름 활성화**에서 AWS IoT Core 데이터 영역 및 AWS IoT Core 자격 증명 공급자**에 대해이 엔드포인트에 대한 활성화**가 선택되지 않았는지 확인합니다. AWS IoT Core 데이터 영역이나 AWS IoT Core 자격 증명 공급자 모두 프라이빗 DNS 이름을 아직 지원하지 않습니다.

      AWS IoT Core 컨트롤 플레인의 경우 **DNS 이름 활성화**가 기본적으로 선택됩니다. 이렇게 하면 컨트롤 플레인 퍼블릭 엔드포인트에 AWS IoT Core 대한 모든 요청이 대신 VPC 엔드포인트를 통해 라우팅됩니다. 이 옵션을 활성화하면 프라이빗 호스팅 영역을 구성할 필요가 없습니다.
   + **보안 그룹**에서 엔드포인트 네트워크 인터페이스와 연결하려는 보안 그룹을 선택합니다.
   + 선택적으로 태그를 추가하거나 제거할 수 있습니다. 태그는 엔드포인트와 연결하는 데 사용하는 이름-값 페어입니다.

1. VPC 엔드포인트를 생성하려면 **엔드포인트 생성**을 선택합니다.

 AWS PrivateLink 엔드포인트를 생성한 후 엔드포인트의 **세부 정보** 탭에 DNS 이름 목록이 표시됩니다. 이러한 DNS 이름 중 하나를 사용하여 [프라이빗 호스팅 영역을 구성](#connect-iot-core-create-phz-lns)할 수 있습니다. AWS IoT Core 컨트롤 플레인을 사용하는 경우 프라이빗 호스팅 영역을 구성할 필요가 없습니다.

## 프라이빗 호스팅 영역 구성
<a name="connect-iot-core-create-phz-lns"></a>

**참고**  
 AWS IoT Core 컨트롤 플레인을 사용하고 **DNS 이름 활성화**를 선택한 경우 프라이빗 호스팅 영역을 구성할 필요가 없습니다. 비활성화한 경우이 절차에 따라 프라이빗 호스팅 영역을 구성해야 합니다.

이전 섹션에서 생성한 DNS 이름 중 하나를 사용하여 프라이빗 호스팅 영역을 구성할 수 있습니다.

 ** AWS IoT Core 데이터 영역의 경우** 

DNS 이름은 도메인 구성 이름 또는 사용자의 `IoT:Data-ATS` 엔드포인트여야 합니다. DNS 이름 예시: ` xxx-ats.data.iot.region.amazonaws.com` 

 ** AWS IoT Core 자격 증명 공급자의 경우** 

DNS 이름은 사용자의 `iot:CredentialProvider` 엔드포인트여야 합니다. DNS 이름 예시: ` xxxx.credentials.iot.region.amazonaws.com` 

 ** AWS IoT Core 컨트롤 플레인용** 

DNS 이름은 AWS IoT Core 컨트롤 플레인 엔드포인트여야 합니다. AWS IoT Core 컨트롤 플레인의 DNS 이름 예는 입니다` xxxx.api.iot.region.amazonaws.com`.

**참고**  
 AWS IoT Core 데이터 영역 및 AWS IoT Core 자격 증명 공급자에 대한 프라이빗 호스팅 영역을 구성하는 프로세스는 비슷하지만 연결을 작동하려면 엔드포인트별 변경을 수행해야 합니다.

### 프라이빗 호스팅 영역 생성
<a name="connect-iot-core-create-phz-lns-private-hosted-zone"></a>

 **Route 53 콘솔로 프라이빗 호스팅 영역 생성** 

1. [Route 53](https://console.aws.amazon.com/route53/v2/hostedzones#/) **호스팅 영역** 콘솔로 이동하여 **호스팅 영역 생성**을 선택합니다.

1. **호스팅 영역 생성** 페이지에서 다음 정보를 지정합니다.
   + **도메인 이름**에는 사용자 `iot:Data-ATS` 또는 `iot:CredentialProvider` 엔드포인트의 엔드포인트 주소를 입력합니다. 다음 AWS CLI 명령으로 퍼블릭 네트워크(`aws iot describe-endpoint --endpoint-type iot:Data-ATS` 또는 `aws iot describe-endpoint --endpoint-type iot:CredentialProvider`)를 통해 엔드포인트를 가져올 수 있습니다.
**참고**  
사용자 지정 도메인을 사용하는 경우 [VPC 엔드포인트에 사용자 지정 도메인 사용](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html#VPC-custom-domains)을 참조하세요. 사용자 지정 도메인은 AWS IoT Core 자격 증명 공급자에 대해 지원되지 않습니다.
   + **유형** 목록에서 **프라이빗 호스팅 영역**을 선택합니다.
   + 필요에 따라 호스팅 영역과 연결할 태그를 추가하거나 제거할 수 있습니다.

1. 프라이빗 호스팅 영역을 생성하려면 **호스팅 영역 생성**을 선택합니다.

자세한 내용은 [프라이빗 호스팅 영역 생성](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)을 참조하세요.

### 레코드 생성
<a name="connect-iot-core-create-phz-lns-create-record"></a>

프라이빗 호스팅 영역을 생성한 후 DNS에 트래픽을 해당 도메인으로 라우팅할 방법을 알려주는 레코드를 생성할 수 있습니다.

 **레코드 생성** 

1. 표시된 호스팅 영역 목록에서 이전에 생성한 프라이빗 호스팅 영역을 선택하고 **레코드 생성**을 선택합니다.

1. 마법사 메서드를 사용하여 레코드를 만듭니다. 콘솔이 **빠른 생성** 메서드를 제공하는 경우 **마법사로 전환**을 선택합니다.

1. **라우팅 정책**에서 **단순 라우팅**을 선택한 후 **다음**을 선택합니다.

1. **레코드 구성** 페이지에서 **단순 레코드 정의**를 선택합니다.

1. **단순 레코드 정의** 페이지에서:
   + **레코드 이름**에 `iot:Data-ATS` 또는 `iot:CredentialProvider` 엔드포인트를 입력합니다. 프라이빗 호스팅 영역 이름과 같아야 합니다.
   + **레코드 유형**의 경우 IPv4만 지원하려면 값을 `A - Routes traffic to an IPv4 address and some AWS resources`로 유지합니다. IPv6만 지원하려면 값을 `AAAA - Routes traffic to an IPv6 address and some AWS resources`로 유지합니다. 듀얼 스택 지원(IPv4 및 IPv6 모두)을 원하는 경우, 호스팅 영역에 **레코드 이름**과 **값/라우팅 트래픽 대상**이 동일한 두 개의 레코드(`A` 및 `AAAA`)를 생성합니다.
   + **값/트래픽 라우팅 대상(Value/Route traffic to)**에서 **VPC 엔드포인트에 대한 별칭(Alias to VPC endpoint)**을 선택합니다. 그리고 나서 **리전**을 선택한 다음 [Amazon VPC 엔드포인트 생성](#Create-VPC-endpoints-core-create-vpc)에 설명된 대로 표시된 엔드포인트 목록에서 이전에 생성한 엔드포인트를 선택합니다.

1. **단순 레코드 정의**를 선택하여 레코드를 만듭니다.

## VPC 엔드포인트를 AWS IoT Core 통해에 대한 액세스 제어
<a name="Control-VPC-access"></a>

VPC [조건 컨텍스트 키를](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html) 사용하여 디바이스 액세스를 VPC 엔드포인트를 통해서만 허용 AWS IoT Core 하도록 제한할 수 있습니다.는 다음 VPC 관련 컨텍스트 키를 AWS IoT Core 지원합니다.
+  [SourceVpc](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpc) 
+  [SourceVpce](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpce) 
+  [VPCSourceIp](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-vpcsourceip) 

**참고**  
AWS IoT Core 는 [VPC 엔드포인트에 대한 엔드포인트 정책을](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies) 지원하지 않습니다.

예를 들어 다음 정책은 사물 이름과 일치하는 클라이언트 ID를 AWS IoT Core 사용하여에 연결하고 사물 이름 접두사가 붙은 주제에 게시할 수 있는 권한을 부여합니다. 단, 디바이스가 특정 VPC 엔드포인트 ID를 사용하여 VPC 엔드포인트에 연결하는 것을 조건으로 합니다. 이 정책은 퍼블릭 IoT 데이터 엔드포인트에 대한 연결 시도를 거부합니다.

****  

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

## 제한 사항
<a name="VPC-limitations"></a>

VPC 엔드포인트는 현재 [AWS IoT Core 컨트롤 플레인 엔드포인트](https://docs.aws.amazon.com//iot/latest/developerguide/connect-to-iot.html#iot-service-endpoint-intro), [AWS IoT Core 데이터 엔드포인트](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-devices.html#iot-connect-device-endpoints) 및 [AWS IoT Core 자격 증명 공급자](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.htm) 엔드포인트에 대해 지원됩니다. VPC 엔드포인트는 컨트롤 플레인을 사용할 때 [Federal Information Processing Standard(FIPS) 엔드포인트](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-fips.html)에서만 지원됩니다 AWS IoT Core .

### IoT 컨트롤 플레인 VPC 엔드포인트의 제한 사항
<a name="VPC-limitations-iot-control"></a>

이 섹션에서는 IoT 컨트롤 플레인 VPC 엔드포인트의 제한 사항을 다룹니다.
+ VPC 엔드포인트는 ATS 인증서만 사용할 수 있습니다.
+ 컨트롤 플레인 엔드포인트에는 사용자 지정 도메인이 지원되지 않습니다.
+ FIPS 보안 정책에 대한 자세한 내용은 [FIPS 보안 정책을](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/describe-ssl-policies.html#fips-security-policies) 참조하세요.

### IoT 데이터 VPC 엔드포인트 제한 사항
<a name="VPC-limitations-iot-data"></a>

본 섹션에서는 IoT 데이터 VPC 엔드포인트의 제한 사항을 다룹니다.
+ MQTT 유지 기간은 230초로 제한됩니다. 해당 연결 유지 시간 초과 시 자동으로 230초로 줄어듭니다.
+ 각 VPC 엔드포인트는 총 100,000개의 동시 연결 디바이스를 지원합니다. 더 많은 연결이 필요한 경우 [를 사용하여 VPC 엔드포인트 확장 AWS IoT Core](#Scaling-VPC-endpoints) 섹션을 참조하세요.
+ VPC 엔드포인트는 [ATS 인증서](https://docs.aws.amazon.com//iot/latest/developerguide/server-authentication.html)만 사용할 수 있습니다(사용자 지정 도메인 제외).
+  [VPC 엔드포인트](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html) 정책은 지원되지 않습니다.
+  AWS IoT Core 데이터 영역에 AWS IoT Core 대해 생성된 VPC 엔드포인트의 경우는 영역 또는 리전 퍼블릭 DNS 레코드 사용을 지원하지 않습니다.

### 자격 증명 공급자 엔드포인트 제한 사항
<a name="VPC-limitations-credential-provider"></a>

본 섹션에서는 자격 증명 공급자 VPC 엔드포인트의 제한 사항을 다룹니다.
+ VPC 엔드포인트는 [ATS 인증서](https://docs.aws.amazon.com//iot/latest/developerguide/server-authentication.html)만 사용할 수 있습니다.
+  [VPC 엔드포인트](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html) 정책은 지원되지 않습니다.
+ 사용자 지정 도메인은 자격 증명 공급자에 지원되지 않습니다.
+  AWS IoT Core 자격 증명 공급자를 위해 생성된 VPC 엔드포인트의 경우는 영역 또는 리전 퍼블릭 DNS 레코드 사용을 지원하지 AWS IoT Core 않습니다.

## 를 사용하여 VPC 엔드포인트 확장 AWS IoT Core
<a name="Scaling-VPC-endpoints"></a>

AWS IoT Core 인터페이스 VPC 엔드포인트는 단일 인터페이스 엔드포인트를 통해 100,000개의 연결된 디바이스로 제한됩니다. 사용 사례에서 브로커에 대한 추가 동시 연결을 요구하는 경우 여러 VPC 엔드포인트를 사용하고 인터페이스 엔드포인트에서 디바이스를 수동으로 라우팅하는 것이 좋습니다. VPC 엔드포인트로 트래픽을 라우팅하기 위해 프라이빗 DNS 레코드를 생성할 때 여러 엔드포인트에 트래픽을 분산할 VPC 엔드포인트가 있는 만큼의 가중치 레코드를 생성해야 합니다.

## VPC 엔드포인트에 사용자 지정 도메인 사용
<a name="VPC-custom-domains"></a>

VPC 엔드포인트와 함께 사용자 정의 도메인을 사용하려면 프라이빗 호스팅 영역에서 사용자 정의 도메인 이름 레코드를 생성하고 Route53에서 라우팅 레코드를 생성해야 합니다. 자세한 내용은 [프라이빗 호스팅 영역 생성](https://docs.aws.amazon.com//Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)을 참조하세요.

**참고**  
사용자 지정 도메인은 AWS IoT Core 데이터 엔드포인트에서만 지원됩니다.

## 에 대한 VPC 엔드포인트의 가용성 AWS IoT Core
<a name="VPC-availability"></a>

AWS IoT Core 인터페이스 VPC 엔드포인트는 [AWS IoT Core 지원되는 모든 리전](https://aws.amazon.com//about-aws/global-infrastructure/regional-product-services/)에서 사용할 수 있습니다. 자격 증명 공급자의 AWS IoT Core AWS IoT Core 인터페이스 VPC 엔드포인트는 중국 리전 및에서 지원되지 않습니다 AWS GovCloud (US) Regions.

# 인터페이스 VPC 엔드포인트에서 AWS IoT Device Management 보안 터널링 사용
<a name="IoTCore-ST-VPC"></a>

AWS IoT Device Management 보안 터널링은 인터페이스 VPC 엔드포인트를 지원합니다. VPC 엔드포인트를 사용하면 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결 없이 VPC와 AWS 네트워크 AWS IoT Secure Tunneling 간의 트래픽을 유지할 수 있습니다.

인터페이스 VPC 엔드포인트는 프라이빗 IP 주소를 사용하여 서비스에 비공개로 액세스할 수 있는 기술[AWS PrivateLink](https://docs.aws.amazon.com//vpc/latest/privatelink/what-is-privatelink.html)인 로 구동됩니다. 자세한 내용은 AWS PrivateLink 가이드의 [인터페이스 VPC 엔드포인트를 사용하여 AWS 서비스 액세스를](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html) 참조하세요.

**Topics**
+ [사전 조건](#Create-ST-VPC-endpoints-prereq)
+ [VPC 엔드포인트를 통해 터널 알림 수신](#ST-VPC-Receive-notifications)
+ [보안 터널링을 위한 VPC 엔드포인트 생성](#Create-ST-VPC-endpoints-Create)
+ [프록시 서버에서 VPC 엔드포인트 정책 구성](#Create-ST-VPC-endpoints-Configure)
+ [다음 단계](#Create-ST-VPC-endpoints-Next)

## 사전 조건
<a name="Create-ST-VPC-endpoints-prereq"></a>

에 대한 VPC 엔드포인트를 생성하기 전에 다음이 있는지 AWS IoT Secure Tunneling확인합니다.
+ VPC 엔드포인트를 생성하는 데 필요한 권한이 있는 AWS 계정입니다.
+  AWS 계정의 VPC입니다.
+  AWS IoT Device Management 보안 터널링 개념에 대한 이해.
+ VPC 엔드포인트 정책 및 AWS Identity and Access Management (IAM)에 대한 지식

## VPC 엔드포인트를 통해 터널 알림 수신
<a name="ST-VPC-Receive-notifications"></a>

VPC 엔드포인트를 통해 터널 알림을 수신하기 위해 디바이스는 VPC 엔드포인트를 통해 AWS IoT Core 데이터 영역에 연결하고 보안 터널링 예약 MQTT 주제를 구독할 수 있습니다.

 AWS IoT Core 데이터 영역에서 VPC 엔드포인트를 생성하고 구성하는 방법에 대한 지침은 AWS IoT 개발자 안내서의 [인터페이스 VPC 엔드포인트와 AWS IoT Core 함께 사용을](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html) 참조하세요.

## 보안 터널링을 위한 VPC 엔드포인트 생성
<a name="Create-ST-VPC-endpoints-Create"></a>

보안 터널링 컨트롤 플레인과 프록시 서버 모두에 대한 VPC 엔드포인트를 생성할 수 있습니다.

**보안 터널링을 위한 VPC 엔드포인트를 생성하려면**

1. Amazon VPC 개발자 안내서의 [인터페이스 엔드포인트 생성](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)의 단계를 따릅니다.

1. **서비스 이름**에서 엔드포인트 유형에 따라 다음 옵션 중 하나를 선택합니다.

**컨트롤 플레인**
   + 표준: `com.amazonaws.<region>.iot.tunneling.api` 
   + FIPS(FIPS 리전에서 사용 가능): `com.amazonaws.<region>.iot-fips.tunneling.api` 

**프록시 서버**
   + 표준: `com.amazonaws.<region>.iot.tunneling.data` 
   + FIPS(FIPS 리전에서 사용 가능): `com.amazonaws.<region>.iot-fips.tunneling.data` 

   *<region>*을 로 바꿉니다 AWS 리전. 예를 들어 `us-east-1`입니다.

1. 네트워크 요구 사항에 따라 VPC 엔드포인트 생성 프로세스의 나머지 단계를 완료합니다.

## 프록시 서버에서 VPC 엔드포인트 정책 구성
<a name="Create-ST-VPC-endpoints-Configure"></a>

터널에 대한 연결을 승인하는 데 사용되는 클라이언트 액세스 토큰 기반 권한 부여 외에도 VPC 엔드포인트 정책을 사용하여 디바이스가 VPC 엔드포인트를 사용하여 보안 터널링 프록시 서버에 연결하는 방법을 추가로 제한할 수 있습니다. VPC 엔드포인트 정책은 IAM과 유사한 구문을 따르며 VPC 엔드포인트 자체에 구성됩니다.

프록시 서버 VPC 엔드포인트 정책에 대해 지원되는 유일한 IAM 작업은 입니다`iot:ConnectToTunnel`.

다음은 다양한 VPC 엔드포인트 정책의 예입니다.

### 프록시 서버 VPC 엔드포인트 정책 예제
<a name="w2aac17c35c31c15b9"></a>

다음 예제에서는 일반적인 사용 사례에 대한 프록시 서버 VPC 엔드포인트 정책 구성을 보여줍니다.

**Example - 기본 정책**  
이 정책은 VPC 내의 디바이스 AWS 리전 가 엔드포인트가 생성된 동일한의 모든 터널에 모든 AWS 계정에서 연결할 수 있도록 허용합니다.  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "*",
            "Resource": "*"
        }
    ]
}
```

**Example - 특정 AWS 계정에 대한 액세스 제한**  
이 정책은 VPC 엔드포인트가 특정 AWS 계정의 터널에만 연결하도록 허용합니다.  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*",
                "arn:aws:iot:us-east-1:444455556666:tunnel/*"
            ]
        }
    ]
}
```

**Example - 터널 엔드포인트별 연결 제한**  
디바이스가 터널의 소스 또는 대상 끝에 연결할 수 있도록 VPC 엔드포인트 액세스를 제한할 수 있습니다.  
소스만 해당:  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "source"
                }
            }
        }
    ]
}
```

대상만 해당:

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "destination"
                }
            }
        }
    ]
}
```

**Example - 리소스 태그를 기반으로 액세스 제한**  
이 정책은 VPC 엔드포인트가 특정 키-값 페어로 태그가 지정된 터널에만 연결하도록 허용합니다.  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "Production"
                }
            }
        }
    ]
}
```

**Example - 결합된 정책 조건**  
이 정책은 여러 정책 요소를 결합하는 방법을 보여줍니다. 터널에가 로 `AllowConnectionsThroughPrivateLink` 설정되어 `true` 있고 클라이언트가 터널의 대상 끝에 연결되지 않는 경우에만 특정 AWS 계정의 터널에 대한 연결을 허용합니다.  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AllowConnectionsThroughPrivateLink": "true"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*"
            ],
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "destination"
                }
            }
        }
    ]
}
```

## 다음 단계
<a name="Create-ST-VPC-endpoints-Next"></a>

에 대한 VPC 엔드포인트를 생성하고 구성한 후에는 다음 사항을 AWS IoT Secure Tunneling고려하세요.
+ 엔드포인트를 통해 디바이스를 연결하여 VPC 엔드포인트 구성을 테스트합니다.
+  Amazon CloudWatch 지표를 통해 VPC 엔드포인트 사용량을 모니터링합니다.
+ 보안 요구 사항에 따라 VPC 엔드포인트 정책을 검토하고 업데이트합니다.

 AWS IoT Device Management 보안 터널링에 대한 자세한 내용은 섹션을 참조하세요[AWS IoT Secure Tunneling](https://docs.aws.amazon.com//iot/latest/developerguide/secure-tunneling.html).

# 의 인프라 보안 AWS IoT
<a name="infrastructure-security"></a>

관리형 서비스 모음으로서 AWS IoT 는 [Amazon Web Services: 보안 프로세스 개요](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf) 백서에 설명된 AWS 글로벌 네트워크 보안 절차로 보호됩니다.

 AWS 에서 게시한 API 호출을 사용하여 네트워크를 AWS IoT 통해에 액세스합니다. 클라이언트가 전송 계층 보안(TLS) 1.2 이상을 지원해야 합니다. 클라이언트는 Ephemeral Diffie-Hellman(DHE) 또는 Elliptic Curve Ephemeral Diffie-Hellman(ECDHE)과 같은 완전 전송 보안(PFS)이 포함된 암호 제품군도 지원해야 합니다. Java 7 이상의 최신 시스템은 대부분 이러한 모드를 지원합니다. 자세한 내용은 [의 전송 보안 AWS IoT Core](transport-security.md) 단원을 참조하세요.

요청은 액세스 키 ID 및 IAM 보안 주체와 관련된 비밀 액세스 키를 사용하여 서명해야 합니다. 또는 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)(AWS STS)를 사용하여 임시 보안 자격 증명을 생성하여 요청에 서명할 수 있습니다.

# AWS IoT Core를 사용한 프로덕션 플릿 또는 디바이스의 보안 모니터링
<a name="security-monitoring"></a>

IoT 플릿은 다양한 기능을 수행하고 장기적으로 사용되며 지리적으로 분산된 다수의 디바이스로 구성될 수 있습니다. 이러한 특성으로 인해 플릿 설정이 복잡해지고 오류가 발생하기 쉬워집니다. 장치가 컴퓨팅 파워, 메모리 및 스토리지 기능에서 제한되는 경우가 있으므로 장치 자체에서 암호화 및 다른 보안 형태의 사용이 제한됩니다. 또한 장치에서 알려진 취약성이 있는 소프트웨어를 사용하는 경우도 있습니다. 이러한 요소로 인해 IoT 플릿이 해커의 매력적인 대상이 되며, 디바이스 플릿을 지속적으로 보호하기 어렵게 됩니다.

AWS IoT Device Defender 는 보안 문제와 모범 사례와의 편차를 식별하는 도구를 제공하여 이러한 문제를 해결합니다. AWS IoT Device Defender를 사용하여 연결된 디바이스를 분석, 감사 및 모니터링하여 비정상적인 동작을 감지하고 보안 위험을 완화할 수 있습니다. AWS IoT Device Defender 는 디바이스 플릿을 감사하여 보안 모범 사례를 준수하고 디바이스에서 비정상적인 동작을 감지할 수 있습니다. 이를 통해 AWS IoT 디바이스 플릿에 일관된 보안 정책을 적용하고 디바이스가 손상되면 신속하게 대응할 수 있습니다. 자세한 내용은 [AWS IoT Device Defender](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/what-is-device-defender.html) 단원을 참조하십시오.

AWS IoT Device Advisor는 필요에 따라 업데이트를 푸시하고 플릿을 패치합니다. AWS IoT Device Advisor는 테스트 사례를 자동으로 업데이트합니다. 선택한 테스트 케이스는 항상 최신 버전입니다. 자세한 내용은 [디바이스 어드바이저](device-advisor.md) 단원을 참조하십시오.

# 의 보안 모범 사례 AWS IoT Core
<a name="security-best-practices"></a>

이 섹션에는의 보안 모범 사례에 대한 정보가 포함되어 있습니다 AWS IoT Core. 산업용 IoT 솔루션의 보안 규칙에 대한 자세한 내용은 [산업용 IoT 솔루션을 위한 10가지 보안 황금률](https://aws.amazon.com/blogs/iot/ten-security-golden-rules-for-industrial-iot-solutions/)을 참조하세요.

## 에서 MQTT 연결 보호 AWS IoT
<a name="secure-mqtt"></a>

[AWS IoT Core](https://aws.amazon.com/iot-core/)는 연결된 디바이스가 클라우드 애플리케이션 및 기타 디바이스와 쉽고 안전하게 상호 작용할 수 있도록 하는 관리형 클라우드 서비스입니다.는 간헐적 연결을 허용하도록 특별히 설계된 경량 통신 프로토콜인 HTTP, [WebSocket](https://en.wikipedia.org/wiki/WebSocket) 및 [MQTT](https://en.wikipedia.org/wiki/MQTT)를 AWS IoT Core 지원합니다. MQTT를 AWS IoT 사용하여에 연결하는 경우 각 연결은 클라이언트 ID라고 하는 식별자와 연결되어야 합니다. MQTT 클라이언트 ID는 MQTT 연결을 고유하게 식별합니다. 다른 연결에 대해 이미 신청된 클라이언트 ID를 사용하여 새 연결이 설정되면 AWS IoT 메시지 브로커는 이전 연결을 삭제하여 새 연결을 허용합니다. 클라이언트 IDs 각각 AWS 계정 내에서 고유해야 합니다 AWS 리전. 즉, 내 외부 AWS 계정 또는 내 리전 간에 클라이언트 IDs의 글로벌 고유성을 적용할 필요가 없습니다 AWS 계정.

디바이스 플릿에서 MQTT 연결 해제의 영향 및 심각도는 여러 요인에 좌우됩니다. 다음이 포함됩니다.
+ 사용 사례(예: 디바이스가 전송하는 데이터 AWS IoT, 데이터 양 및 데이터 전송 빈도).
+ MQTT 클라이언트 구성(예: 자동 재연결 설정, 연결된 백오프 타이밍, [MQTT 영구 세션](mqtt.md#mqtt-persistent-sessions) 사용)
+ 디바이스 리소스 제한 사항
+ 연결 해제의 근본 원인, 강도 및 지속성

클라이언트 ID 충돌과 잠재적인 부정적 영향을 방지하려면 각 디바이스 또는 모바일 애플리케이션에 AWS IoT 메시지 브로커에 대한 MQTT 연결에 사용할 수 있는 클라이언트 IDs를 제한하는 AWS IoT 또는 IAM 정책이 있는지 확인합니다. 예를 들어 IAM 정책을 사용하면 이미 사용 중인 클라이언트 ID를 사용하여 디바이스가 의도치 않게 다른 디바이스의 연결을 종료하지 않도록 할 수 있습니다. 자세한 내용은 [권한 부여](iot-authorization.md) 단원을 참조하십시오.

플릿의 모든 디바이스에는 메시지 게시 또는 특정 범위 및 컨텍스트가 있는 주제 구독과 같은 AWS IoT MQTT 작업을 포함하는(이에 국한되지 않음) 의도한 작업만 승인하는 권한이 있는 자격 증명이 있어야 합니다. 특정 권한 정책은 사용 사례에 따라 다를 수 있습니다. 비즈니스 및 보안 요구 사항에 가장 적합한 권한 정책을 식별합니다.

권한 정책 생성 및 관리를 간소화하기 위해 [AWS IoT Core 정책 변수](iot-policy-variables.md) 및 [IAM 정책 변수](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)를 사용할 수 있습니다. 정책에 정책 변수를 삽입할 수 있으며, 정책이 평가될 때 해당 변수가 디바이스의 요청에서 나온 값으로 대체됩니다. 정책 변수를 사용하여 복수의 디바이스에 권한을 부여하는 단일 정책을 생성할 수 있습니다. AWS IoT 메시지 브로커에 연결하는 데 사용되는 AWS IoT 계정 구성, 인증 메커니즘 및 네트워크 프로토콜을 기반으로 사용 사례에 맞는 관련 정책 변수를 식별할 수 있습니다. 그러나 최선의 권한 정책을 작성하려면 사용 사례 및 [위협 모델](https://en.wikipedia.org/wiki/Threat_model)의 구체적 내용을 고려해야 합니다.

예를 들어 AWS IoT , 레지스트리에 디바이스를 등록한 경우 정책의 사물 [정책 변수를 사용하여 사물](thing-policy-variables.md) 이름, 사물 유형 및 사물 속성 값과 같은 사물 속성을 기반으로 권한을 AWS IoT 부여하거나 거부할 수 있습니다. 사물 이름은 사물이 연결될 때 전송되는 MQTT 연결 메시지의 클라이언트 ID에서 가져옵니다 AWS IoT. 사물 정책 변수는 사물이 TLS 상호 인증을 사용하여 MQTT AWS IoT 를 통해에 연결되거나 인증된 [Amazon Cognito 자격 증명을](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identities.html) 사용하여 WebSocket 프로토콜을 통해 MQTT에 연결될 때 대체됩니다. [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API를 사용하여 인증서 및 인증된 Amazon Cognito 자격 증명을 사물에 연결할 수 있습니다. `iot:Connection.Thing.ThingName`은(는) 클라이언트 ID 제한을 적용할 수 있는 유용한 사물 정책 변수입니다. 다음 예제 AWS IoT 정책은 등록된 사물의 이름을 AWS IoT 메시지 브로커에 대한 MQTT 연결의 클라이언트 ID로 사용해야 합니다.

****  

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

지속적인 클라이언트 ID 충돌을 식별하려면 [CloudWatch Logs를 AWS IoT](cloud-watch-logs.md) 활성화하고 사용할 수 있습니다. 클라이언트 ID 충돌로 인해 AWS IoT 메시지 브로커가 연결을 해제하는 모든 MQTT 연결에 대해 다음과 유사한 로그 레코드가 생성됩니다.

```
{
    "timestamp": "2019-04-28 22:05:30.105",
    "logLevel": "ERROR",
    "traceId": "02a04a93-0b3a-b608-a27c-1ae8ebdb032a",
    "accountId": "123456789012",
    "status": "Failure",
    "eventType": "Disconnect",
    "protocol": "MQTT",
    "clientId": "clientId01",
    "principalId": "1670fcf6de55adc1930169142405c4a2493d9eb5487127cd0091ca0193a3d3f6",
    "sourceIp": "203.0.113.1",
    "sourcePort": 21335,
    "reason": "DUPLICATE_CLIENT_ID",
    "details": "A new connection was established with the same client ID"
}
```

[CloudWatch Logs 필터](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)(예: `{$.reason= "DUPLICATE_CLIENT_ID" }`)를 사용하여 클라이언트 ID 충돌 인스턴스를 검색하거나 지속적인 모니터링 및 보고를 위해 [CloudWatch 지표 필터](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringPolicyExamples.html) 및 해당 CloudWatch 경보를 설정할 수 있습니다.

[AWS IoT Device Defender](https://aws.amazon.com/iot-device-defender/)를 사용하여 지나치게 허용적인 정책 AWS IoT 및 IAM 정책을 식별할 수 있습니다. AWS IoT 또한 Device Defender는 플릿의 여러 디바이스가 동일한 클라이언트 ID를 사용하여 AWS IoT 메시지 브로커에 연결되어 있는지 여부를 알려주는 감사 검사를 제공합니다.

 AWS IoT Device Advisor를 사용하여 디바이스가 보안 모범 사례에 안정적으로 연결하고 AWS IoT Core 따를 수 있는지 확인할 수 있습니다.

### 다음 사항도 참조하세요.
<a name="mqtt-security-see-also"></a>
+ [AWS IoT Core](https://aws.amazon.com/iot-core/)
+ [AWS IoT의 보안 기능](authentication.md)
+ [AWS IoT Core 정책 변수](iot-policy-variables.md)
+ [IAM 정책 변수](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_variables.html)
+ [Amazon Cognito 자격 증명](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identities.html)
+ [AWS IoT Device Defender](https://aws.amazon.com/iot-device-defender/)
+ [에 대한 CloudWatch Logs AWS IoT](cloud-watch-logs.md)

## 디바이스의 시계를 동기화 상태로 유지
<a name="device-clock"></a>

장치에서는 정확한 시간을 유지하는 것이 중요합니다. X.509 인증서에는 만료 날짜와 시간이 있습니다. 장치의 시계는 서버 인증서가 여전히 유효한지 확인하는 데 사용됩니다. 상업용 IoT 디바이스를 제작하는 경우 제품을 판매하기 전에 장기간 보관할 수 있습니다. 이 시간 동안 실시간 시계가 드리프트되고 배터리가 방전될 수 있으므로 출고 시 시간 설정으로는 충분하지 않습니다.

다시 말해 대부분의 시스템에서는 디바이스의 소프트웨어에 NTP(네트워크 시간 프로토콜) 클라이언트가 포함되어 있어야 합니다. 디바이스는 AWS IoT Core에 연결하려면 NTP 서버와 동기화될 때까지 기다려야 합니다. 이렇게 할 수 없으면 시스템은 후속 연결이 성공하도록 사용자가 디바이스의 시간을 설정할 수 있는 방법을 제공해야 합니다.

디바이스가 NTP 서버와 동기화되면 AWS IoT Core와의 연결을 열 수 있습니다. 허용되는 클럭 스큐 양은 연결로 수행하려는 작업에 따라 다릅니다.

## 서버 인증서 검증
<a name="validate-server-cert"></a>

디바이스가 상호 작용하는 첫 번째 방법은 보안 연결을 여는 AWS IoT 것입니다. 디바이스를에 연결할 때 다른 서버 가장이 AWS IoT 아닌와 대화하고 있는지 AWS IoT확인합니다 AWS IoT. 각 AWS IoT 서버는 `iot.amazonaws.com` 도메인에 대해 발급된 인증서로 프로비저닝됩니다. 이 인증서는 도메인의 자격 증명과 소유권을 확인한 신뢰할 수 있는 인증 기관에서 AWS IoT 에 발급되었습니다.

디바이스가 연결될 때 첫 번째 AWS IoT Core 작업 중 하나는 디바이스에 서버 인증서를 보내는 것입니다. 디바이스는 `iot.amazonaws.com`에 연결하는 것을 예상하고 있었는지, 해당 연결이 끝날 때 서버에 해당 도메인에 대한 신뢰할 수 있는 기관의 인증서가 있는지 확인할 수 있습니다.

TLS 인증서는 X.509 형식이며 조직의 이름, 위치, 도메인 이름 및 유효 기간과 같은 다양한 정보가 포함되어 있습니다. 유효 기간은 `notBefore` 및 `notAfter`라는 시간 값 페어로 지정됩니다. 와 같은 서비스는 서버 인증서에 제한된 유효 기간(예: 1년)을 AWS IoT Core 사용하고 이전 인증서가 만료되기 전에 새 인증서를 제공하기 시작합니다.

## 디바이스별로 단일 자격 증명 사용
<a name="cert-per-device"></a>

클라이언트별로 단일 자격 증명을 사용합니다. 디바이스는 일반적으로 X.509 클라이언트 인증서를 사용합니다. 웹 및 모바일 애플리케이션은 Amazon Cognito 자격 증명을 사용합니다. 이렇게 하면 세분화된 권한을 디바이스에 적용할 수 있습니다.

예를 들어, 전구와 온도 조절기라는 두 가지 스마트 홈 객체에서 상태 업데이트를 받는 휴대폰 디바이스로 구성된 애플리케이션을 가지고 있습니다. 전구는 배터리 수준 상태를 전송하고, 온도 조절기는 온도를 보고하는 메시지를 전송합니다.

AWS IoT 는 디바이스를 개별적으로 인증하고 각 연결을 개별적으로 처리합니다. 권한 부여 정책을 사용하여 세분화된 액세스 제어를 적용할 수 있습니다. 주제 공간에 게시하도록 허용하는 정책을 온도 조절기에 대해 정의할 수 있습니다. 다른 주제 공간에 게시하도록 허용하는 별도의 정책을 전구에 대해 정의할 수 있습니다. 마지막으로 온도 조절기와 전구에 대한 주제에 연결하고 구독하여 이러한 디바이스로에서만 메시지를 수신하도록 허용하는 정책을 모바일 앱에 대해 정의할 수 있습니다.

최소 권한의 원칙을 적용하고 디바이스별 권한을 최대한 좁은 범위로 줄입니다. 모든 디바이스 또는 사용자는에 알려진 클라이언트 ID로만 연결하고 식별되고 고정된 주제 세트를 게시하고 구독할 수 AWS IoT 있는 AWS IoT 정책이 있어야 합니다.

## 백업 AWS 리전 으로 두 번째 사용
<a name="use-second-region"></a>

데이터 사본을 백업 AWS 리전 으로 1초에 저장하는 것이 좋습니다. 에 [대한 재해 복구 AWS IoT](https://aws.amazon.com/solutions/implementations/disaster-recovery-for-aws-iot/)라는 AWS 솔루션을 더 이상 사용할 수 없습니다. 연결된 [GitHub 라이브러리](https://github.com/awslabs/disaster-recovery-for-aws-iot)는 계속 액세스할 수 있지만 2023년 7월에 AWS 사용되지 않으며 더 이상 유지 관리 또는 지원을 제공하지 않습니다. 자체 솔루션을 구현하거나 추가 지원 옵션을 알아보려면 [AWS에 문의](https://aws.amazon.com/contact-us/)를 참조하세요. 계정과 연결된 AWS 기술 계정 관리자가 있는 경우 해당 계정에 문의하여 도움을 받으세요.

## 정시 프로비저닝 사용
<a name="use-jitp"></a>

각 디바이스를 수동으로 생성하고 프로비저닝하는 것은 시간이 많이 걸릴 수 있습니다.는 디바이스를 처음 연결할 때 프로비저닝할 템플릿을 정의하는 방법을 AWS IoT 제공합니다 AWS IoT. 자세한 내용은 [JIT 프로비저닝](jit-provisioning.md) 단원을 참조하십시오.

## AWS IoT Device Advisor 테스트를 실행할 수 있는 권한
<a name="device-advisor-perms"></a>

다음 정책 템플릿은 AWS IoT Device Advisor 테스트 사례를 실행하는 데 필요한 최소 권한 및 IAM 엔터티를 보여줍니다. *your-device-role-arn*을 [사전 조건](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-workflow.html#device-advisor-workflow-prereqs)에서 생성한 디바이스 역할 Amazon 리소스 이름(ARN)으로 바꿉니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iot:us-east-1:123456789012:thinggroup/your-thing-group",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "iotdeviceadvisor.amazonaws.com"
            }
        }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke*",
                "iam:ListRoles",
                "iot:Connect",
                "iot:CreateJob",
                "iot:DeleteJob",
                "iot:DescribeCertificate",
                "iot:DescribeEndpoint",
                "iotjobsdata:DescribeJobExecution",
                "iot:DescribeJob",
                "iot:DescribeThing",
                "iotjobsdata:GetPendingJobExecutions",
                "iot:GetPolicy",
                "iot:ListAttachedPolicies",
                "iot:ListCertificates",
                "iot:ListPrincipalPolicies",
                "iot:ListThingPrincipals",
                "iot:ListThings",
                "iot:Publish",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution",
                "iot:UpdateThingShadow",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:PutRetentionPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "iotdeviceadvisor:*",
            "Resource": "*"
        }
    ]
}
```

## Device Advisor에 대한 교차 서비스 혼동된 대리자 예방
<a name="cross-service-confused-deputy-prevention-DA"></a>

혼동된 대리자 문제는 작업을 수행할 권한이 없는 엔터티가 권한이 더 많은 엔터티에게 작업을 수행하도록 강요할 수 있는 보안 문제입니다. 에서 AWS교차 서비스 가장은 혼동된 대리자 문제를 초래할 수 있습니다. 교차 서비스 가장은 한 서비스(*직접 호출하는 서비스*)가 다른 서비스(*직접 호출되는 서비스*)를 직접 호출할 때 발생할 수 있습니다. 직접 호출하는 서비스는 다른 고객의 리소스에 대해 액세스 권한이 없는 방식으로 작동하게 권한을 사용하도록 조작될 수 있습니다. 이를 방지하기 위해는 계정의 리소스에 대한 액세스 권한이 부여된 서비스 보안 주체를 사용하여 모든 서비스에 대한 데이터를 보호하는 데 도움이 되는 도구를 AWS 제공합니다.

Device Advisor가 리소스에 다른 서비스를 제공하는 권한을 제한하려면 리소스 정책에서 [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를 사용해야 합니다.

`aws:SourceArn`의 값은 스위츠 정의 리소스의 ARN이어야 합니다. 스위트 정의 리소스는 Device Advisor를 사용하여 생성한 테스트 스위트를 나타냅니다.

혼동된 대리인 문제로부터 보호하는 가장 효과적인 방법은 리소스의 전체 ARN이 포함된 `aws:SourceArn`글로벌 조건 컨텍스트 키를 사용하는 것입니다. 리소스의 전체 ARN을 모를 경우 또는 여러 리소스를 지정하는 경우, ARN의 알 수 없는 부분에 대해 와일드카드(`*`)를 포함한 `aws:SourceArn`전역 조건 컨텍스트 키를 사용합니다. 예: `arn:aws:iotdeviceadvisor:*:account-id:suitedefinition/*` 

다음 예는 Device Advisor에서 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 사용하여 혼동된 대리자 문제를 방지하는 방법을 보여줍니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "ConfusedDeputyPreventionExamplePolicy",
        "Effect": "Allow",
        "Principal": {
            "Service": "iotdeviceadvisor.amazonaws.com"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
            "ArnLike": {
                "aws:SourceArn": "arn:aws:iotdeviceadvisor:us-east-1:123456789012:suitedefinition/ygp6rxa3tzvn"
        },
            "StringEquals": {
                "aws:SourceAccount": "123456789012"
        }
        }
    }
}
```

## AWS 교육 및 인증
<a name="iot-security-training"></a>

 AWS IoT 보안의 주요 개념인 [AWS IoT Security Primer](https://www.aws.training/Details/Curriculum?id=42304)에 대해 알아보려면 다음 과정을 수강하세요.