ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

对象网关服务器端加密

2021-06-19 13:02:52  阅读:479  来源: 互联网

标签:customer 网关 加密 服务器端 对象 密钥 SSE


对象网关支持上传对象的服务器端加密,有 3 个管理加密密钥的选项。 服务器端加密意味着数据以未加密的形式通过 HTTP 发送,对象网关以加密形式将该数据存储在 Ceph 存储集群中。

服务器端加密请求必须通过安全的 HTTPS 连接发送,以避免以明文形式发送机密。 如果代理用于 SSL 终止,则必须启用rgw trust forwarded https,然后转发的请求才会被信任为安全。

客户提供密钥的服务器端加密

在此模式下,客户端将加密密钥与读或写加密数据的每个请求一起传递。 管理这些密钥并记住使用哪个密钥加密每个对象是客户端的责任。

这是根据 Amazon SSE-C 规范在 S3 中实现的。

由于所有密钥管理均由客户端处理,因此无需特殊配置即可支持此加密模式。

使用具有客户提供密钥的服务器端加密 (SSE-C) 时,客户端管理加密密钥,而 RGW 管理加密(在它对磁盘进行写入时)和解密(在您访问您的对象时)。

服务器端加密是为了保护静态数据。服务器端加密仅加密对象数据而不是对象元数据。使用客户提供的加密密钥的服务器端加密 (SSE-C) 允许设置自己的加密密钥。使作为请求的一部分提供的加密密钥,RGW在其写入磁盘时管理加密,并在访问对象时管理解密。因此,不需要维护任何代码来执行数据加密和解密。只需管理您提供的加密密钥。在上传对象时,RGW将使用客户提供的加密密钥对数据应用 AES-256 加密并从内存中移除加密密钥。在检索对象时,必须提供相同的加密密钥作为请求的一部分。RGW 在将对象数据返回之前,会首先验证提供的加密密钥是否匹配,然后再解密对象。

要点

RGW不存储客户提供的加密密钥,而是存储加密密钥添加了随机数据的 HMAC 值来验证未来的请求。无法使用添加了随机数据的 HMAC 值来推导出加密密钥的值或解密加密对象的内容。这意味着,如果客户丢失加密密钥,则会失去该对象。

SSE-C 概览

• 必须使用 HTTPS。

重点

在使用 SSE-C 时,RGW会拒绝通过 HTTP 提出的所有请求。出于安全原因,建议您考虑您错误地使用 HTTP 发送的任何密钥都将被外泄。应丢弃该密钥,并根据需要轮换密钥。

• 响应中的 ETag 不是对象数据的 MD5。

• 管理哪个加密密钥用于加密哪个对象的映射。RGW不存储加密密钥。客户负责跟踪为哪个对象提供了哪个加密密钥。

• 如果桶启用了版本控制,则使用此功能上传的每个对象版本可能都具有自己的加密密钥。客户负责跟踪哪个加密密钥用于哪个对象版本。

• 因为您在客户端管理加密密钥,所以也要在客户端管理所有额外的保护措施,例如密钥轮换。

警告

如果客户丢失加密密钥,则针对某个对象的没有其加密密钥的任何 GET 请求都会失败,并且将失去该对象。

使用 REST API 指定采用客户提供的加密密钥的服务器端加密

在使用 REST API 创建对象时,可以使用客户提供的加密密钥 (SSE-C) 指定服务器端加密。使用 SSE-C时,必须使用以下请求标头提供加密密钥信息。

名称描述
x-amz-server-side-
encryption-customer-
algorithm
使用此标头来指定加密算法。标头值必须为“AES256”。
x-amz-server-side-
encryption-customer-
key
使用此标头来提供 256 位的 base64 编码的加密密钥以供 RGW用于加密或解密数据。
x-amz-server-side-
encryption-customer-
key-MD5
使用此标头根据 RFC 1321 提供加密密钥的 base64 编码的 128 位 MD5 摘要。RGW使用此标头进行消息完整性检查以确保加密密钥的传输无误。

可以使用 AWS 开发工具包包装库将这些标头添加到请求中。如果需要,可以直接在应用程序中调用 S3 REST API。

支持 SSE-C 的 S3 REST API

以下 Amazon S3 API 支持使用客户提供的加密密钥进行服务器端加密 (SSE-C)。

