

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS KMS 用于加密静态的 CloudFormation Hook 结果的密钥策略和权限
<a name="hooks-kms-key-policy"></a>

本主题介绍在指定客户托管 AWS KMS 密钥以加密 [GetHookResult](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_GetHookResult.html)API 中可用的 Hooks 注释数据时，如何设置所需的密钥策略和权限。

**注意**  
CloudFormation Hooks 不需要额外的授权即可使用默认值 AWS 拥有的密钥 来加密账户中的注释数据。

**Topics**
+ [概述](#hooks-kms-overview)
+ [使用加密上下文控制对客户托管密钥的访问](#hooks-encryption-context-security)
+ [客户托管的 KMS 密钥策略](#hooks-policy-example-cmk-access)
+ [`SetTypeConfiguration`API 的 KMS 权限](#hooks-policy-example-settypeconfiguration-permissions)
+ [`GetHookResult`API 的 KMS 权限](#hooks-policy-example-gethookresult-permissions)

## 概述
<a name="hooks-kms-overview"></a>

以下内容 AWS KMS keys 可用于加密 Hook 注释数据：
+ [AWS 拥有的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)— 默认情况下， CloudFormation AWS 拥有的密钥 使用加密数据。您无法查看、管理 AWS 拥有的密钥、使用或审核其使用情况。但是，您不必执行显式配置来保护用于加密数据的密钥。 AWS 拥有的密钥 是免费提供的（没有月费或使用费）。除非要求您审核或控制保护注释数据的加密密钥，否则 AWS 拥有的密钥 不妨选择一个。
+ [客户托管密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) — CloudFormation 支持使用您创建、拥有和管理的对称客户托管密钥，在现有 AWS 拥有的密钥密钥的基础上添加第二层加密。 AWS KMS 需收费。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。要管理您的密钥，请使用[AWS KMS 控制台](https://console.aws.amazon.com/kms)中的 AWS Key Management Service (AWS KMS) AWS CLI、或 AWS KMS API。有关更多信息，请参见[AWS Key Management Service 开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/)。

您可以在创建和更新 Hook 时配置客户托管密钥。当您提供客户托管密钥时， CloudFormation 使用此密钥在存储注释数据之前对其进行加密。以后在 `GetHookResult` API 操作期间访问注释数据时， CloudFormation 会自动对其进行解密。有关为 Hook 配置加密密钥的信息，请参阅[挂钩配置架构语法参考](hook-configuration-schema.md)。

**重要**  
请注意，指定客户托管密钥的`KmsKeyId`选项目前仅在您使用配置挂钩时可用。 AWS CLI 

## 使用加密上下文控制对客户托管密钥的访问
<a name="hooks-encryption-context-security"></a>

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 密钥策略
<a name="hooks-policy-example-cmk-access"></a>

创建客户托管密钥时，必须定义其密钥策略以允许 CloudFormation Hooks 服务执行 AWS KMS 操作。要使用以下密钥策略，请{{placeholder values}}用您自己的信息替换。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnableIAMUserDescribeKey",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{123456789012}}: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::{{123456789012}}: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:123456789012": "{{123456789012}}"
        },
        "ArnLike": {
          "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:{{123456789012}}:hook/*"
        }
      }
    },
    {
      "Sid": "EnableIAMUserDecrypt",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{123456789012}}: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": "{{123456789012}}"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:cloudformation:*:{{123456789012}}:hook/*"
        }
      }
    },
    {
      "Sid": "AllowHooksService",
      "Effect": "Allow",
      "Principal": {
        "Service": "hooks.cloudformation.amazonaws.com"
      },
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "{{123456789012}}",
          "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com",
          "kms:EncryptionContext:aws:cloudformation:123456789012": "{{123456789012}}"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:cloudformation:*:{{123456789012}}:hook/*",
          "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:{{123456789012}}: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条件密钥](https://docs.aws.amazon.com/kms/latest/developerguide/least-privilege.html#least-privilege-source-arn)。

**重要**  
挂钩执行角色不需要 AWS KMS 权限。 CloudFormation Hooks 服务主体执行所有 AWS KMS 操作。

## `SetTypeConfiguration`API 的 KMS 权限
<a name="hooks-policy-example-settypeconfiguration-permissions"></a>

在 [SetTypeConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetTypeConfiguration.html)API 调用期间， CloudFormation 验证用户使用指定密 AWS KMS 钥加密注释数据的权限。将以下 IAM 策略添加到将使用 `SetTypeConfiguration` API 配置加密的用户或角色。将 {{placeholder values}} 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
  "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:123456789012": "{{123456789012}}"
        },
        "ArnLike": {
          "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:{{123456789012}}:hook/*"
        }
      }
    }
  ]
}
```

------

## `GetHookResult`API 的 KMS 权限
<a name="hooks-policy-example-gethookresult-permissions"></a>

要调[GetHookResult](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_GetHookResult.html)用使用您的客户托管密钥的 Hook，用户必须拥有该密钥的`kms:Decrypt`权限。向要调用的用户或角色添加以下 IAM 策略`GetHookResult`。`{{arn:aws:kms:us-east-1:123456789012:key/abc-123}}`替换为客户托管密钥的 ARN。

------
#### [ JSON ]

****  

```
{
  "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}}"
    }
  ]
}
```

------