AWS Key Management Service(AWS KMS) 키를 생성하고 AWS CloudFormation을 통해 AWS KMS 키 정책을 정의할 때 키 생성에 실패합니다.
간략한 설명
키를 생성하고 정의하려고 할 때 다음과 같은 오류 메시지가 표시될 수 있습니다.
"The new key policy will not allow you to update the key policy in the future."
키 정책에 지정된 보안 주체는 CreateKey 및 PutKeyPolicy API 작업을 수행하는 데 필요한 권한이 있어야 합니다.
중요: 생성한 키 정책이 적절한 AWS Identity and Access Management(IAM) 보안 주체가 AWS KMS 키를 관리할 수 있도록 허용해야 합니다.
해결 방법
참고: CloudFormation 스택을 생성하면 CloudFormation이 IAM 역할을 맡아 CreateStack API 작업을 수행합니다. 또한 CloudFormation은 이 역할을 사용하여 사용자가 CloudFormation 템플릿에 지정한 리소스를 생성합니다.
AWS KMS 키 생성
다음 단계를 완료하십시오.
- CloudFormation 콘솔을 엽니다.
- AWS::KMS::Key 리소스를 사용하여 AWS KMS 키를 생성합니다.
- 키를 관리하는 데 사용할 수 있는 IAM 사용자 또는 역할을 선택합니다.
- kms:PutKeyPolicy 작업을 사용하여 Allow 명령문에 관리 보안 주체를 포함합니다.
- BypassPolicyLockoutSafetyCheck 리소스 파라미터를 사용합니다.
다음 예에서 KeyAdmin 역할은 정책 형식이 다음과 같을 때 키 정책을 수정할 수 있습니다.
{ "Type": "AWS::KMS::Key",
"Properties": {
"Description": "A sample key",
"KeyPolicy": {
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/KeyAdmin"
},
"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:role/KeyUser"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
]
}
}
}
중요: 정책에 유효한 보안 주체가 지정되지 않은 경우 BypassPolicyLockoutSafetyCheck로 인해 관리 불가능한 키가 생성될 수 있습니다. 정책에서 유효한 보안 주체를 사용하는지 확인하십시오.
보안 주체 키 관리자 설정
페더레이션형 ID 공급자에서 보안 주체 키 관리자를 설정하려면 역할 세션 Amazon 리소스 이름(ARN)을 사용하십시오. 또한 외부 ID 공급자가 제공하는 특정 관리자의 역할 수임 세션을 키 관리의 보안 주체로 사용할 수 있습니다.
정책 설명 예시:
"Principal": { "AWS": "arn:aws:sts::123456789012:assumed-role/FederatedAccess/FederatedUsername" }
참고: FederatedAccess를 IAM 역할로, FederatedUsername을 사용자 이름으로 바꾸십시오.
CloudFormation 서비스 역할을 사용하여 스택을 생성할 때는 보안 주체를 서비스 역할 ARN으로 설정합니다.
정책 설명 예시:
"Principal": { "AWS": "arn:aws:iam::123456789012:role/ServiceRoleName" }
참고: ServiceRoleName을 서비스 역할로 바꾸십시오.
AWS 계정 루트 사용자를 보안 주체 키 관리자로 설정하려면 정책에 다음 설명을 포함하십시오.
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
참고: 주요 키 관리자를 루트 ARN으로 설정하면 충분한 IAM 권한을 가진 계정의 모든 보안 주체가 키를 수정할 수 있습니다.
키 정책에 kms:PutKeyPolicy 권한을 가진 보안 주체가 있으면 CloudFormation을 사용하여 AWS KMS 키를 생성할 수 있습니다. CloudFormation 템플릿에서 BypassPolicyLockoutSafetyCheck 속성을 true로 설정하십시오.
예제 템플릿:
myKMSKey: Type: 'AWS::KMS::Key'
Properties:
Description: This key is managed by the KeyAdmin role
BypassPolicyLockoutSafetyCheck: true
KeyPolicy:
Version: 2012-10-17
Id: key-policy-1
Statement:
- Sid: Allow access for Key Administrators
Effect: Allow
Principal:
AWS: 'arn:aws:iam::123456789012:role/KeyAdmin'
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:role/KeyUser'
Action:
- 'kms:DescribeKey'
- 'kms:Encrypt'
- 'kms:Decrypt'
- 'kms:ReEncrypt*'
- 'kms:GenerateDataKey'
- 'kms:GenerateDataKeyWithoutPlaintext'
Resource: '*'
EnableKeyRotation: true
PendingWindowInDays: 30
관련 정보
AWS Key Management Service
KMS 키 액세스 및 권한