实现思路
加密特性的方案,涉及如下设计点:
- 密钥的用途
- 加密的位置
- 加密的算法
- 加密密钥的使用
- 加密密钥的管理
密钥的用途
密钥的用途分为管理密钥和数据密钥。
管理密钥用于加密数据密钥,需要定期更换,更换成本低;假如管理密钥丢失,则导致数据密钥无法解密,从而丢失数据。
数据密钥用于加密数据,需要妥善管理,使用数据密钥加密数据后,如果丢失数据的加密密钥,则导致丢失数据。
数据密钥的生命周期一般和对象的生命周期保持一致。
加密的位置
包括客户端和服务端。
客户端加密
方案一,加密操作完全由客户端自行实现。
使用客户自定义的加密方式、加密算法、加密密钥,对数据进行加密,相关实现由客户的开发团队提供。
此时算法、密钥均可由客户端管理,对象存储完全不感知相关操作。
方案二,加密操作由对象存储客户端SDK提供,客户应用负责集成SDK。
此时算法、密钥等,可以由对象存储的客户端SDK管理,也可由客户应用管理。
服务侧加密
使用服务侧提供的方式,在数据持久层完成加密、解密操作,客户端上传、下载时均访问明文。
客户和服务同时提供加密
可以在客户端、服务端同时实现加密特性,对于数据的安全提供双重的保障,当然引入了更多的管理成本,更多的算力的需求。
加密算法
对于存储系统而言,可行的算法比如AES-XTS
、AES-GCM
等。
密钥的长度,比如128、256等。
参考资料如下:
加密密钥的使用
主要考虑加密密钥的使用范围,对于对象存储而言,数据密钥的影响范围,比如可以有
- 租户,即租户下所有的桶,均使用本密钥。
- 子用户,即子用户下所有的桶,均使用本密钥。
- 桶,即桶下的所有对象,均使用本密钥。
- 对象,按照对象来指定加密的密钥。
加密密钥的管理
实现方案需考虑如下几点:
- 管理角色
- 存储位置
- 轮换策略
密钥的管理职责,可由客户端、对象存储服务、第三方密钥管理服务来承载。
在上述方案做出选择后,决定了密钥的存储服务和轮换策略。
参考资料
AWS S3
- Protecting data with encryption
- Protecting data with server-side encryption
- Amazon S3 now automatically encrypts all new objects
- Using server-side encryption with Amazon S3 managed keys (SSE-S3)
Amazon S3 now applies server-side encryption with Amazon S3 managed keys (SSE-S3) as the base level of encryption for every bucket in Amazon S3. Starting January 5, 2023, all new object uploads to Amazon S3 are automatically encrypted at no additional cost and with no impact on performance.
- Using server-side encryption with AWS KMS keys (SSE-KMS)
- Using dual-layer server-side encryption with AWS KMS keys (DSSE-KMS)
- Using server-side encryption with customer-provided keys (SSE-C)
- Protecting data by using client-side encryption