

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

# Amazon EventBridge 自定义事件总线的静态加密
<a name="eb-custom-bus-encryption"></a>

## 静态加密选项
<a name="eb-custom-bus-encryption-at-rest"></a>

默认情况下，Amazon Cu EventBridge stom Event Bus 会在服务器端加密所有静态数据，然后再将其写入存储：事件负载、事件元数据、订阅者筛选模式和订阅者目标配置。您无需配置任何内容、创建任何密钥或授予任何权限即可获得静态加密，而且这种默认加密不会产生任何额外费用。

默认情况下，您的数据使用**Amazon 自有密钥下的 256 位高级加密标准 (AES-256) 进行加密，该密钥**是为您 EventBridge 拥有和管理的 KMS 密钥。您无法查看、管理或使用此密钥，其使用情况也不会出现在您的 Amazon CloudTrail 日志中。 Amazon 自有密钥是免费的，不计入您账户中的 Amazon KMS 配额。 Amazon 拥有的密钥每月自动轮换。

有关更多信息，请参阅《*Amazon Key Management Service 开发人员指南*》中的 [Amazon 拥有密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html)。

或者，您可以选择使用您创建、拥有和管理的对称**客户托管 KMS 密钥**来加密事件总线。客户管理的密钥为您提供：
+ 完全控制密钥生命周期：密钥策略、轮换、禁用、删除。
+ CloudTrail 了解密钥的 EventBridge 使用情况。
+ 能够根据每个事件总线使用 KMS 密钥策略条件来确定访问范围。

