AWS实战 - 对S3数据加密方式的总结
名词解释
- KMS: AWS Key Management Service,
AWS
的密钥托管服务; - 数据加密密钥: 用于对
S3
对象进行加密的密钥; - 主密钥: 也叫客户主密钥或
CMK
,根据不同的加密方式,主密钥有可能直接用于加密S3
对象,也有可能用于加密数据加密密钥; - 托管: 在本文中,是指对密钥进行管理,包括对密钥的创建、启用、停用及轮换等各种操作;
介绍
- 服务器端加密:请求
Amazon S3
在将对象保存到数据中心的磁盘上之前加密对象,并在下载对象时进行解密。 - 客户端加密:可以在客户端加密数据并将加密的数据上传到
Amazon S3
。在这种情况下,您需要管理加密过程、加密密钥和相关的工具。
服务器端加密不会修改现有的S3
访问方式,客户端加密则需要配合各种语言的AWS
开发工具包来完成访问。
S3
的服务器端加密分为以下3种具体的方式:
SSE-KMS
(使用KMS托管密钥的服务器端加密)SSE-S3
(使用S3托管密钥的服务器端加密)SSE-C
(使用客户托管密钥的服务器端加密)
S3
的客户端加密分为以下2种具体的方式:
- 使用
KMS
托管客户主密钥 - 使用客户端主密钥
SS3-KMS
(使用KMS
托管密钥的服务器端加密)
SS3-KMS
是利用AWS-KMS
服务托管的CMK
来对数据机密,使用这种加密方式的控制台操作步骤如下:
- 创建一个文件夹,或者对一个文件夹单击右键,选择更改加密;
- 选择
AWS-KMS
,在下拉框中选择需要使用的KMS
密钥; - 此时文件夹中所有对象都已经启用了数据加密,进入
IAM
面板,选择左侧最下方的加密密钥标签可以对KMS
密钥进行管理;
第2步中,如果你之前创建过KMS
密钥,可以在这里看到所有的密钥列表,如果之前从来没创建,也可以看到一个aws/s3
的选项,它是S3
创建的默认KMS
密钥,使用它可以免去手动创建的过程,但该密钥的灵活性较差。
需要说明的是,这样操作只是对目前文件夹中的所有对象进行了加密,之后再写入的对象并不会自动进行数据加密,针对这种情况,可以使用存储桶策略进行控制,如果写入的对象未使用指定的数据加密,则拒绝其行为,详情参考使用具有AWS KMS托管密钥的服务器端加密(SSE-KMS)保护数据。
SSE-S3
(使用S3
托管密钥的服务器端加密)
SSE-S3
使用唯一的数据加密密钥来加密数据,再使用定期轮换的主密钥来加密数据加密密钥,但整个过程都是由S3
托管的,用户无法感知,无法接触到密钥,有点像黑箱。使用这种加密的方式基本与SSE-KMS
一样,只是在选择加密方式的时候选择AES-256
即可,并且加密后也无法像第3步中那样列出相关密钥;
SSE-C
(使用客户托管密钥的服务器端加密)
SSE-C
是用户将密钥和对象一起提供给S3
,S3
使用密钥对对象进行加密后再存储,检索对象时也需要提供该密钥,S3
则是帮助用户完成加密和解密的过程。该加密方式无法在控制台中完成,只能通过SDK
或者API
的方式完成(支持控制台操作的SSE-KMS
和SSE-S3
同样也支持SDK
和API
)。
使用KMS
托管客户主密钥
这种加密方式看着有点复杂,并且需要SDK
来完成,其步骤简单总结如下:
- 用户请求
KMS
,KMS
返回数据加密密钥纯文本及数据加密密钥的密码blob
;(what is key blob?) - 用数据加密密钥加密对象,然后将对象和
blob
上传到S3
,blob
保存在对象的元数据中; - 下载
S3
对象时,从对象的元数据中获取blob
; - 将下载对象的
blob
发送给KMS
,KMS
返回密钥纯文本,客户端使用其解密数据;
使用客户端主密钥
这种加密方式同样需要SDK
,步骤如下:
SDK
(或者叫Amazon S3
加密客户端)在本地对每个对象生成数据加密密钥,并对对象加密;- 使用客户自己生成的密钥(须符合一定的加密要求)对每个数据加密密钥进行加密;
- 加密后的数据加密密钥保存在对象的元数据中;
- 下载
S3
对象时,从对象的元数据中获取加密后的数据加密密钥,确定主密钥; - 使用主密钥解密数据加密密钥,使用数据加密密钥解密对象;