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 KMS キーを管理するための適切な AWS Identity and Access Management (IAM) プリンシパルを許可していることを確認してください。
解決策
注: 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 key access and permissions (KMS キーへのアクセスとアクセス許可)