亚马逊AWS官方博客

Amazon S3 Express One Zone 存储类现在支持将 AWS KMS 与客户管理的密钥结合使用



Amazon S3 Express One Zone 存储类是一个高性能、单可用区(AZ)的 S3 存储类,现在支持使用 AWS Key Management Service(KMS)密钥(SSE-KMS)执行服务器端加密。 默认情况下,S3 Express One Zone 已经使用 Amazon S3 托管式密钥(SSE-S3)S3 目录存储桶中存储的所有对象进行加密。从今天开始,您可以使用 AWS KMS 客户管理的密钥对静态数据进行加密,而不会影响性能。借助这项新推出的加密功能,您可以在使用 S3 Express One Zone 时获得一个用于满足合规性和监管要求的额外选项。S3 Express One Zone 旨在为您最常访问的数据和延迟敏感型应用程序提供一致的个位数毫秒级数据访问。

使用 S3 目录存储桶,您可以为每个存储桶只指定一个客户管理的密钥,以进行 SSE-KMS 加密。添加客户管理的密钥之后,您将无法对其进行编辑以使用新密钥。另一方面,使用 S3 通用存储桶,您可以通过更改存储桶的默认加密配置或者在 S3 PUT 请求期间使用多个 KMS 密钥。将 SSE-KMS 与 S3 Express One Zone 结合使用时,S3 存储桶密钥始终处于启用状态。S3 存储桶密钥是免费的,可以将向 AWS KMS 发出的请求数量减少多达 99%,因此优化了性能和成本。

将 SSE-KMS 与 Amazon S3 Express One Zone 存储类结合使用
为了向您展示这项新功能的实际应用,我首先按照创建 S3 目录存储桶中的步骤在 Amazon S3 控制台中创建一个 S3 目录存储桶,并使用 apne1-az4 作为可用区。在基本名称中,我输入 s3express-kms,接下来,系统会自动添加一个包含可用区 ID 的后缀,以创建最终名称。随后,我选中复选框以确认数据存储在单个可用区中,然后选中创建存储桶

现在,我们将介绍如何使用 AWS 命令行界面(AWS CLI)在刚刚创建的存储桶上设置加密。

要通过 AWS CLI 将 SSE-KMS 与 S3 Express One Zone 结合使用,您需要拥有使用如下策略AWS Identity and Access Management(IAM)用户身份角色。此策略允许执行 CreateSession API 操作,这是成功将加密文件上传到您的 S3 目录存储桶和从中下载加密文件所必需的。

{
   "Version": "2012-10-17",
   "Statement": [
	{
	   "Effect": "Allow",
	   "Action": [
		"s3express:CreateSession"
		 ],
	   "Resource": [
		"arn:aws:s3express:*:<account>:bucket/s3express-kms--apne1-az4--x-s3"
		]
		},
	    {
		"Effect": "Allow",
		"Action": [
			"kms:Decrypt",
			"kms:GenerateDataKey"
			],
		"Resource": [
			"arn:aws:kms:*:<account>:key/<keyId>"
			]
	    }
   ]
}

我将使用 PutBucketEncryption API 将我的默认存储桶加密设置为 SSE-KMS。 下面是 AWS CLI 的一个示例:

aws s3api put-bucket-encryption \
--bucket s3express-kms--apne1-az4--x-s3 \
--server-side-encryption-configuration \
  '{"Rules": [{"ApplyServerSideEncryptionByDefault":\
   {"SSEAlgorithm": "aws:kms", \
    "KMSMasterKeyID": "1234abcd-12ab-34cd-56ef-1234567890ab"\
   },\
  "BucketKeyEnabled":true}]}'

系统将使用我的 AWS KMS 密钥,自动对我上传到此 S3 目录存储桶的任何新对象进行加密。使用 PutObject 命令,我将一个名为 confidential-doc.txt 的新文件上传到我的 S3 目录存储桶中。

aws s3api put-object --bucket s3express-kms--apne1-az4--x-s3 \
--key confidential-doc.txt \
--body confidential-doc.txt