客户托管密钥会产生 Amazon KMS 费用：密钥的月费，以及向其发出 KMS API 请求的费用。这些请求还会计入您账户中的 Amazon KMS 请求配额。由于 EventBridge 使用缓存的分支密钥在本地加密和解密事件（参见[自定义事件总线如何使用客户托管的 KMS 密钥进行静态加密](#eb-custom-bus-encryption-branch-key)），因此它的 KMS 请求量是每个缓存窗口每个事件总线的几次调用加上密钥轮换——它不会随着事件量而增长。有关详细信息，请参阅 [Amazon Key Management Service 定价](https://www.amazonaws.cn/kms/pricing/)。

## 使用自定义事件总线的客户托管 KMS 密钥对静态数据进行加密
<a name="eb-custom-bus-encryption-cmk"></a>

### 自定义事件总线如何使用客户托管的 KMS 密钥进行静态加密
<a name="eb-custom-bus-encryption-branch-key"></a>

**使用您的密钥加密的内容**（每条事件总线）：
+ 事件负载和事件元数据，在总线的保留期（1-365 天）内存储在总线的事件存储和每位订阅者的交付存储中。
+ 用户筛选器模式和目标配置，与总线的配置一起存储。

**未使用您的密钥加密的内容：**
+ 路由和查询 EventBridge 所需的资源标识符：总线名称、总线 ARN、账户 ID。
+ 订购 FIFO 传送的消息组 ID。避免在此字段中放置敏感数据。
+ 消息重复数据删除 ID。 EventBridge 将其存储为单向哈希。
+ 内部服务元数据：订阅匹配结果、序列号。

这些项目仍由底层存储服务进行静态加密，而不是由您的密钥加密。

**加密的工作原理。**在事件总线上配置客户托管密钥时， EventBridge 会为该总线创建**分支密钥**。分支密钥是中间密钥。它存储在服务管理的表中，该表由您的 KMS 密钥封装，遵循 Amazon Encryption SDK [分层密钥环](https://docs.amazonaws.cn/encryption-sdk/latest/developer-guide/use-hierarchical-keyring.html)。 EventBridge 使用分支密钥派生每个事件的数据加密密钥。因此，事件是在本地加密和解密的，每个事件无需调用 KMS：
+ 发布事件时，在向存储进行任何写入操作之前，使用总线的分支密钥 EventBridge 对其进行加密。
+ 当 EventBridge 传送事件时，它会解密该事件以进行过滤器评估和传送。
+ **EventBridge 将解密的事件发送给您的目标。**目的地的静态加密由目标服务负责。
+ 分支密钥在服务内存中最多可缓存 **15 分钟**。缓存到期后，`kms:Decrypt`对您的密钥 EventBridge 调用以再次解开分支密钥。
+ EventBridge 通过大约每 **30 天**创建一次新版本来轮换分支密钥。旧版本会保留，因此在总线的保留期内，以前写入的事件仍可读取。

**两条访问路径。** EventBridge 正好以两种方式访问您的密钥。对于同步操作和授权检查，它使用**您的 API 调用中转发的凭证**。对于异步工作（事件传送、分支密钥生命周期），它充当**`events.amazonaws.com`服务主体**，因为您的 API 调用已完成且您的凭据不再可用。您的密钥策略控制这两条路径，如下所述。

### 在事件总线上配置客户托管的 KMS 密钥
<a name="eb-custom-bus-encryption-configure"></a>

支持的密钥类型：
+ **仅限对称加密密钥**（`SYMMETRIC_DEFAULT`，密钥用法`ENCRYPT_DECRYPT`）。非对称密钥和 HMAC 密钥被拒绝。
+ Multi-Region 支持将密钥作为普通密钥：在事件总线的区域中使用副本。 EventBridge 不会跨地区复制您的数据或密钥材料。
+ 支持导入密钥材料的密钥和外部密钥存储库 (XKS) 中的密钥。

**密钥标识符。**通过密钥 **ARN 指定密钥**。

#### 配置使用客户托管 KMS 密钥的权限
<a name="eb-custom-bus-encryption-key-policy"></a>

您的密钥策略需要三个 EventBridge 自定义事件总线语句。替换示例账户、区域、角色和总线名称。

[加密上下文](https://docs.amazonaws.cn/kms/latest/developerguide/encrypt_context.html)是一组非秘密密钥值对，它们 Amazon KMS 以加密方式绑定到请求，您可以在密钥策略中将其用作授权的条件。对事件总线发 EventBridge 出的每个 KMS 请求都包含一个将请求绑定到该总线的 ARN 的**加密上下文**，因此下面的每条语句都可以限定为单个总线。上下文密钥是`aws:events:event-busv2:arn`，其值是总线 ARN，无论是 EventBridge 使用您的凭证还是作为服务主体。 [缩小对客户托管 KMS 密钥的访问权限](#eb-custom-bus-encryption-scope)更详细地介绍了范围界定。加密上下文`/*`中的尾随值与总线 ARN 的后缀匹配，后者在创建时 EventBridge 生成 ()。`arn:aws:events:{{region}}:{{account}}:event-busv2/{{name}}/{{suffix}}`

```
{
  "Version": "2012-10-17",
  "Id": "eventbridge-eventbus-v2-cmk-policy",
  "Statement": [
    {
      "Sid": "AllowKeyValidationThroughEventBridge",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" },
      "Action": "kms:DescribeKey",
      "Resource": "*",
      "Condition": {
        "StringEquals": { "kms:ViaService": "events.us-east-1.amazonaws.com" }
      }
    },
    {
      "Sid": "AllowKeyUseThroughEventBridge",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" },
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:ReEncryptFrom",
        "kms:ReEncryptTo"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": { "kms:ViaService": "events.us-east-1.amazonaws.com" },
        "StringLike": {
          "kms:EncryptionContext:aws:events:event-busv2:arn": "arn:aws:events:us-east-1:111122223333:event-busv2/my-bus/*"
        }
      }
    },
    {
      "Sid": "AllowEventBridgeServicePrincipal",
      "Effect": "Allow",
      "Principal": { "Service": "events.amazonaws.com" },
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:ReEncryptFrom",
        "kms:ReEncryptTo"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:EncryptionContext:aws:events:event-busv2:arn": "arn:aws:events:us-east-1:111122223333:event-busv2/my-bus/*"
        }
      }
    }
  ]
}
```

**每份陈述的目的：**
+ **`AllowKeyValidationThroughEventBridge`**让您的委托人在创建或更新事件总线时验证密钥。 EventBridge`kms:DescribeKey`使用您的凭据调用以确认密钥存在、是否对称且已启用。`DescribeKey`API 没有加密上下文参数。因此，此语句没有加密上下文条件。该`kms:ViaService`条件将本声明的批准限制为已通过的请求 EventBridge。
+ **`AllowKeyUseThroughEventBridge`**授权使用**您的凭证 EventBridge **运行访问检查。 EventBridge 在它接受密钥配置之前以及代表您写入或读取加密数据之前运行这些检查。因此，您无法配置稍后使用的 EventBridge密钥，异步处理无法使用。这些检查是 KM *S 试运行*：它们授权但不加密或解密任何内容。 Dry-run 请求按标准的 KMS API 请求计费，并计入您的 KMS 请求配额；请参阅*Amazon Key Management Service 开发人员指南*中的[测试您的权限](https://docs.amazonaws.cn/kms/latest/developerguide/testing-permissions.html)。每次操作：
  + `CreateEventBus`使用客户管理的密钥检查`kms:GenerateDataKeyWithoutPlaintext``kms:ReEncryptTo`、`kms:ReEncryptFrom`/和`kms:Decrypt`。这些是分支密钥创建和稍后读取所执行的操作。
  + 密`UpdateEventBus`钥更改会检查`kms:Decrypt`当前密钥、加`kms:Decrypt`号`kms:Encrypt`和新密钥。这些是关键过渡执行的操作。
  + `PutEvents`/`PutRawEvents`在有客户管理的钥匙检查的公共汽车上`kms:Decrypt`。无法读回公交车事件的来电者也可能无法写出这些事件。
  + `CreateSubscriber`/`UpdateSubscriber`检查`kms:Decrypt`，因为用户配置是在总线密钥下加密的。

  **为该语句选择主体。**您可以在中列出个人角色或用户 ARN`Principal`，或者使用账户根委托人将此访问权限委托给您账户中的 IAM 策略。
+ **`AllowEventBridgeServicePrincipal`**授权在您的 API 调用完成后，当您的凭据不再可用时，**该工作作为服务 EventBridge **执行：
  + `kms:GenerateDataKeyWithoutPlaintext`和`kms:ReEncryptFrom`/`kms:ReEncryptTo`: EventBridge 创建总线的分支密钥，并在轮换时创建新的分支密钥版本。
  + `kms:Decrypt`: EventBridge 解开分支密钥以传送事件、加载订阅者配置以及在 describe 调用时返回解密的配置。
  + `kms:Decrypt`和`kms:Encrypt`：当您更改总线的 KM EventBridge S 密钥时，会重新封装分支密钥。

  此语句使用与相同的加密上下文条件。`AllowKeyUseThroughEventBridge`在任一访问路径上对总线发 EventBridge 出的每个请求都与总线 ARN `aws:events:event-busv2:arn` 一起传输，因此这两个语句都将密钥使用绑定到特定的事件总线。

**Cross-account 密钥：密钥**可以位于与事件总线不同的账户中（例如，中央安全账户）。在这种情况下，请将所有三个语句都放在该密钥的策略中。前两个语句的`Principal`条目命名了公交车账户的角色。加密上下文值命名总线账户的总线 ARN。 Cross-accountKMS 访问需要双方的许可：除了上述密钥策略声明外，总线账户的角色还需要允许对密钥的 ARN 执行相同的 KMS 操作的 IAM 身份策略。通过密钥的完整密钥 ARN 访问密钥。

#### 使用客户管理的 KMS 密钥创建新的事件总线
<a name="eb-custom-bus-encryption-create"></a>

在以下`EncryptionConfiguration`参数中指定密钥 ARN：[`CreateEventBus`](https://docs.amazonaws.cn/eventbridgev2/latest/APIReference/API_CreateEventBus.html)

```
{
  "Name": "my-bus",
  "EncryptionConfiguration": {
    "KmsKeyIdentifier": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }
}
```

在创建时，使用您的凭证 EventBridge 验证密钥和您的访问权限（上面的`DescribeKey`和试运行检查）。 EventBridge 然后异步配置总线的分支密钥，作为服务主体。如果您的密钥策略中缺少服务主体语句，则总线会转换到 `CREATE_FAILED` KMS 访问失败并`DescribeEventBus`返回`StateReason`命名 KMS 访问失败。

`DescribeEventBus`在带有客户管理密钥的公共汽车上，它会返回`EncryptionConfiguration`。使用默认 Amazon 自有密钥的总线返回 no`EncryptionConfiguration`： EventBridge 从不返回 Amazon 拥有的密钥。

#### 更改现有事件总线上的加密配置
<a name="eb-custom-bus-encryption-change"></a>

通过以下方式支持所有过渡 [`UpdateEventBus`](https://docs.amazonaws.cn/eventbridgev2/latest/APIReference/API_UpdateEventBus.html)：
+ Amazon 自有密钥 → 客户管理的密钥
+ 客户管理的密钥 → 不同的客户管理的密钥
+ 客户管理的密钥 → Amazon 自有密钥：发送`EncryptionConfiguration`**当前密钥和空**密钥 (`"EncryptionConfiguration": {}`)。完全省略成员意味着 “保持加密配置不变”。

当你更换钥匙时，公共汽车就会进来`UPDATING`。 EventBridge 将分支密钥重新封装在新密钥下。然后，公共汽车返回`ACTIVE`。分支密钥本身不会更改，因此保护您的数据的材料不会更改。只有包装密钥会发生变化。后果：
+ 无论旧密钥的状态如何，**先前写入的事件在过渡后仍可读**。过渡完成后，您可以立即禁用旧密钥，而不会失去对现有事件的访问权限。
+ 新事件继续使用同一个分支密钥，该分支密钥现在受新 KMS 密钥保护。
+ 不会对存储的事件进行重新加密，因此转换可以快速完成，并且不依赖于总线保存的数据量。

**自动 KMS 密钥轮换：**如果您在[密钥上启用自动密钥轮换](https://docs.amazonaws.cn/kms/latest/developerguide/rotate-keys.html)，KMS 会将支持材料轮换到同一个密钥 ARN 后面。轮换不会立即影响分支密钥。分支密钥会一直被最后封装它的材料包裹。下一个分支密钥版本大约每 30 天创建一次，受当前支持材料的保护。因此， KMS-side 轮换将在大约一个月内在您的公交车上生效。

**如果您的密钥不可用**（已禁用、已删除或访问权限已删除）：
+ 一旦缓存的分支密钥在 15 分钟内过期，发布到总线就会失败，并出现 KMS 访问错误。
+ 出于同样的原因，活动交付在同一时间点暂停。
+  EventBridge 已接受的事件不会被丢弃，解密失败也不会路由到死信队列。 EventBridge 重试它们。密钥访问失败是您可以修复的情况，因此请 EventBridge 保留并重试受影响的事件，而不是转移它们。除非停电时间超过公交车的保留期，否则不会丢失任何事件。
+ 恢复访问权限后，只要事件保持在总线的保留期内，处理就会自动恢复。

**删除您的密钥是永久性的。**禁用密钥或删除密钥 EventBridge的访问权限是可逆的：恢复访问权限和处理恢复。删除密钥不是。 Amazon KMS 删除总线上当前配置的密钥后，将 EventBridge 无法再解开总线的分支密钥，并且仍然存储在总线上的每个事件在其剩余的保留期内都将永久无法读取。作为最佳实践，请先禁用密钥并确认其影响，然后再安排将其删除。请参阅《*Amazon Key Management Service 开发者指南*》中的[删除 Amazon KMS 密钥](https://docs.amazonaws.cn/kms/latest/developerguide/deleting-keys.html)。

**删除公交车不需要钥匙。** `DeleteEventBus`即使密钥被禁用或删除，也会成功。

#### 缩小对客户托管 KMS 密钥的访问权限
<a name="eb-custom-bus-encryption-scope"></a>
+ **加密上下文。**对事件总线发 EventBridge出的每个 KMS 请求都包含一个将请求绑定到该总线的 ARN 的加密上下文。因此，您可以将每条语句的范围限定为一条总线，如示例策略所示。上下文密钥适用于每个请求，无论是`aws:events:event-busv2:arn`使用您的凭证还是作为服务主体提出。与尾随`StringLike`一起使用`/*`，因为总线 ARN 以创建时生成的后缀结尾。在现有总线上，您可以将与中的精确ARN进行匹配。`DescribeEventBus` `StringEquals`
+ **kms: ViaService。**使用您的凭证发出的所有请求都会在`kms:ViaService`条件密钥中填充。`events.{{region}}.amazonaws.com`因此，您只能通过 EventBridge 以下方式限制委托人的密钥使用权限。
+ **密钥策略变更的传播。**单个事件操作使用缓存的分支密钥，并且不会根据每个事件的密钥策略重新验证。当缓存 EventBridge的分支密钥在 15 分钟内过期时，密钥策略更改（包括移除的访问权限）将对总线的数据处理生效。
+ **副手保护混乱。**作为服务主体发 EventBridge出的请求包括`aws:SourceArn`上下文（总线 ARN）和上下文。`aws:SourceAccount`因此，您可以将这些条件添加到`AllowEventBridgeServicePrincipal`语句中。他们确保仅代表您自己的资源 EventBridge 使用您的密钥：

  ```
  "Condition": {
    "StringEquals": { "aws:SourceAccount": "111122223333" },
    "ArnLike": { "aws:SourceArn": "arn:aws:events:us-east-1:111122223333:event-busv2/my-bus/*" }
  }
  ```

## 监视 EventBridge 自定义事件总线与的交互 Amazon KMS
<a name="eb-custom-bus-encryption-cloudtrail"></a>

EventBridge中显示了您的客户托管密钥的使用情况 Amazon CloudTrail。请参阅使用[记录 Amazon KMS API 调用 Amazon CloudTrail](https://docs.amazonaws.cn/kms/latest/developerguide/logging-using-cloudtrail.html#searching-kms-ct)。预计会发生的事件：


| CloudTrail `eventName` | 时间 | 呼叫身份 | 
| --- | --- | --- | 
| DescribeKey | 总线 create/update 密钥验证 | 您的校长，通过 EventBridge | 
| Decrypt、Encrypt、GenerateDataKeyWithoutPlaintext、ReEncrypt（试运行） | 对公交车 create/update、出版商、订阅者进行授权检查 create/update | 您的校长（通过 EventBridge） | 
| GenerateDataKeyWithoutPlaintext, ReEncrypt | Branch-key 创建（总线创建）和分支密钥轮换（大约 30 天） | events.amazonaws.com 服务主体 | 
| Decrypt | Branch-key 缓存到期时解包：事件传送、订阅者配置加载、描述时间解密 | events.amazonaws.com 服务主体 | 
| Decrypt \+ Encrypt | Branch-key UpdateEventBus按键更改时重新包装 | events.amazonaws.com 服务主体 | 

CloudTrail 将 `ReEncrypt` API 调用记录为一个事件。您的密钥策略中的`kms:ReEncryptFrom`和`kms:ReEncryptTo`权限均授权该调用。

授权检查是 KMS 试运行请求。根据设计，试运行请求会返回`DryRunOperationException`而不是执行操作：该响应是*通过*检查的痕迹，而不是配置中的错误。`AccessDeniedException`相反，显示的试运行条目意味着呼叫者缺少被检查的权限。有关详细信息，请参阅《*Amazon Key Management Service 开发者指南》*中的[测试您的权限](https://docs.amazonaws.cn/kms/latest/developerguide/testing-permissions.html)。

这些`requestParameters.encryptionContext`条目包含`aws:events:event-busv2:arn`在您的总线 ARN 中。分支密钥操作的条目还包括分层密钥环添加的分支密钥元数据：（`branch-key-id`总线 ARN）、、、、和。`type` `create-time` `tablename` `hierarchy-version` `kms-arn`

单个事件的加密和解密使用从缓存的分支密钥本地派生的数据密钥。因此，每个事件的操作不会出现在中。 CloudTrail您只能看到分支键操作。