对象存储OSS数据加密整体解决方案介绍

一、简介

  数据保护是指数据传输(上传数据至OSS、从OSS下载数据)和处于静止状态(数据存储在OSS数据中心磁盘)期间保护数据。可以使用SSL或者客户端加密保护传输中的数据。也可以采用以下方式保护静态数据:

  • 使用服务器端加密 (SSE) --OSS将数据保存到数据中心的磁盘之前进行加密,并且在下载对象时自动进行解密;
  • 使用客户端加密(CSE) --可以使用客户端加密SDK,在本地进行数据加密,并将加密后的数据上传到OSS。在这种场景下,用户需要管理加密过程以及加密密钥。

对象存储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能够提供更大的灵活性,包括创建、轮转、禁用和自定义访问控制,以及审核用于保护数据的加密密钥能力。

对象存储OSS数据加密整体解决方案介绍

如上是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-idHeader头:

•    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)。其具体工作原理如下:
对象存储OSS数据加密整体解决方案介绍

  • 上传对象:--通过使用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)

  使用用户自主管理密钥,需要用户自主生成、保管加密密钥。当用户本地客户端加密时,由用户自主上传加密密钥(对称加密密钥或者非对称加密密钥)至本地加密客户端。其具体加密过程如下:
对象存储OSS数据加密整体解决方案介绍

  • 上传对象:--用户首先向本地加密客户端提供1个用户主密钥(对称密钥或者非对称密钥)。客户端只使用此主密钥加密其随机生成的数据密钥。该过程如下:

    • OSS本地加密客户端会在本地生成一个一次性的对称密钥(Data Key)。它将用于加密单个对象(针对每个对象,客户端都会随生成1个数据密钥);
    • 客户端使用“数据密钥(Data key)”加密对象;
    • 客户端使用用户提供的主密钥来加密“数据密钥(Data key)”;
    • 客户端会将加密的数据密钥(Encrypted Data Key)作为对象元数据的一部分上传至OSS。
  • 下载对象:--下载对象时,客户端首先从OSS下载加密的对象以及元数据。通过使用元数据中的材料,客户端将授权会确定使用哪个主密钥来解密加密的数据密钥(Encrypted Data Key)。客户端解密后的数据密钥(Data Key)来解密对象。
注意:
•OSS本地加密客户端不会将用户主密钥以及未加密的数据发送至OSS。所以,请务必妥善保管加密密钥,如果密钥丢失,将无法解密数据;
•    数据密钥(Data Key)由本地加密客户端随机生成;
上一篇:MEAN架构实战:基于MongoDB、Express、Angular、Node.js构建企业级应用


下一篇:努力学习 HTML5 (4)—— 浏览器对语义元素的支持情况