一、简介
数据保护是指数据传输(上传数据至OSS、从OSS下载数据)和处于静止状态(数据存储在OSS数据中心磁盘)期间保护数据。可以使用SSL或者客户端加密保护传输中的数据。也可以采用以下方式保护静态数据:
- 使用服务器端加密 (SSE) --OSS将数据保存到数据中心的磁盘之前进行加密,并且在下载对象时自动进行解密;
- 使用客户端加密(CSE) --可以使用客户端加密SDK,在本地进行数据加密,并将加密后的数据上传到OSS。在这种场景下,用户需要管理加密过程以及加密密钥。
二、使用服务器端(SSE)加密保护数据
使用服务器端加密方式保护静态数据,即OSS将用户数据写入数据中心内的磁盘时,会在对象级别加密数据,并且在访问这些数据时自动解密。用户只需要验证请求是否拥有访问权限。当前OSS支持如下两种服务端加密方式(注意:不能对同一对象同时应用两种不同类型的服务器端加密方式):
- 使用由OSS完全托管的服务端加密功能(SSE-OSS):数据加密密钥的生成和管理,由OSS负责,并采用高强度、多因素的安全措施进行保护。数据加密的算法采用使用行业标准的强加密算法AES-256(即256位高级加密标准)。
- 使用由KMS托管密钥的服务端加密功能(SSE-KMS):除了采用AES-256加密算法外,KMS负责保管用户主密钥CMK(对数据密钥进行加密的密钥),以及生成数据加密的密钥,通过信封加密机制,进一步防止未经授权的数据访问。其中,会涉及少量额外的KMS密钥API调用费用(参考:KMS计费标准)。
2.1使用由KMS托管密钥的服务器端加密(SSE-KMS)
阿里云KMS(Key Management Service)是一项安全、高度可靠的密钥管理系统。当用户上传Object时,在请求中携带x-oss-server-side-encryption
的HTTP Header,并指定其值为KMS,KMS将使用系统默认创建的CMK加密该对象,若用户在请求中指定了X-OSS-server-side-encrpytion-key-id
, 那么OSS将使用指定的CMK进行加解密。使用用户自主指定的CMK能够提供更大的灵活性,包括创建、轮转、禁用和自定义访问控制,以及审核用于保护数据的加密密钥能力。
如上是SSE-KMS服务端加密的逻辑示意图。关于Customer Master Key的生成方式有多种,如下一一介绍:
-
使用OSS默认托管的KMS密钥:当用户上传object时,在请求中携带
X-OSS-server-side-encrpytion
并指定其值为KMS。OSS将使用默认托管的CMK加密每个对象,并且在下载时自定解密; -
使用用户指定的CMK :当用户上传object时,在请求中指定
X-oss-server-side-encrpytion-key-id
为具体的CMK ID。OSS将使用指定的CMK(密钥材料来源于阿里云KMS)来加密每个对象。并且加密object的CMK ID记录到对象的元数据中,因此具有解密权限的用户下载对象时自动进行解密。 -
使用用户BYOK材料进行加密:目前阿里云KMS服务支持导入用户自己的BYOK密钥材料。如下图所示,用户创建1个不带密钥材料的CMK,并按照提示导入外部密钥材料。当用户上传object时,在请求中指定
X-oss-server-side-encrpytion-key-id
为使用外部密钥材料的CMK ID。
注意:
• 当首次向某区域中的bucket上传对象时,系统自动为您创建1个默认的CMK。用户可以在KMS控制台查看该密钥信息;
• 可以选择自行创建和管理的加密密钥(CMK),也可以选择使用由OSS服务按照Region级别为客户生成的默认服务密钥;
• 响应中的ETAG不是对象数据的MD5;
• 可以在控制台创建、轮换或者禁用主密钥;
• 用户需要实现开通KMS服务;
• 使用“服务端加密-KMS托管主密钥”加解密对象时,会产生一定的KMS请求调用费用;
• 用于加密数据的数据密钥也会被加密,并且作为Object的元数据信息一并存储;
• KMS托管密钥的服务器端加密方式仅加密对象数据,不会加密任何对象的元数据;
目前以下操作,支持在请求中携带x-oss-server-side-encryption
以及X-oss-server-side-encrpytion-key-id
Header头:
• Put Object: 简单上传
• Copy Object: 复制Object
• Initiate Multipart Upload:
通过服务器端加密存储的object时,以下API请求中OSS会返回x-oss-server-side-encryption
头以及X-oss-server-side-encrpytion-key-id
:
• Put Object
• Post Object
• Copy Object
• Initiate Multipart Upload
• Upload Part
• Complete Multipart Upload
• Get Object
• Head Object
2.2使用由OSS完全托管加密密钥的服务器端加密(SSE-OSS)
服务器端加密是为了保护静态数据,使用OSS完全托管加密密钥的服务器端加密,采用了诸多强安全措施进行加密。当用户创建对象时(即上传新对象或者复制现有对象),只需要在请求中携带x-oss-server-side-encryption标头,并且指定其值为AES256。即可实现OSS完全托管加密密钥的服务器端加密。OSS使用AES256加密方式加密客户的数据,作为额外的保护,系统采用CMK主密钥加密密钥本身。
以下操作,支持在请求中携带这些HTTP Header:
• Put Object: 简单上传
• Copy Object: 复制Object
• Initiate Multipart Upload:
使用multipart upload上传大型对象时,可以通过为每个分段上传请求添加x-oss-server-side-encryption
标头来指定服务器端加密。调用copy object时,无论原对象是否已经加密,都不会加密目标对象,除非显示的在拷贝操作中指定了x-oss-server-side-encryption
请求头。
3.使用客户端(CSE)加密保护数据
客户端加密是指将数据发送到OSS之前在用户本地进行加密,对于数据加密密钥的使用,目前支持如下两种方式:
- 使用KMS托管用户主密钥(CSE-KMS)
- 使用用户自主管理密钥(CSE-C)
3.1使用KMS托管用户主密钥(CSE-KMS)
当使用KMS托管用户主密钥用于客户端数据加密时,无需向OSS加密客户端提供任何加密密钥。只需要在上传对象时指定KMS用户主密钥ID(也就是CMK ID)。其具体工作原理如下:
-
上传对象:--通过使用CMK ID,客户端首先会向KMS发送一个请求,申请1个用于加密对象的数据密钥(Data key)。作为响应,KMS会返回一个随机生成的数据明文密钥(Data key),以及数据密文密钥(Encrypted data key);
- 本地加密数据:--本地客户端接收到KMS返回的数据明文密钥(Data key)以及数据密文密钥(Encrypted data key)后,将使用数据明文密钥(**Data key)进行本地加密,并且将加密后的对象以及数据密文密钥(Encrypted data key)上传至OSS;
-
下载对象:--客户端首先会从OSS服务端下载加密的对象以及作为对象元数据存储的数据密文密钥(Encrypted data key)。
- 解密数据:客户端将数据密文密钥(Encrypted data key)以及CMK ID发送至KMS服务器。作为响应,KMS将使用指定的CMK解密,并且将数据明文密钥(Data key)返回给本地加密客户端;
注意:
• 本地加密客户端为每一个上传的对象获取一个唯一的数据加密密钥;
• 为了保证数据的安全性,建议CMK定期轮换或者更新;
• 客户需要维护CMK ID与对象之间的映射关系;
3.2使用用户自主管理密钥(CSE-C)
使用用户自主管理密钥,需要用户自主生成、保管加密密钥。当用户本地客户端加密时,由用户自主上传加密密钥(对称加密密钥或者非对称加密密钥)至本地加密客户端。其具体加密过程如下:
-
上传对象:--用户首先向本地加密客户端提供1个用户主密钥(对称密钥或者非对称密钥)。客户端只使用此主密钥加密其随机生成的数据密钥。该过程如下:
- OSS本地加密客户端会在本地生成一个一次性的对称密钥(Data Key)。它将用于加密单个对象(针对每个对象,客户端都会随生成1个数据密钥);
- 客户端使用“数据密钥(Data key)”加密对象;
- 客户端使用用户提供的主密钥来加密“数据密钥(Data key)”;
- 客户端会将加密的数据密钥(Encrypted Data Key)作为对象元数据的一部分上传至OSS。
- 下载对象:--下载对象时,客户端首先从OSS下载加密的对象以及元数据。通过使用元数据中的材料,客户端将授权会确定使用哪个主密钥来解密加密的数据密钥(Encrypted Data Key)。客户端解密后的数据密钥(Data Key)来解密对象。
注意:
•OSS本地加密客户端不会将用户主密钥以及未加密的数据发送至OSS。所以,请务必妥善保管加密密钥,如果密钥丢失,将无法解密数据;
• 数据密钥(Data Key)由本地加密客户端随机生成;