成功执行上述命令之后,我收到了如下输出:

{
    "ETag": "\"664469eeb92c4218bbdcf92ca559d03b\"",
    "ChecksumCRC32": "0duteA==",
    "ServerSideEncryption": "aws:kms",
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:<accountId>:key/<keyId>",
    "BucketKeyEnabled": true
}

使用 HeadObject 命令检查对象的属性时,我发现它是使用 SSE-KMS 和我之前创建的密钥加密的:

aws s3api head-object --bucket s3express-kms--apne1-az4--x-s3 \
--key confidential-doc.txt

我得到了如下输出:

 
{
    "AcceptRanges": "bytes",
    "LastModified": "2024-08-21T15:29:22+00:00",
    "ContentLength": 5,
    "ETag": "\"664469eeb92c4218bbdcf92ca559d03b\"",
    "ContentType": "binary/octet-stream",
    "ServerSideEncryption": "aws:kms",
    "Metadata": {},
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:<accountId>:key/<keyId>",
    "BucketKeyEnabled": true,
    "StorageClass": "EXPRESS_ONEZONE"
}

我使用 GetObject 下载加密的对象:

aws s3api get-object --bucket s3express-kms--apne1-az4--x-s3 \
--key confidential-doc.txt output-confidential-doc.txt

由于我的会话具有必要的权限,因此系统会自动下载和解密此对象。

{
    "AcceptRanges": "bytes",
    "LastModified": "2024-08-21T15:29:22+00:00",
    "ContentLength": 5,
    "ETag": "\"664469eeb92c4218bbdcf92ca559d03b\"",
    "ContentType": "binary/octet-stream",
    "ServerSideEncryption": "aws:kms",
    "Metadata": {},
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:<accountId>:key/<keyId>",
    "BucketKeyEnabled": true,
    "StorageClass": "EXPRESS_ONEZONE"
}

对于第二个测试,我使用另一个 IAM 用户身份,但没有为其策略授予下载此对象所必需的 KMS 密钥权限。这一尝试由于 AccessDenied 错误而失败,表明 SSE-KMS 加密按预期运行。

调用 CreateSession 操作时发生错误(AccessDenied):访问被拒绝

这一演示展示了 SSE-KMS 如何与 S3 Express One Zone 无缝协作,在为经过授权的用户维持易用性的同时,提供了一层额外的安全性。

注意事项
入门 – 您可以使用 AWS CLI 或 AWS 开发工具包为 S3 Express One Zone 启用 SSE-KMS。将您的 S3 目录存储桶的默认加密配置设置为 SSE-KMS,并指定您的 AWS KMS 密钥。请记住,每个 S3 目录存储桶在其生命周期内只能使用一个客户管理的密钥。

区域 – 在目前推出了 S3 Express One Zone 的所有 AWS 区域中,都为使用客户管理的密钥的 SSE-KMS 提供了 S3 Express One Zone 支持。

性能 – 将 SSE-KMS 与 S3 Express One Zone 结合使用时,不会影响请求延迟。您将继续体验到同样的个位数毫秒级数据访问。

定价 – 您需要支付 AWS KMS 费用,以生成和检索用于加密和解密的数据密钥。请访问 AWS KMS 定价页面,以了解更多详细信息。此外,将 SSE-KMS 与 S3 Express One Zone 结合使用时,对于除 CopyObjectUploadPartCopy 以外的所有数据面板操作,都会默认启用 S3 存储桶密钥,并且无法将它们禁用。这样可以将向 AWS KMS 发出的请求数量减少多达 99%,因此优化了性能和成本。

AWS CloudTrail 集成 – 您可以使用 AWS CloudTrail 审核 S3 Express One Zone 对象上的 SSE-KMS 操作。有关更多信息,请阅读我之前发表的博客文章

– Eli。

2024 年 9 月 19 日更新 – 我们更新了 CLI 示例,以便为现有的存储桶而不是控制台配置默认加密。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。