

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

# 在自定义事件总线上加密事件
<a name="eb-custom-bus-encryption"></a>

总线对其存储的所有内容进行加密：事件有效载荷、事件元数据、订阅者过滤器和订阅者目标配置。默认情况下，它使用 AWS 拥有的密钥，而您无需进行任何配置。要改用自己的 AWS KMS 密钥加密总线，例如在创建或更新总线`EncryptionConfiguration.KmsKeyIdentifier`时进行设置`aws eventsv2 create-event-bus --name orders --encryption-configuration KmsKeyIdentifier=arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`，并将这三个语句添加到密钥策略中[撰写关键政策](#eb-custom-bus-encryption-key-policy)。

## 选择对总线进行加密的密钥
<a name="eb-custom-bus-encryption-at-rest"></a>

在自有密钥下省略`EncryptionConfiguration`并使用 256 位 AES 对总线 EventBridge 进行加密。 AWS 您无法查看或管理该密钥，它的使用不会出现在您的 CloudTrail 日志中，它不花任何钱，不计入您的配 AWS KMS 额，并且每月 AWS 轮换一次。`DescribeEventBus``EncryptionConfiguration`对于这样的公共汽车，返回 no。有关更多信息，请参阅《*AWS KMS 开发人员指南*》中的 [AWS 拥有密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)。

使用您的客户管理密钥设置`EncryptionConfiguration.KmsKeyIdentifier`和 EventBridge 加密总线。然后，您可以控制密钥策略、轮换、禁用和删除，并且可以看到密钥的每一次使用 CloudTrail。密钥产生 AWS KMS 每月密钥费和申请费。由于 EventBridge 使用缓存的分支密钥在本地加密和解密事件（参见[公交车如何使用你的钥匙](#eb-custom-bus-encryption-branch-key)），因此它会在每个缓存窗口和轮换时段在每个总线上发出几个 AWS KMS 请求；请求数不会随着您的事件量而增加。有关更多信息，请参阅[AWS KMS 定价](https://aws.amazon.com/kms/pricing/)。

`KmsKeyIdentifier`接受密钥 ID、密钥 ARN、别名（如`alias/orders`）或别名 ARN。 EventBridge 符合您的账户和区域中的裸密钥 ID 或别名资格，因此另一个账户中的密钥必须使用其完整密钥 ARN 命名。当您创建或更新总线时，别名会解析为其密钥，创建和描述响应会返回该密钥 ARN。 Re-pointing 后来的别名不会更改总线使用的密钥。密钥必须是对称加密密钥（`SYMMETRIC_DEFAULT`密钥用法`ENCRYPT_DECRYPT`）； EventBridge 拒绝非对称密钥和 HMAC 密钥。多区域密钥用作普通密钥：在总线的区域中命名副本，因为既不会跨区域 EventBridge 复制您的数据，也不会复制密钥材料。支持带有导入密钥材料的密钥和外部密钥库中的密钥。

```
aws eventsv2 create-event-bus \
    --name orders \
    --encryption-configuration KmsKeyIdentifier=arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
```

您的密钥会加密总线保留的事件有效载荷和元数据、交付期间为每个订阅者保留的副本以及订阅者过滤器和目标配置。有四件事没有使用您的密钥加密，因为 EventBridge 需要它们来路由和查找事件：总线名称、ARN 和账户 ID；订购 FIFO 交付的事件组 ID，因此不要将敏感数据放入其中；重复数据删除 ID，以单向哈希形式 EventBridge 存储；以及内部匹配结果和序列号。存储服务使用自己的密钥对静态文件进行加密。

## 公交车如何使用你的钥匙
<a name="eb-custom-bus-encryption-branch-key"></a>

配置客户管理的密钥时， EventBridge 会*为总线创建一个*分支密钥：中间密钥，存储在服务管理表中，由密 AWS KMS 钥包装，遵循 AWS 加密 SDK [ 分层密钥](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/use-hierarchical-keyring.html)环。 EventBridge 从每个事件的分支密钥中派生一个数据密钥，因此它可以在本地加密和解密事件，而无需对每个事件进行 AWS KMS 调用。
+ 发布事件时，在总线的分支密钥下对其 EventBridge 进行加密，然后再将其写入存储。
+ 当 EventBridge 传送事件时，它会解密该事件以评估过滤器并传送该事件。目标接收解密事件；目标服务负责对目标进行加密。
+ EventBridge 在内存中缓存分支密钥最多 15 分钟。当缓存到期时，它会调`kms:Decrypt`用你的密钥再次解开分支密钥。
+ EventBridge 大约每 30 天创建一个新的分支密钥版本并保留旧版本，因此较早编写的事件在总线的保留期内保持可读性。

EventBridge 通过两条路径到达您的密钥，密钥策略必须允许这两条路径。对于在 API 调用进行期间运行的检查，它使用调用中转发的凭证。对于它在呼叫回来后所做的工作，例如传送事件和管理分支密钥，它充当`events.amazonaws.com`服务主体，因为您的证书不再可用。

## 撰写关键政策
<a name="eb-custom-bus-encryption-key-policy"></a>

向密钥策略添加三条语句：一条允许您的委托人验证密钥，一条允许他们通过凭证 EventBridge 运行的访问检查，另一条用于`events.amazonaws.com`服务主体。在两条访问路径上，对总线发 EventBridge 出的每个 AWS KMS 请求都携带带有总线 ARN 的加密上下文密钥`aws:events:event-busv2:arn`，因此第二和第三条语句的作用域仅限于一条总线。总线 ARN 以创建时 EventBridge 生成的后缀结尾，因此将其`StringLike`与后缀相匹配。`/*`在政策中也保留您自己的密钥管理声明。替换以下示例中的账户、区域、角色和总线名称。

```
{
    "Version": "2012-10-17",
    "Id": "eventbridge-custom-event-bus-key-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/orders/*"
                }
            }
        },
        {
            "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/orders/*"
                }
            }
        }
    ]
}
```

`AllowKeyValidationThroughEventBridge`让您的委托人在创建或更新总线时验证密钥。 EventBridge `kms:DescribeKey`使用您的证书调用以确认密钥存在、对称且已启用。`DescribeKey`不采用加密上下文，因此此语句没有加密上下文；仅`kms:ViaService`限于传出的请求 EventBridge。

`AllowKeyUseThroughEventBridge`授权在接受密钥配置之前以及在为你写入或读取加密数据之前使用你的凭据 EventBridge 运行的访问检查，这样你就无法配置服务以后的异步工作无法使用的密钥。这些支票是 AWS KMS 试运行的：它们授权，但不会加密和解密。它们按标准 AWS KMS 请求计费，并计入您的 AWS KMS 请求配额；请参阅*AWS KMS 开发人员指南*[中的](https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html)测试您的权限。每项操作都会检查其后续工作所执行的操作：
+ `CreateEventBus`使用客户管理的密钥检查`kms:GenerateDataKeyWithoutPlaintext`、`kms:ReEncryptFrom``kms:ReEncryptTo``kms:Decrypt`、和，分支密钥创建和后续读取操作的执行情况。
+ `UpdateEventBus`这会更改当前密钥`kms:Encrypt`和新密钥`kms:Decrypt`上的密钥检查`kms:Decrypt`。
+ `PutEvents`然后`PutRawEvents`在有客户管理的钥匙支票的公共汽车上`kms:Decrypt`。无法读回总线事件的生产者也无法写入这些事件。没有它，发布调用就会因`AccessDeniedException`命名而失败`KMS_ACCESS_DENIED`。
+ `CreateSubscriber`然后`UpdateSubscriber`检查`kms:Decrypt`，因为订阅者配置是在总线密钥下加密的。

因此，`Principal`本声明必须涵盖创建或更新总线、向总线发布或在总线上创建订阅者的每个角色。列出角色 ARN，或命名账户根委托人，将决策委托给您账户中的 IAM 政策。

`AllowEventBridgeServicePrincipal`授权您在通话完成后将工作作为服务 EventBridge 执行。`kms:GenerateDataKeyWithoutPlaintext``kms:ReEncryptFrom`、，然后轮流`kms:ReEncryptTo`创建总线的分支密钥及其新版本。`kms:Decrypt`解压缩分支密钥以传送事件、加载订阅者配置以及在 describe 调用时返回解密的配置。`kms:Decrypt`当您更改总线`kms:Encrypt`的密钥时，with 会重新包装分支密钥。

密钥可以存放在另一个账户中，例如中央安全账户。将所有三个语句放入该密钥的策略中，将总线账户的角色作为前两个语句的主体，将总线账户的总线 ARN 放在加密上下文值中。总线账户的角色还需要允许对密钥 ARN 进行相同 AWS KMS 操作的 IAM 身份策略，因为跨账户 AWS KMS 访问需要双方的权限。按密钥的完整密钥 ARN 命名密钥。

## 将关键策略的范围限定为一辆总线
<a name="eb-custom-bus-encryption-scope"></a>

要将语句限制在一条总线上，请将其设置为启用条件`kms:EncryptionContext:aws:events:event-busv2:arn`。在总线存在之前，使用`StringLike`尾随方式`/*`，如前面的策略所示。对于现有总线，您可以匹配`DescribeEventBus`返回的确切 ARN。`StringEquals`使用您的证书提出的每个请求也会填充 `kms:ViaService``events.{{region}}.amazonaws.com`，因此您可以限制您的委托人只能使用密钥。 EventBridge 

作为服务主体提出的请求将随`aws:SourceArn`总线 ARN 和总线账户`aws:SourceAccount`一起发送。 EventBridge 将它们添加到，`AllowEventBridgeServicePrincipal` EventBridge 这样您的密钥只能用于自己的公交车。

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

个别发布和交付操作使用缓存的分支密钥，不要重新检查每个事件的密钥策略。当缓存 EventBridge的分支密钥在 15 分钟内到期时，密钥策略更改（包括移除访问权限的更改）会对总线的数据处理生效。

## 在公交车上更换或移除钥匙
<a name="eb-custom-bus-encryption-change"></a>

致电将总线从 AWS 自有密钥移`UpdateEventBus`至客户管理的密钥，从一个客户管理的密钥转移到另一个客户管理的密钥，或者移回 AWS 自有密钥。要返回到 AWS 拥有的密钥，请发送 pres `EncryptionConfiguration` ent 和 empty，as `--encryption-configuration '{}'`。`EncryptionConfiguration`完全省略，总线会保留其当前密钥。

总线进入`UPDATING`时将分支密钥 EventBridge 重新包装在新密钥下方，然后返回到。`ACTIVE`分支密钥本身不会更改，因此不会 EventBridge 重新加密任何存储的事件，无论总线保持什么状态，更改都会快速完成，并且无论旧密钥的状态如何，先前写入的事件都保持可读状态。`DescribeEventBus`显示`ACTIVE`带有新密钥的总线后，您可以禁用旧密钥。

如果 EventBridge 无法使用新密钥，则总线将安定下来`UPDATE_FAILED`并继续使用其先前的密钥：它仍然接受和传送事件，并`DescribeEventBus`继续报告旧密钥。失效的密钥永远不会成为总线密钥。使用可用的密钥`UpdateEventBus`再次呼叫，或者在修复其政策后使用相同的密钥进行呼叫，总线就会返回`ACTIVE`。在密钥上创建失败的总线以 AWS KMS 拒绝`StateReason`命名为`CREATE_FAILED`结论；该状态仅接受`DeleteEventBus`，并`UpdateEventBus`通过一条命名其所接受状态的消息被拒绝。`[ACTIVE, UPDATE_FAILED]`修复密钥策略，删除总线，然后重新创建。有关各州的信息，请参阅[总线状态及其允许的内容](eb-custom-bus-create.md#eb-custom-bus-lifecycle-states)。

如果您在密钥[上启用](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)自动密钥轮换，则 AWS KMS 会旋转同一密钥 ARN 后面的背衬材料。分支密钥由上次打包的材料封装，而下一个分支密钥版本（大约每 30 天创建一次）使用当前材料。因此， AWS KMS 轮流会在大约一个月内到达您的公交车。

## 当密钥变得不可用时
<a name="eb-custom-bus-encryption-key-unusable"></a>

如果您禁用密钥、安排删除密钥或移除对该密钥 EventBridge的访问权限，则总线将在 15 分钟内继续运行直到其缓存的分支密钥到期。然后，发布到总线时因 AWS KMS 访问错误而失败，交付暂停。 EventBridge 不会删除已经接受的事件，也不会将它们发送到死信队列；它会保存并重试这些事件，因为密钥访问失败是你可以修复的情况。当您恢复访问权限时，发布和交付将自行恢复。除非停电时间超过公交车的保留期，否则不会丢失任何事件。

删除密钥是永久性的。 AWS KMS 删除总线上配置的密钥后， EventBridge 无法再解开总线的分支密钥，并且在其剩余的保留期内仍存储在总线上的所有事件都无法读取。先禁用密钥，确认效果，然后才安排删除；请参阅*AWS KMS 开发者指南[中的](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)删除 AWS KMS 密钥*。`DeleteEventBus`不需要密钥：禁用或删除密钥后它会成功。

## 监控密钥的使用情况 CloudTrail
<a name="eb-custom-bus-encryption-cloudtrail"></a>

向您的客户管理密钥发 EventBridge 出的每个请求都记录在中 CloudTrail；请参阅使用[记录 AWS KMS API 调用 CloudTrail](https://docs.aws.amazon.com/kms/latest/developerguide/logging-using-cloudtrail.html)。下表列出了预期的事件。


| `eventName` | 时间 | 呼叫身份 | 
| --- | --- | --- | 
| DescribeKey | 在总线创建和更新时进行密钥验证 | 你的校长，通过 EventBridge | 
| Decrypt，Encrypt，GenerateDataKeyWithoutPlaintext，ReEncrypt（试运行） | 对总线创建和更新、发布以及订阅者创建和更新进行访问检查 | 你的校长，通过 EventBridge | 
| GenerateDataKeyWithoutPlaintext, ReEncrypt | 创建总线时创建分支密钥，分支密钥大约每 30 天轮换一次 | events.amazonaws.com | 
| Decrypt | 缓存到期时分支密钥会解包：事件传送、订阅者配置加载、描述调用 | events.amazonaws.com | 
| Decrypt 和 Encrypt | UpdateEventBus更改密钥时分支密钥会重新换行 | events.amazonaws.com | 

CloudTrail 将`ReEncrypt`呼叫记录为一个事件；`kms:ReEncryptFrom`和权`kms:ReEncryptTo`限均对其进行授权。显示的试运行条目`DryRunOperationException`是通过访问检查，而不是配置中的错误；显示的条目`AccessDeniedException`表示调用者缺少被检查的权限。每个`requestParameters.encryptionContext`条目都包含`aws:events:event-busv2:arn`在您的公交车ARN中。分支密钥条目还带有分层密钥环的字段：`branch-key-id`（总线 ARN）、`type`、`create-time`、`tablename``hierarchy-version`、和。`kms-arn` Per-event 加密和解密使用从缓存的分支密钥本地派生的数据密钥，因此个别事件不会出现在中 CloudTrail。

## 传输中加密
<a name="eb-custom-bus-encryption-transit"></a>

所有自定义事件总线 API 调用都会转到 HTTPS 终端节点`eventsv2.{{region}}.amazonaws.com`，并且每个请求都必须使用您的证书进行签名。FIPS 终端节点可在您需要的地方使用。`eventsv2-fips.{{region}}.amazonaws.com`有关一般 EventBridge 数据保护，请参阅[亚马逊 EventBridge 安全](eb-security.md)。