• GET 操作 — 在使用 GET API 检索对象(请参阅 GET Object)时,可以指定请求标头。使用 SSE-C 加密的对象不支持 Torrent。

• HEAD 操作 — 要使用 HEAD API 检索对象元数据(请参阅 HEAD Object),可以指定这些请求标头。

• PUT 操作 — 使用 PUT Object API 上传数据(请参阅 PUT Object)时,可以指定这些请求标头。

• 分段上传 — 在使用分段上传 API 上传大对象时,可以指定这些标头。可以在以下请求中指定这些标头:启动请求(请参阅启动分段上传)和每个后续分段上传请求(请参阅上传分段上传分段 - 复制))。对于每个分段上传请求,加密信息必须与在启动分段上传请求中提供的信息相同。

• POST 操作 — 使用 POST 操作上传对象(请参阅 POST Object)时,可在表单字段而不是请求标头中提供相同的信息。

• Copy 操作 — 复制对象(请参阅 PUT Object - Copy)时,同时具有源对象和目标对象:

• 如果希望使用具有 AWS 托管密钥的服务器端加密对目标对象加密,则必须提供 x-amz-server-side-encryption 请求标头。

• 如果希望使用 SSE-C 对目标对象加密,则必须使用上表中描述的三个标头提供加密信息。

• 如果源对象是使用 SSE-C 加密的,则必须使用以下标头提供加密密钥信息,以便 Amazon S3 可以解密对象以进行复制。

名称描述
x-amz-copy-source
-server-side
-encryption-
customer-algorithm
包括此标头以指定RGW用于解密源对象的算法。此值必须是AES256。
x-amz-copy-source
-server-side
-encryption-
customer-key
包括此标头以提供 base64 编码的加密密钥,供 RGW用于解密源对象。
此加密密钥必须是在创建源对象时为RGW 提供的加密密钥。否则,RGW无法解密对象。
x-amz-copy-
source-server-
side-encryption-
customer-key-MD5
包括此标头以根据 RFC 1321 提供加密密钥的 base64 编码的 128 位MD5 摘要。

生成SSE-C方式的加密秘钥,以及秘钥的MD5值的脚本

#!/usr/bin/python
import hashlib
import base64

#计算Base64字符串
def toBase64String(data):
	return base64.b64encode(data).decode("utf-8")
	
# 计算MD5字符串
def computeMD5(b64Data):
	md5=hashlib.md5()
	md5.update(b64Data)
	byteArray = md5.digest()
	return toBase64String(byteArray)

#解码Base64字符串
def fromBase64(b64Data):
	return base64.b64decode(bytearray(b64Data, encoding='utf-8'))

# 加密秘钥示例:长度32的字符串,用于生成256 bit的密钥;该秘钥可根据业务需要自行修改,但长度必须为32个字符,及256 bit的字符串

keyString = "0123456789ABCDEF0123456789ABCDEF"
	
# 计算x-obs-server-side-encryption-customer-key头域
customerKey= toBase64String(bytearray(keyString, encoding='utf-8'))
print("customer key is : \n" + customerKey)

# 计算x-obs-server-side-encryption-customer-key-MD5头域
customerKeyMD5 = computeMD5(fromBase64(customerKey))
print("md5 for customer key is : \n" + customerKeyMD5)

使用aws cli访问对象存储

以上传对象为例:

aws s3api  put-object --endpoint-url=https://XX.XX.XX.XX --profile  cx --bucket=test-bucket --key aws1.zip --body awscliv2_aarch64.zip --server-side-encryption AES256 --sse-customer-algorithm  AES256 --sse-customer-key Y2FvaGFpZmVuZ2xvdmV4dWp1YW4wMTIzNDU2Nzg5QUI= --sse-customer-key-md5 Oq74IF8pys1D2IfPNssUSw==

密钥管理服务

这种模式允许将密钥存储在安全的密钥管理服务中,并由 Ceph 对象网关按需检索,以处理加密或解密数据的请求。

这是根据 Amazon SSE-KMS 规范在 S3 中实现的。

原则上,这里可以使用任何密钥管理服务,但目前仅实现了与 Barbican 的集成。

请参阅 OpenStack Barbican 集成

标签:customer,网关,加密,服务器端,对象,密钥,SSE
来源: https://blog.csdn.net/QTM_Gitee/article/details/118052365

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有