AWS KMS 키를 생성하고 AWS CloudFormation을 사용하여 AWS Key Management Service(AWS KMS) 키 정책을 정의하면 AWS KMS 키 생성이 실패합니다. 그리고 'The new key policy will not allow you to update the key policy in the future(새 키 정책으로 인해 향후 키 정책을 업데이트할 수 없습니다)' 오류 메시지가 표시됩니다.
간략한 설명
AWS KMS는 키 정책이 생성될 때 안전 점검을 수행합니다. 한 가지 안전 점검은 키 정책의 보안 주체에 CreateKey API 및 PutKeyPolicy API를 수행하는 데 필요한 권한이 있는지 확인합니다. 이 점검은 AWS KMS 키가 관리 불가능한 상태(즉, 키 정책을 변경하거나 키를 삭제할 수 없음)가 될 가능성을 없애줍니다.
중요: 생성한 키 정책에 따라 현재 사용자가 AWS KMS 키를 관리할 수 있도록 허용해야 합니다.
해결 방법
AWS CloudFormation 스택을 생성하면 AWS Identity and Access Management(IAM) 사용자 또는 역할을 사용하여 CreateStack API를 호출합니다. 이 사용자는 AWS CloudFormation 템플릿에 지정된 리소스를 생성하는 데도 사용됩니다.
1. AWS CloudFormation을 사용하여 AWS KMS 키를 생성할 때는 AWS KMS 키의 주요 관리자 보안 주체와 동일한 IAM 사용자 또는 역할을 선택하세요.
다음 예시에서, AWS CloudFormation 스택은 IAM 사용자 arn:aws:iam::123456789012:user/Alice가 생성합니다. 보안 주체는 키 관리자로 지정됩니다. 이제 IAM 사용자 "Alice"는 키 정책이 생성된 후에 키 정책을 수정할 수 있습니다.
"Type" : "AWS::KMS::Key",
"Properties" : {
"Description" : "A sample key",
"KeyPolicy" : {
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Allow administration of the key",
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789012:user/Alice" },
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789012:user/Bob" },
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
]
}
}
}
2. 보안 주체 키 관리자를 설정하거나, AWS 계정 루트 사용자를 보안 주체 키 관리자로 설정합니다.
보안 주체 키 관리자를 설정하려면 Amazon 리소스 이름(ARN)을 사용하세요.
SAML 또는 웹 페더레이션 사용자 계정으로 AWS CloudFormation 스택을 생성한 경우 보안 주체를 ARN에 대한 사용자의 수임 역할로 설정하세요. 예를 들면 다음과 같습니다.
"Principal": { "AWS": "arn:aws:sts::123456789012:assumed-role/FederatedAccess/FederatedUsername" }
참고: IAM 역할의 이름은 FederatedAccess이고, 연동 사용자 이름은 FederatedUsername입니다.
스택을 생성하는 데 AWS CloudFormation 서비스 역할을 사용하는 경우 보안 주체를 서비스 역할 ARN으로 설정합니다. 예를 들면 다음과 같습니다.
"Principal": { "AWS": "arn:aws:iam::123456789012:role/ServiceRoleName” }
참고: AWS CloudFormation 서비스 역할의 이름은 ServiceRoleName입니다.
AWS 계정 루트 사용자를 보안 주체 키 관리자로 설정하려면 다음 예를 참조하세요.
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
참고: 보안 주체 키 관리자가 루트 ARN으로 설정된 경우 올바른 권한이 있는지 확인하세요. AWS CloudFormation 스택을 생성하는 IAM 사용자, 역할 또는 서비스 역할에는 CreateKey 및 PutKeyPolicy API를 호출할 수 있는 IAM 권한이 있어야 합니다.
관련 정보
AWS Key Management Service
AWS KMS에 대한 인증 및 액세스 제어