

# 在目录存储桶中使用具有 Amazon KMS 密钥的服务器端加密（SSE-KMS）
<a name="s3-express-UsingKMSEncryption"></a>

 Amazon KMS 中的安全控制可帮助您满足与加密相关的合规性要求。可以选择将目录存储桶配置为使用具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS），并使用这些 KMS 密钥保护您在 Amazon S3 目录存储桶中的数据。有关 SSE-KMS 的更多信息，请参阅 [使用具有 Amazon KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)。

**权限**  
要将使用 Amazon KMS key加密的对象上传到 Amazon S3 或从 Amazon S3 中下载该对象，您需要对密钥具有 `kms:GenerateDataKey` 和 `kms:Decrypt` 权限。有关更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[允许密钥用户使用 KMS 密钥进行加密操作](https://docs.amazonaws.cn/kms/latest/developerguide/key-policies.html#key-policy-users-crypto)。有关分段上传所需的 Amazon KMS 权限的信息，请参阅[分段上传 API 和权限](mpuoverview.md#mpuAndPermissions)。

有关用于 SSE-KMS 的 KMS 密钥的更多信息，请参阅[使用 Amazon KMS (SSE-KMS) 指定服务器端加密](specifying-kms-encryption.md)。

**Topics**
+ [Amazon KMS keys](#s3-express-aws-managed-customer-managed-keys)
+ [对跨账户操作使用 SSE-KMS](#s3-express-bucket-encryption-update-bucket-policy)
+ [Amazon S3 存储桶密钥](#s3-express-sse-kms-bucket-keys)
+ [需要 SSE-KMS](#s3-express-require-sse-kms)
+ [加密上下文](#s3-express-encryption-context)
+ [发送对 Amazon KMS 加密对象的请求](#s3-express-aws-signature-version-4-sse-kms)
+ [审计目录存储桶中的 SSE-KMS 加密](#s3-express-bucket-encryption-sse-auditing)
+ [为目录存储桶中的新对象上传指定具有 Amazon KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)

## Amazon KMS keys
<a name="s3-express-aws-managed-customer-managed-keys"></a>

在存储桶的生命周期内，SSE-KMS 配置只能支持每个目录存储桶 1 个 [customer managed key](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)。[https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk) (`aws/s3`) 不受支持。此外，在为 SSE-KMS 指定客户自主管理型密钥后，无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。

可以通过以下方式，确定您为存储桶的 SSE-KMS 配置指定的客户自主管理型密钥：
+ 您发出 `HeadObject` API 操作请求以查找响应中 `x-amz-server-side-encryption-aws-kms-key-id` 的值。

要对数据使用新的客户自主管理型密钥，我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。

当您在目录存储桶中指定用于加密的 [Amazon KMS customer managed key](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk) 时，请仅使用密钥 ID 或密钥 ARN。不支持 KMS 密钥的密钥别名格式。

有关用于 SSE-KMS 的 KMS 密钥的更多信息，请参阅[Amazon KMS keys](UsingKMSEncryption.md#aws-managed-customer-managed-keys)。

## 对跨账户操作使用 SSE-KMS
<a name="s3-express-bucket-encryption-update-bucket-policy"></a>

在对目录存储桶中的跨账户操作使用加密时，请注意以下事项：
+ 如果您希望授予对 S3 对象的跨账户访问权限，请配置客户自主管理型密钥的策略，以支持从其它账户进行访问。
+ 要指定客户自主管理型密钥，必须使用完全限定的 KMS 密钥 ARN。

## Amazon S3 存储桶密钥
<a name="s3-express-sse-kms-bucket-keys"></a>

始终为目录存储桶中的 `GET` 和 `PUT` 操作启用 S3 存储桶密钥，并且不能禁用。当您通过 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_CopyObject.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CopyObject.html)、[https://docs.amazonaws.cn/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_UploadPartCopy.html)、[批量操作中的 Copy 操作](directory-buckets-objects-Batch-Ops.md)或 [import 任务](create-import-job.md)，将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶，或在目录存储桶之间复制时，不支持 S3 存储桶密钥。在这种情况下，每次对 KMS 加密的对象发出复制请求时，Amazon S3 都会调用 Amazon KMS。

对于除 [CopyObject](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CopyObject.html) 和 [UploadPartCopy](https://docs.amazonaws.cn/AmazonS3/latest/API/API_UploadPartCopy.html) 之外的[可用区端点（对象级）API 操作](s3-express-differences.md#s3-express-differences-api-operations)，可以通过 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateSession.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateSession.html) 对请求进行身份验证和为请求授权，以实现低延迟。我们建议存储桶的默认加密使用所需的加密配置，并且不要在 `CreateSession` 请求或 `PUT` 对象请求中覆盖存储桶默认加密。然后，使用所需的加密设置自动对新对象进行加密。要使用 SSE-KMS 加密目录存储桶中的新对象，必须将具有 KMS 密钥（特别是 [customer managed key](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)）的 SSE-KMS 指定为目录存储桶的默认加密配置。然后，在为可用区端点 API 操作创建会话时，将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。有关目录存储桶中加密覆盖行为的更多信息，请参阅 [Specifying server-side encryption with Amazon KMS for new object uploads](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)。

S3 存储桶密钥在 Amazon S3 内限时使用，从而进一步减少了 Amazon S3 向 Amazon KMS 发出请求以完成加密操作的需求。有关使用 S3 存储桶密钥的更多信息，请参阅 [Amazon S3 存储桶密钥](UsingKMSEncryption.md#sse-kms-bucket-keys)和[使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)。

## 需要 SSE-KMS
<a name="s3-express-require-sse-kms"></a>

如果要求对特定目录存储桶中的所有对象使用 SSE-KMS，可以使用存储桶策略。例如，当您使用 `CreateSession` API 操作授予上传新对象的权限（`PutObject`、`CopyObject` 和 `CreateMultipartUpload`）时，如果 `CreateSession` 请求不包括用于请求 SSE-KMS 的 `x-amz-server-side-encryption-aws-kms-key-id` 标头，则以下存储桶策略将拒绝向任何人授予上传对象权限 (`s3express:CreateSession`)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id":"UploadObjectPolicy",
   "Statement":[{
         "Sid":"DenyObjectsThatAreNotSSEKMS",
         "Effect":"Deny",
         "Principal":"*",
         "Action":"s3express:CreateSession",
         "Resource":"arn:aws:s3express:us-east-1:111122223333:bucket/amzn-s3-demo-bucket--usw2-az1--x-s3",
         "Condition":{
            "Null":{
               "s3express:x-amz-server-side-encryption-aws-kms-key-id":"true"
            }
         }
      }
   ]
}
```

------

如要求使用特定 Amazon KMS key 对存储桶中的对象进行加密，可以使用 `s3express:x-amz-server-side-encryption-aws-kms-key-id` 条件键。要指定 KMS 密钥，必须使用 `arn:aws:kms:region:acct-id:key/key-id` 格式的键 Amazon 资源名称（ARN）。Amazon Identity and Access Management 不验证 `s3express:x-amz-server-side-encryption-aws-kms-key-id` 的字符串是否存在。Amazon S3 用于对象加密的 Amazon KMS 密钥 ID 必须与策略中的 Amazon KMS 密钥 ID 匹配，否则 Amazon S3 会拒绝请求。

有关如何将 SSE-KMS 用于新对象上传的更多信息，请参阅[为目录存储桶中的新对象上传指定具有 Amazon KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)。

有关目录存储桶的特定条件键的完整列表，请参阅[使用 IAM 对区域端点 API 操作进行授权](s3-express-security-iam.md)。

## 加密上下文
<a name="s3-express-encryption-context"></a>

对于目录存储桶，*加密上下文* 是一组键值对，其中包含有关数据的上下文信息。不支持额外的加密上下文值。有关加密上下文的更多信息，请参阅[加密上下文](UsingKMSEncryption.md#encryption-context)。



默认情况下，如果您在目录存储桶上使用 SSE-KMS，Amazon S3 将使用存储桶 Amazon 资源名称（ARN）作为加密上下文对：

```
arn:aws:s3express:region:account-id:bucket/bucket-base-name--zone-id--x-s3
```

确保 IAM 策略或 Amazon KMS 密钥策略使用存储桶 ARN 作为加密上下文。

可以选择通过在可用区端点 API 请求（例如 [CreateSession](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateSession.html#API_CreateSession_RequestSyntax)）中使用 `x-amz-server-side-encryption-context` 标头，来提供显式加密上下文对。此标头的值是 UTF-8 编码的 JSON 的 Base64 编码字符串，其中包含作为键值对的加密上下文。对于目录存储桶，加密上下文必须与默认加密上下文 [即存储桶 Amazon 资源名称（ARN）] 相匹配。此外，由于加密上下文未加密，请确保它不包含敏感信息。

您可以使用加密上下文来标识和分类加密操作。还可以通过查看哪个目录存储桶 ARN 与哪个加密密钥一起使用，来使用默认加密上下文 ARN 值跟踪 Amazon CloudTrail 中的相关请求。

在 CloudTrail 日志文件的 `requestParameters` 字段中，如果您在目录存储桶上使用 SSE-KMS，则加密上下文值为存储桶的 ARN。

```
"encryptionContext": {
    "aws:s3express:arn": "arn:aws:s3:::arn:aws:s3express:region:account-id:bucket/bucket-base-name--zone-id--x-s3"
}
```

此外，要在目录存储桶中使用 SSE-KMS 为对象加密，Amazon KMS CloudTrail 事件将记录存储桶 ARN 而不是对象 ARN。

## 发送对 Amazon KMS 加密对象的请求
<a name="s3-express-aws-signature-version-4-sse-kms"></a>

只能通过 HTTPS（TLS）访问目录存储桶。此外，目录存储桶使用 Amazon 签名版本 4（SigV4）对请求进行签名。有关发送针对 Amazon KMS 加密对象的请求的更多信息，请参阅[发送对 Amazon KMS 加密对象的请求](UsingKMSEncryption.md#aws-signature-version-4-sse-kms)。

如果对象使用 SSE-KMS，则不应对 `GET` 请求和 `HEAD` 请求发送加密请求标头。否则，您会收到 HTTP 400 错误请求错误。

## 审计目录存储桶中的 SSE-KMS 加密
<a name="s3-express-bucket-encryption-sse-auditing"></a>

要审计为 SSE-KMS 加密数据使用 Amazon KMS 密钥的情况，您可以使用 Amazon CloudTrail 日志。您可以深入了解自己的[加密操作](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#cryptographic-operations)，例如 [https://docs.amazonaws.cn/kms/latest/developerguide/ct-generatedatakey.html](https://docs.amazonaws.cn/kms/latest/developerguide/ct-generatedatakey.html) 和 [https://docs.amazonaws.cn/kms/latest/developerguide/ct-decrypt.html](https://docs.amazonaws.cn/kms/latest/developerguide/ct-decrypt.html)。CloudTrail 支持多种[属性值](https://docs.amazonaws.cn/awscloudtrail/latest/APIReference/API_LookupEvents.html)来筛选您的搜索，包括事件名称、用户名和事件源。

**Topics**
+ [Amazon KMS keys](#s3-express-aws-managed-customer-managed-keys)
+ [对跨账户操作使用 SSE-KMS](#s3-express-bucket-encryption-update-bucket-policy)
+ [Amazon S3 存储桶密钥](#s3-express-sse-kms-bucket-keys)
+ [需要 SSE-KMS](#s3-express-require-sse-kms)
+ [加密上下文](#s3-express-encryption-context)
+ [发送对 Amazon KMS 加密对象的请求](#s3-express-aws-signature-version-4-sse-kms)
+ [审计目录存储桶中的 SSE-KMS 加密](#s3-express-bucket-encryption-sse-auditing)
+ [为目录存储桶中的新对象上传指定具有 Amazon KMS 的服务器端加密（SSE-KMS）](s3-express-specifying-kms-encryption.md)