암호화된 볼륨이 연결된 상태로 인스턴스를 시작하면 “시작 시 클라이언트 오류(client error on launch)”라는 오류가 발생하며 인스턴스가 즉시 중지됩니다.

최종 업데이트 날짜: 2020년 9월 25일

암호화된 볼륨이 연결된 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 시작했지만 인스턴스가 시작되지 않습니다. 인스턴스가 대기 상태에서 중지 상태로 즉시 전환됩니다. AWS 명령줄 인터페이스(AWS CLI) 명령 describe-instances를 실행했는데 다음 오류가 발생합니다.

...
"StateReason": {
  "Code": "Client.InternalError"
  "Message": "Client.InternalError: Client error on launch"
},
...

이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

이 문제는 다음의 경우에 암호화된 볼륨이 연결된 EC2 인스턴스에서 발생합니다.

  • 인스턴스를 시작하는 AWS Key Management Service(AWS KMS) 또는 AWS Identity and Access Management(IAM) 사용자에게 필요한 권한이 없습니다.
  • KMS 키 사용은 SourceIp 조건 키에 의해 제한됩니다.

CMK(고객 마스터 키)를 복호화하려면 IAM 사용자에게 AWS KMS에 대한 권한이 있어야 합니다.

CMK를 복호화하기 위한 액세스를 허용하려면 IAM 정책 또는 권한 부여와 함께 키 정책을 사용해야 합니다. IAM 정책만으로는 CMK에 대한 액세스를 허용하기에 충분하지 않지만 CMK의 키 정책과 함께 사용할 수 있습니다.

기본적으로 KMS 키는 루트 계정에만 액세스 권한을 부여합니다. IAM 사용자 또는 역할에 EC2 전체 권한이 제공되는 경우 AWS KMS 권한은 CMK의 주요 정책에 대한 액세스 권한을 명시적으로 부여해야 합니다.

해결 방법

IAM 보안 주체가 AWS KMS API를 호출하도록 허용하는 IAM 정책 생성

1    IAM 콘솔을 열고 [정책(Policies)]을 선택한 다음 [정책 생성(Create Policy)]을 선택합니다.

2    [JSON] 탭을 선택한 다음 이 정책을 복사하여 붙여 넣습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:RevokeGrant",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:DescribeKey",
                "kms:CreateGrant",
                "kms:ListGrants"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}

3    [정책 검토(Review policy)]를 선택합니다.

4    [이름(Name)]에 의미 있는 이름을 입력한 다음 [정책 생성(Create policy)]을 선택합니다.

5    4단계에서 생성한 정책을 선택합니다.

6    [정책 사용(Policy usage)] 탭을 선택한 다음 [연결(Attach)]을 선택합니다.

7    [이름(Name)]에서 CMK에 대한 권한을 부여할 IAM 엔터티를 선택한 다음 [정책 연결(Attach policy)]을 선택합니다.

IAM 보안 주체에 CMK에 대한 명시적 액세스 권한 부여

1    AWS KMS 콘솔을 열고 [고객 관리형 키(Customer managed keys)]를 선택합니다.

2    [키 ID(Key ID)]에서 키 ID를 선택합니다.

3    [키 사용자(Key users)]에서 [추가(Add)]를 선택합니다.

4    [이름(Name)]에서 IAM 사용자 또는 역할을 선택한 다음 [추가(Add)]를 선택합니다.

참고: 기본 키 정책 대신 사용자 지정 키 정책을 사용하는 경우 CMK가 다음 권한을 명시적으로 부여해야 합니다.

{
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                "arn:aws:iam::123456789012:role/MyRoleName"
                    "arn:aws:iam::123456789012:user/MyUserName",
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
            "arn:aws:iam::123456789012:role/MyRoleName"
                    "arn:aws:iam::123456789012:user/MyUserName",
                ]
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }

IP 주소 조건 사용

AWS KMS를 사용하여 통합 서비스에서 데이터를 보호하는 경우 IP 주소 조건 연산자를 지정하거나 동일한 액세스 정책 문에서 aws:SourceIp 조건 키를 지정할 때 주의하십시오. 암호화된 Amazon Elastic Block Store(Amazon EBS) 볼륨을 Amazon EC2 인스턴스에 연결하면 Amazon EC2가 AWS KMS에 볼륨의 암호화된 데이터 키를 복호화하라는 요청을 보냅니다. 이 요청은 사용자의 IP 주소가 아니라 EC2 인스턴스와 연결된 IP 주소에서 발생합니다. 따라서 SourceIp 조건이 설정되어 있고 인스턴스가 실패하면 복호화 요청이 거부됩니다.

kms:ViaService 조건 키를 사용하십시오. AWS KMS는 사용자를 대신하여 해당 서비스의 상호 작용을 허용합니다. 보안 주체에게 CMK 및 통합 서비스를 사용할 권한이 있어야 합니다. 자세한 내용은 kms:ViaService 조건 키 제한을 참조하십시오.

참고: 로그온한 사용자가 있는 EC2 인스턴스는 이 조건과 상호 작용할 수 없으며 사용자를 대신하는 서비스만 이 조건과 상호 작용할 수 있습니다. 이 상호 작용은 사용자가 검토할 수 있도록 AWS CloudTrail 로그에 기록됩니다.

"userIdentity": {
  "sessionContext": {
    "sessionIssuer": {
      "accountId": "450822418798",
      "principalId": "450822418798:aws:ec2-infrastructure",
      "userName": "aws:ec2-infrastructure",
      "arn": "arn:aws:iam::450822418798:role/aws:ec2-infrastructure",
      "type": "Role"
     },
…
    "eventType": "AwsApiCall",
    "@log_group": "CloudTrail/AllRegionLogGroup",
    "awsRegion": "eu-west-1",
    "requestParameters": {
      "encryptionContext": {
        "aws:ebs:id": "vol-0ca158925aa9c1883"
      }    
},

이 예에서는 API 호출에 대한 CloudTrail 항목이 AWS KMS에 생성됩니다. 이는 특정 IP 주소가 아닌 Amazon EC2 인프라에서 호출됩니다. AWS KMS가 Amazon EC2와 상호 작용하도록 허용하는 정책을 사용자에게 추가하면 API 호출이 완료될 수 있습니다.