AWS IoT Core 자격 증명 공급자를 사용하여 AWS 서비스에 직접 호출 권한 부여하기 - AWS IoT Core

AWS IoT Core 자격 증명 공급자를 사용하여 AWS 서비스에 직접 호출 권한 부여하기

디바이스는 TLS 상호 인증 프로토콜을 사용하여 AWS IoT Core에 연결할 때 X.509 인증서를 사용할 수 있습니다. 다른 AWS 서비스는 인증서 기반 인증을 지원하지 않지만 AWS 서명 버전 4 형식에서는 AWS 자격 증명을 사용하여 호출할 수 있습니다. 서명 버전 4 알고리즘에서는 일반적으로 호출자가 액세스 키 ID와 비밀 액세스 키를 가지고 있어야 합니다. AWS IoT Core에는 기본 제공 X.509 인증서를 고유한 디바이스 자격 증명으로 사용하여 AWS 요청을 인증할 수 있도록 하는 자격 증명 공급자가 있습니다. 따라서 디바이스에 액세스 키 ID와 보안 액세스 키를 저장할 필요가 없습니다.

이 자격 증명 공급자는 X.509 인증서를 사용하여 호출자를 인증한 후 권한이 제한된 임시 보안 토큰을 발급합니다. 이 토큰을 사용하여 AWS의 모든 요청에 서명을 하고 인증할 수 있습니다. 이 같은 방식으로 AWS 요청을 인증하려면 AWS Identity and Access Management(IAM) 역할을 생성하고 구성하여 적절한 IAM 정책을 이 역할에 연결함으로써 자격 증명 공급자가 사용자를 대신하여 그 역할을 수임할 수 있게 해야 합니다. AWS IoT Core 및 IAM 에 대한 자세한 내용은 AWS IoT의 Identity and Access Management 단원을 참조하세요.

AWS IoT를 사용하려면 디바이스가 전송 계층 보안(TLS) 프로토콜로 SNI(서버 이름 표시) 확장을 전송하고 host_name 필드에 전체 엔드포인트 주소를 제공해야 합니다. host_name 필드에는 호출하는 엔드포인트가 포함되어야 하며 다음과 같아야 합니다.

  • aws iot describe-endpoint --endpoint-type iot:CredentialProvider에서 반환한 endpointAddress

올바른 host_name 값 없이 디바이스에서 시도하는 연결은 실패합니다.

다음 다이어그램은 자격 증명 공급자의 워크플로우를 보여줍니다.


                AWS IoT Core 자격 증명 공급자 워크플로
  1. AWS IoT Core 디바이스가 HTTPS 요청을 통해 자격 증명 공급자에게 보안 토큰을 요청합니다. 이 요청에는 인증을 위한 디바이스 X.509 인증서가 포함되어 있습니다.

  2. 자격 증명 공급자가 이 요청을 AWS IoT Core 인증 및 권한 부여 모듈로 전달하여 인증서를 검증하고 디바이스가 보안 토큰을 요청할 권한이 있는지 확인합니다.

  3. 인증서가 유효하고 보안 토큰을 요청할 권한이 있는 경우, AWS IoT Core 인증 및 권한 부여 모듈이 성공을 반환합니다. 그렇지 않은 경우, 디바이스에 예외를 전송합니다.

  4. 인증서 검증에 성공하고 나면 자격 증명 공급자가 AWS Security Token Service(AWS STS)을(를) 호출하여 사용자가 생성한 IAM 역할을 수임합니다.

  5. AWS STS이(가) 자격 증명 공급자에게 권한이 제한된 임시 보안 토큰을 반환합니다.

  6. 자격 증명 공급자가 이 보안 토큰을 디바이스로 반환합니다.

  7. 디바이스가 이 보안 토큰을 사용하여 AWS 서명 버전 4를 이용한 AWS 요청에 서명합니다.

  8. 요청된 서비스가 서명을 검증하고 사용자가 자격 증명 공급자를 위해 생성한 IAM 역할에 연결된 액세스 정책들에 대한 요청에 권한을 부여하기 위해 IAM을 호출합니다.

  9. IAM이 서명을 성공적으로 검증하고 요청에 권한을 부여하면 요청은 성공합니다. 그렇지 않은 경우, IAM이 예외를 전송합니다.

