

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

# 使用密钥加密 EventBridge 事件总线 AWS KMS
<a name="eb-encryption-event-bus-cmkey"></a>

您可以指定 EventBridge 使用 AWS KMS 来加密存储在事件总线上的数据，而不是使用 as AWS 拥有的密钥 作为默认值。您可以在创建或更新事件总线时指定客户自主管理型密钥。您也可以更新默认事件总线，以便使用客户自主管理型密钥进行加密。有关更多信息，请参阅 [KMS 密钥选项](eb-encryption-at-rest-key-options.md)。

 当您为事件总线指定客户管理的密钥时，会 EventBridge 使用该密钥对以下内容进行加密：
+ 存储在事件总线上的[自定义](eb-putevents.md)事件和[合作伙伴](eb-saas.md)事件。

  来自 AWS 服务的事件使用进行加密 AWS 拥有的密钥。

  EventBridge 不加密事件元数据。有关事件元数据的更多信息，请参阅*事件参考文档*中的 [AWS service event metadata](https://docs.aws.amazon.com/eventbridge/latest/ref/events-structure.html)。
+ 对于总线上的每条[规则](eb-rules.md)：
  + 规则[事件模式](eb-event-patterns.md)。
  + [目标](eb-targets.md)信息，包括目标输入、[输入转换器](eb-transform-target-input.md)和[配置参数](eb-create-rule-wizard.md#eb-create-rule-target)。
+ 如果启用了[事件总线日志记录](eb-event-bus-logs.md)，则会记录日志的 `detail` 和 `error` 部分。

如果您为事件总线指定客户托管密钥，则可以选择为事件总线指定死信队列 (DLQ)。 EventBridge 然后向该 DLQ 提供任何生成加密或解密错误的自定义事件或合作伙伴事件。有关更多信息，请参阅 [DLQs 用于加密事件](eb-encryption-event-bus-dlq.md)。

**注意**  
我们强烈建议为事件总线指定 DLQ，以确保在发生加密或解密错误时保留事件。

您还可以指定使用客户自主管理型密钥来加密事件总线归档。有关更多信息，请参阅 [加密归档](encryption-archives.md)。

**注意**  
使用客户自主管理型密钥进行加密的事件总线不支持架构发现。要在事件总线上启用架构发现，请选择使用 AWS 拥有的密钥。有关更多信息，请参阅 [KMS 密钥选项](eb-encryption-at-rest-key-options.md)。

## 事件总线加密上下文
<a name="eb-encryption-at-rest-context-bus"></a>

[加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时， AWS KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据，您必须传入相同的加密上下文。

您还可以将加密上下文用作在策略和授权中进行授权的条件。

如果您使用客户托管密钥来保护您的 EventBridge 资源，则可以使用加密上下文来识别审计记录和日志 KMS key 中的使用情况。它也以明文形式显示在日志中，例如 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 和 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

对于事件总线，在所有加密操作中 EventBridge 使用相同的 AWS KMS 加密上下文。该上下文包括单个键值对，其中包含事件总线 ARN。

```
"encryptionContext": {
    "kms:EncryptionContext:aws:events:event-bus:arn": "event-bus-arn"
}
```

## AWS KMS 活动总线的密钥策略
<a name="eb-encryption-key-policy-bus"></a>

以下示例密钥策略提供事件总线所需的权限：
+ `kms:DescribeKey`
+ `kms:GenerateDataKey`
+ `kms:Decrypt`

作为安全最佳实践，我们建议您在密钥策略中包含条件密钥，以帮助确保仅对指定的资源或账户 EventBridge 使用 KMS 密钥。有关更多信息，请参阅 [安全注意事项](eb-encryption-key-policy.md#eb-encryption-event-bus-confused-deputy)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowEventBridgeToValidateKeyPermission",
      "Effect": "Allow",
      "Principal": {
      "Service": "events.amazonaws.com"
       },
      "Action": [
        "kms:DescribeKey"
        ],
      "Resource": "*"
    },
  {
    "Sid": "AllowEventBridgeToEncryptEvents",
    "Effect": "Allow",
    "Principal": {
      "Service": "events.amazonaws.com"
    },
    "Action": [
      "kms:GenerateDataKey",
      "kms:Decrypt"
    ],
    "Resource": "*",
    "Condition": {
      "StringEquals": {
          "kms:EncryptionContext:aws:events:event-bus:arn": "arn:aws:events:us-east-1:123456789012:event-bus/event-bus-arn",
          "aws:SourceArn": "arn:aws:events:us-east-1:123456789012:event-bus/event-bus-name"
        }
      } 
    }
  ] }
```

------

## AWS KMS 事件总线操作的密钥权限
<a name="eb-encryption-key-permissions-bus"></a>

要创建或更新使用客户自主管理型密钥加密的事件总线，您必须对指定的客户自主管理型密钥拥有以下权限：
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:ReEncryptFrom`
+ `kms:ReEncryptTo`
+ `kms:DescribeKey`

此外，要在使用客户自主管理型密钥加密的事件总线上执行某些事件总线操作，您必须对指定的客户自主管理型密钥拥有 `kms:Decrypt` 权限。这些操作包括：
+ `[DescribeRule](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DescribeRule.html)`
+ `[DisableRule](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DisableRule.html)`
+ `[EnableRule](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_EnableRule.html)`
+ `[ListRules](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_ListRules.html)`
+ `[ListTargetsByRule](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_ListTargetsByRule.html)`
+ `[PutRule](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutRule.html)`
+ `[ListRuleNamesByTarget](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_ListRuleNamesByTarget.html)`
+ `[PutTargets](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutTargets.html)`

# 在 EventBridge 事件总线上配置加密
<a name="eb-encryption-event-bus-cmkey-configure"></a>

您可以指定创建或更新事件总线时 EventBridge 要使用的 KMS 密钥。您还可以更新默认事件总线，使其使用客户自主管理型密钥。

## 指定创建事件总线时用于加密的密 AWS KMS 钥
<a name="eb-encryption-event-bus-cmkey-create"></a>

选择用于加密的 AWS KMS 密钥是创建事件总线的一部分。默认为使用 AWS 拥有的密钥 提供的 EventBridge。

**在创建事件总线时指定客户自主管理型密钥进行加密（控制台）**
+ 按照以下说明进行操作：

  [创建事件总线](eb-create-event-bus.md).

**在创建事件总线时指定客户自主管理型密钥进行加密（CLI）**
+ 呼叫时`[create-event-bus](https://docs.aws.amazon.com/cli/latest/reference/events/create-event-bus.html)`，使用`kms-key-identifier`选项指定要在事件总线上进行 EventBridge 加密的客户托管密钥。

  （可选）使用 `dead-letter-config` 指定一个死信队列（DLQ）。

## 更新事件总线上用于加密的密 AWS KMS 钥
<a name="eb-encryption-event-bus-cmkey-update"></a>

您可以在现有事件总线上更新用于静态加密的密 AWS KMS 钥。这包括：
+ 从默认密钥更改 AWS 拥有的密钥 为客户管理的密钥。
+ 从客户管理的密钥更改为默认密钥 AWS 拥有的密钥。
+ 从一个客户自主管理型密钥更改为另一个客户自主管理型密钥。

更新事件总线以使用其他密 AWS KMS 钥时，会 EventBridge 解密存储在事件总线上的任何数据，然后使用新密钥对其进行加密。

**更新在事件总线上用于加密的 KMS 密钥（控制台）**

1. 打开 Amazon EventBridge 控制台，网址为[https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/)。

1. 在导航窗格中，选择**事件总线**。

1. 选择要更新的事件总线。

1. 在事件总线详细信息页面上，选择**加密**选项卡。

1. 选择加密存储在事件总线上的事件数据时 EventBridge 要使用的 KMS 密钥：
   + 选择 “** AWS 拥有的密钥使用**” EventBridge 以使用加密数据 AWS 拥有的密钥。

      AWS 拥有的密钥 这是一个 KMS 密钥， EventBridge 拥有并管理，可在多个 AWS 账户中使用。通常， AWS 拥有的密钥 是一个不错的选择，除非您需要审计或控制保护资源的加密密钥。

     这是默认值。
   + 选择 “**使用客户托管密钥**” EventBridge ，使用您指定或创建的客户托管密钥对数据进行加密。

     客户托管密钥是在您的 AWS 账户中由您创建、拥有和管理的 KMS 密钥。您对此类 KMS 密钥拥有完全控制权。

     1. 指定现有的客户自主管理型密钥，或选择**创建新的 KMS 密钥**。

        EventBridge 显示密钥状态以及与指定客户托管密钥关联的所有密钥别名。

     1. 选择要用作此事件总线的死信队列（DLQ）的 Amazon SQS 队列（如果有）。

        EventBridge 将未成功加密的事件发送到 DLQ（如果已配置），因此您可以稍后对其进行处理。

**更新在事件总线上用于加密的 KMS 密钥（CLI）**
+ 呼叫时`[update-event-bus](https://docs.aws.amazon.com/cli/latest/reference/events/create-event-bus.html)`，使用`kms-key-identifier`选项指定要在事件总线上进行 EventBridge 加密的客户托管密钥。

  （可选）使用 `dead-letter-config` 指定一个死信队列（DLQ）。

**要在默认事件总线上更新用于加密的 KMS 密钥，请使用 CloudFormation**

由于 EventBridge 会自动将默认事件总线置备到您的账户中，因此您无法像往常一样使用 CloudFormation 模板来创建它，就像您要包含在 CloudFormation 堆栈中的任何资源一样。要将默认事件总线包含在 CloudFormation 堆栈中，必须先将其*导*入堆栈。将默认事件总线导入堆栈后，即可根据需要更新事件总线属性。
+ 按照以下说明进行操作：

  [使用更新默认总线 CloudFormation](event-bus-update-default-cfn.md).

# EventBridge 当事件总线为规则目标时进行加密
<a name="eb-encryption-event-bus-target"></a>

将自定义事件或合作伙伴事件发送到事件总线时， EventBridge会根据该事件总线的静态加密 KMS 密钥配置（默认密钥 AWS 拥有的密钥 或客户托管密钥（如果已指定）对事件进行加密。如果事件与规则匹配，则使用该事件总线的 KMS 密钥配置对事件 EventBridge 进行加密，直到该事件被发送到规则目标，*除非规则目标是另一个事件总线*。
+ 如果规则的目标是同一 AWS 区域中的另一条事件总线：

  如果目标事件总线具有指定的客户托管密钥，则改为使用目标事件总线的客户管理密钥对事件 EventBridge 进行加密以进行传送。  
![\[从一个事件总线发送到另一个事件总线的事件，使用目标事件总线的密钥进行加密。\]](http://docs.aws.amazon.com/zh_cn/eventbridge/latest/userguide/images/cmkms-bus-same-region_eventbridge_conceptual.svg)
+ 如果规则的目标是不同 AWS 区域的另一条事件总线：

  EventBridge 根据第一条事件总线上的 KMS 密钥配置对静态事件进行加密。 EventBridge 使用 TLS 将事件发送到不同区域的第二个事件总线，然后根据为目标事件总线指定的 KMS 密钥配置对其进行加密。  
![\[发送到不同区域中的目标事件总线的事件，使用 TLS 进行传输中加密。\]](http://docs.aws.amazon.com/zh_cn/eventbridge/latest/userguide/images/cmkms-bus-cross-region_eventbridge_conceptual.svg)

# 中的托管规则的事件加密 EventBridge
<a name="eb-encryption-event-bus-managed-rules"></a>

AWS 服务可以在您的 AWS 账户中创建和管理事件总线规则，这些规则是这些服务中某些功能所必需的。作为托管规则的一部分， AWS 服务可以指定 EventBridge 使用为规则目标指定的客户托管密钥。这样，您就可以根据规则目标灵活地指定要使用哪个客户自主管理型密钥。

在这些情况下，一旦自定义事件或合作伙伴事件与托管规则匹配，就会 EventBridge 使用托管规则指定的目标客户托管密钥对事件进行加密，直到将其发送到规则目标。这与事件总线是否已配置为使用自己的客户自主管理型密钥进行加密无关。即使托管规则的目标是另一个事件总线，并且该事件总线有自己的客户托管密钥用于加密，也是如此。 EventBridge 继续使用托管规则中指定的目标客户托管密钥，直到事件被发送到不是事件总线的目标。

![\[与托管规则匹配的事件，使用规则目标的密钥进行加密。\]](http://docs.aws.amazon.com/zh_cn/eventbridge/latest/userguide/images/cmkms-bus-managed-rule_eventbridge_conceptual.svg)


如果规则目标是另一个区域中的事件总线，则必须提供[多区域密钥](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)。第一个区域中的事件总线使用托管规则中指定的客户自主管理型密钥对事件进行加密。然后，它将事件发送到第二个区域中的目标事件总线。在将事件发送到目标客户自主管理型密钥之前，该事件总线必须能够继续使用。

# 使用 in 加密事件总线日志 AWS KMS EventBridge
<a name="encryption-bus-logs"></a>

发送日志时， EventBridge 使用为事件总线指定的 KMS 密钥对每条日志记录的`detail`和`error`部分进行加密。如果您为事件总线指定了客户托管密钥，则在传输过程中 EventBridge 使用该密钥进行加密。记录一经传送，就会被解密，然后使用为日志目标指定的 KMS 密钥重新加密。

## 事件总线日志加密上下文
<a name="encryption-bus-logs-context"></a>

[加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时， AWS KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据，您必须传入相同的加密上下文。

您还可以将加密上下文用作在策略和授权中进行授权的条件。

如果您使用客户托管密钥来保护您的 EventBridge 资源，则可以使用加密上下文来识别审计记录和日志 KMS key 中的使用情况。它也以明文形式显示在日志中，例如 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 和 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

对于事件总线日志，在所有加密操作中 EventBridge 使用相同的 AWS KMS 加密上下文。

```
"encryptionContext": {
    "kms:EncryptionContext:SourceArn": "arn:partition:logs:region:account:*"
}
```

## AWS KMS 事件总线日志记录的密钥策略权限
<a name="encryption-bus-logs-permissions"></a>

对于使用客户自主管理型密钥的事件总线，您必须向密钥策略添加以下权限。
+  EventBridge 允许使用客户管理的密钥对日志进行加密。

  ```
  {
    "Sid": "Enable log service encryption",
    "Effect": "Allow",
    "Principal": {
      "Service": "events.amazonaws.com"  
    },
    "Action": [
      "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
      "StringLike": {
        "kms:EncryptionContext:SourceArn": "arn:partition:logs:region:account:*"
      }
    }
  }
  ```
+ 允许日志服务解密发送的日志。 EventBridge

  ```
  {
    "Sid": "Enable log delivery decryption",
    "Effect": "Allow",
    "Principal": {
      "Service": "delivery.logs.amazonaws.com"
    },
    "Action": [
      "kms:Decrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
      "StringLike": {
        "kms:EncryptionContext:SourceArn": "arn:partition:logs:region:account:*"
      }
    }
  }
  ```

# 使用死信队列捕获中的加密事件错误 EventBridge
<a name="eb-encryption-event-bus-dlq"></a>

如果您在事件总线上配置客户托管密钥加密，我们建议您为该事件总线指定死信队列 (DLQ)。 EventBridge 如果此 DLQ 在事件总线上处理事件时遇到不可重修的错误，则会向其发送自定义事件和合作伙伴事件。不可重试的错误是指需要用户采取操作才能解决潜在问题的错误，例如指定的客户自主管理型密钥被禁用或缺失。
+ 如果在事件总线上处理事件时出现不可重检的加密或解密错误， EventBridge 则会将该事件发送到事件总线的 DLQ（*如果*已指定）。
+ *如果在尝试向目标发送事件（包括输入转换和特定 EventBridge 于目标的设置）时出现不可重检的加密或解密错误，则该事件将被发送到目标的 DLQ（如果已指定）。*

![\[在处理事件总线过程中出现不可重试的错误，并将事件发送到事件总线 DLQ。\]](http://docs.aws.amazon.com/zh_cn/eventbridge/latest/userguide/images/cmkms-bus-dlq_eventbridge_conceptual.svg)


有关更多信息，包括使用 DLQs时的注意事项和设置权限的说明，请参阅[使用死信队列](eb-rule-dlq.md)。

# 解密死信队列中的 EventBridge 事件
<a name="eb-encryption-event-bus-dlq-decrypt"></a>

一旦解决了导致不可重试错误的潜在问题，就可以处理发送到事件总线或目标的事件。 DLQs对于已加密的事件，必须先解密事件才能对其进行处理。

以下示例演示如何解密 EventBridge 已传送到事件总线或目标 DLQ 的事件。

```
// You will receive an encrypted event in the following json format.
        // ```
        //   {
        //     "version": "0", 
        //     "id": "053afa53-cdd7-285b-e754-b0dfd0ac0bfb",  // New event id not the same as the original one
        //     "account": "123456789012",  
        //     "time": "2020-02-10T10:22:00Z",  
        //     "resources": [ ],
        //     "region": "us-east-1",
        //     "source": "aws.events",
        //     "detail-type": "Encrypted Events",
        //     "detail": { 
        //       "event-bus-arn": "arn:aws:events:region:account:event-bus/bus-name", 
        //       "rule-arn": "arn:aws:events:region:account:event-bus/bus-name/rule-name", 
        //       "kms-key-arn": "arn:aws:kms:region:account:key/key-arn", 
        //       "encrypted-payload": "AgR4qiru/XNwTUyCgRHqP7rbbHn/xpmVeVeRIAd12TDYYVwAawABABRhd3M6ZXZlbnRzOmV2ZW50LWJ1cwB
        //                             RYXJuOmF3czpldmVudHM6dXMtZWFzdC0xOjE0NjY4NjkwNDY3MzpldmVudC1idXMvY21rbXMtZ2EtY3Jvc3
        //                             MtYWNjb3VudC1zb3VyY2UtYnVzAAEAB2F3cy1rbXMAS2Fybjphd3M6a21zOnVzLWVhc3QtMToxNDY2ODY5"
        //     }
        //   }
        // ```
 
        // Construct an AwsCrypto object with the encryption algorithm `ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY` which 
        // is used by EventBridge for encryption operation. This object is an entry point for decryption operation. 
        // It can later use decryptData(MasterKeyProvider, byte[]) method to decrypt data.
        final AwsCrypto crypto = AwsCrypto.builder()
                .withEncryptionAlgorithm(CryptoAlgorithm.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY)
                .build();
 
        // Construct AWS KMS master key provider with AWS KMS Client Supplier and AWS KMS Key ARN. The KMS Client Supplier can 
        // implement a RegionalClientSupplier interface. The AWS KMS Key ARN can be fetched from kms-key-arn property in 
        // encrypted event json detail.
        final KmsMasterKeyProvider kmsMasterKeyProvider = KmsMasterKeyProvider.builder()
                .customRegionalClientSupplier(...)
                .buildStrict(KMS_KEY_ARN);
 
        // The string of encrypted-payload is base64 encoded. Decode it into byte array, so it can be furthur 
        // decrypted. The encrypted payload can be fetched from encrypted-payload field in encrypted event json detail.
        byte[] encryptedByteArray = Base64.getDecoder().decode(ENCRYPTED_PAYLOAD);
 
        // The decryption operation. It retrieves the encryption context and encrypted data key from the cipher 
        // text headers, which is parsed from byte array encrypted data. Then it decrypts the data key, and 
        // uses it to finally decrypt event payload. This encryption/decryption strategy is called envelope 
        // encryption, https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping
        final CryptoResult<byte[], KmsMasterKey> decryptResult = crypto.decryptData(kmsMasterKeyProvider, encryptedByteArray);
 
        final byte[] decryptedByteArray = decryptResult.getResult();
    
        // Decode the event json plaintext from byte array into string with UTF_8 standard.
        String eventJson = new String(decryptedByteArray, StandardCharsets.UTF_8);
```