本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS KMS 用于加密静态的 CloudFormation Hook 结果的密钥策略和权限
本主题介绍在指定客户托管 AWS KMS 密钥以加密 GetHookResultAPI 中可用的 Hooks 注释数据时,如何设置所需的密钥策略和权限。
注意
CloudFormation Hooks 不需要额外的授权即可使用默认值 AWS 拥有的密钥 来加密账户中的注释数据。
概述
以下内容 AWS KMS keys 可用于加密 Hook 注释数据:
-
AWS 拥有的密钥— 默认情况下, CloudFormation AWS 拥有的密钥 使用加密数据。您无法查看、管理 AWS 拥有的密钥、使用或审核其使用情况。但是,您不必执行显式配置来保护用于加密数据的密钥。 AWS 拥有的密钥 是免费提供的(没有月费或使用费)。除非要求您审核或控制保护注释数据的加密密钥,否则 AWS 拥有的密钥 不妨选择一个。
-
客户托管密钥 — CloudFormation 支持使用您创建、拥有和管理的对称客户托管密钥,在现有 AWS 拥有的密钥密钥的基础上添加第二层加密。 AWS KMS 需收费。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的创建密钥。要管理您的密钥,请使用AWS KMS 控制台
中的 AWS Key Management Service (AWS KMS) AWS CLI、或 AWS KMS API。有关更多信息,请参见AWS Key Management Service 开发人员指南。
您可以在创建和更新 Hook 时配置客户托管密钥。当您提供客户托管密钥时, CloudFormation 使用此密钥在存储注释数据之前对其进行加密。以后在 GetHookResult API 操作期间访问注释数据时, CloudFormation 会自动对其进行解密。有关为 Hook 配置加密密钥的信息,请参阅挂钩配置架构语法参考。
重要
请注意,指定客户托管密钥的KmsKeyId选项目前仅在您使用配置挂钩时可用。 AWS CLI
使用加密上下文控制对客户托管密钥的访问
CloudFormation Hooks 在每个注释存储和检索操作中自动包含加密上下文。这允许您在密钥策略中设置加密上下文条件,以确保密钥只能用于特定的 Hook:
-
kms:EncryptionContext:aws:cloudformation:hooks:service— 确保该密钥仅由 CloudFormation Hooks 服务使用。 -
kms:EncryptionContext:aws:cloudformation:account-id— 通过匹配您的 AWS 账户 ID 来防止跨账户使用密钥。 -
kms:EncryptionContext:aws:cloudformation:arn— 使用 ARN 模式将使用限制为特定 Hook。
这些条件通过加密方式将加密数据绑定到特定的 Hook 上下文,从而提供额外的保护,防止混淆的副手攻击。
客户托管的 KMS 密钥政策
创建客户托管密钥时,必须定义其密钥策略以允许 CloudFormation Hooks 服务执行 AWS KMS 操作。要使用以下密钥策略,请placeholder values用您自己的信息替换。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableIAMUserDescribeKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudformation.us-east-1.amazonaws.com" } } }, { "Sid": "EnableIAMUserGenerateDataKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:GenerateDataKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudformation.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:account-id": "111122223333" }, "StringLike": { "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:111122223333:hook/*" } } }, { "Sid": "EnableIAMUserDecrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudformation.us-east-1.amazonaws.com" } } }, { "Sid": "AllowHooksServiceDescribeKey", "Effect": "Allow", "Principal": { "Service": "hooks.cloudformation.amazonaws.com" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" }, "StringLike": { "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:hook/*" } } }, { "Sid": "AllowHooksService", "Effect": "Allow", "Principal": { "Service": "hooks.cloudformation.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:account-id": "111122223333" }, "StringLike": { "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:hook/*", "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:111122223333:hook/*" } } } ] }
此策略向 IAM 角色(前三个语句)和 CloudFormation Hooks 服务(最后两个语句)授予权限。kms:ViaService条件密钥可确保 KMS 密钥只能通过使用 CloudFormation,从而防止直接调用 KMS API。关键操作是:
-
kms:DescribeKey— 验证密钥属性和元数据。此操作在单独的语句中,因为它不能与加密上下文条件一起使用。 -
kms:GenerateDataKey— 生成数据加密密钥,用于在存储之前加密注释。此操作包括限定范围的访问控制的加密上下文条件。 -
kms:Decrypt— 解密先前加密的注释数据。对于 IAM 角色,这包括kms:ViaService条件。对于服务主体,这包括加密上下文条件。
aws:SourceAccount和aws:SourceArn条件键提供主要保护,防止混乱的副手攻击。加密上下文条件提供了额外的验证层。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的使用aws:SourceArn或aws:SourceAccount条件密钥。
重要
挂钩执行角色不需要 AWS KMS 权限。 CloudFormation Hooks 服务主体执行所有 AWS KMS 操作。
SetTypeConfigurationAPI 的 KMS 权限
在 SetTypeConfigurationAPI 调用期间, CloudFormation 验证用户使用指定密 AWS KMS 钥加密注释数据的权限。将以下 IAM 策略添加到将使用 SetTypeConfiguration API 配置加密的用户或角色。替换为客户托管密钥的 ARN。arn:aws:kms:us-east-1:123456789012:key/abc-123
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cloudformation:SetTypeConfiguration", "Resource": "*" }, { "Effect": "Allow", "Action": "kms:DescribeKey", "Resource": "arn:aws:kms:us-east-1:123456789012:key/abc-123" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "arn:aws:kms:us-east-1:123456789012:key/abc-123", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:account-id": "123456789012" }, "StringLike": { "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:123456789012:hook/*" } } } ] }
GetHookResultAPI 的 KMS 权限
要调GetHookResult用使用您的客户托管密钥的 Hook,用户必须拥有该密钥的kms:Decrypt权限。向要调用的用户或角色添加以下 IAM 策略GetHookResult。替换为客户托管密钥的 ARN。arn:aws:kms:us-east-1:123456789012:key/abc-123
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cloudformation:GetHookResult", "Resource": "*" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:us-east-1:123456789012:key/abc-123" } ] }