다음 단원에서는 인증서를 사용하여 보안 토큰을 얻는 방법을 설명합니다. 이 단원은 사용자가 이미 디바이스를 등록했고 이 디바이스에 사용자의 인증서를 생성하여 활성화했다는 가정하에 작성되었습니다.

인증서를 사용하여 보안 토큰을 얻는 방법

  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:ThingNamecredentials-iot:ThingTypeName을(를) context 변수로 추가합니다. 디바이스가 요청에 사물 이름을 제시하지 않더라도 자격 증명 공급자는 context 변수로 credentials-iot:AwsCertificateId를 제공합니다. x-amzn-iot-thingname HTTP 요청 헤더의 값으로 그 사물 이름을 전달하세요.

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

  2. 다음 단계(역할 별칭 생성)를 수행하는 사용자가 새로 생성된 역할을 AWS IoT Core로 전달할 권한을 가지고 있는지 확인합니다. 다음 정책은 AWS 사용자에게 iam:GetRoleiam:PassRole 권한을 모두 부여합니다. iam:GetRole 권한은 방금 생성한 역할에 대한 정보를 사용자가 가져올 수 있도록 허용합니다. iam:PassRole 권한은 사용자가 역할을 다른 AWS 서비스로 전달할 수 있도록 허용합니다.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your AWS 계정 id:role/your role name" } }
  3. AWS IoT Core 역할 별칭을 생성합니다. AWS 서비스를 직접 호출하는 디바이스는 AWS IoT Core에 연결할 때 사용할 역할 ARN을 알고 있어야 합니다. 역할 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 역할의 최대 세션 기간보다 작거나 같아야 합니다.

    이 API에 대한 자세한 내용은 CreateRoleAlias 단원을 참조하세요.

  4. 디바이스 인증서에 정책을 연결합니다. 디바이스 인증서에 연결된 정책은 역할을 위임할 수 있는 디바이스 권한을 부여해야 합니다. 다음의 예와 같이 역할 별칭에 iot:AssumeRoleWithCertificate 작업 권한을 부여하면 됩니다.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"iot:AssumeRoleWithCertificate", "Resource":"arn:aws:iot:your region:your_aws_account_id:rolealias/your role alias" } ] }
  5. 자격 증명 공급자에게 HTTPS 요청을 하여 보안 토큰을 얻습니다. 다음 정보를 제공합니다.

    • Certificate: 이 요청은 TLS 상호 인증을 통한 HTTP 요청이므로 이 요청 중에 인증서와 프라이빗 키를 클라이언트에 제공해야 합니다. 인증서를 AWS IoT Core에 등록할 때 사용한 것과 동일한 인증서 및 프라이빗 키를 사용합니다.

      디바이스가 AWS IoT Core와 통신하도록(이를 가장하는 서비스와 통신하지 않도록) 하려면 서버 인증을 참조하고, 링크를 따라 적절한 CA 인증서를 다운로드한 다음, 이 인증서를 디바이스에 복사합니다.

    • RoleAlias: 자격 증명 공급자를 위해 생성한 역할 별칭의 이름입니다.

    • 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 단원을 참조하세요.

    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 클라이언트를 사용할 수 있습니다.

    curl --cert your certificate --key your device certificate key pair -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 서비스에 대한 요청에 서명할 수 있습니다. 전체 데모는 AWS 보안 블로그AWS IoT 자격 증명 공급자를 사용하여 디바이스에서 하드 코딩된 AWS 자격 증명을 사용할 필요를 없애는 방법 블로그 게시물을 참조하세요.