本文介绍如何使用OSS的服务器端加密功能,对持久化在OSS上的数据进行加密保护。

OSS支持在服务器端对上传的数据进行加密编码(Server-Side Encryption):上传数据时,OSS对收到的用户数据进行加密编码,然后再将得到的加密数据持久化保存下来;下载数据时,OSS自动对保存的加密数据进行解密并把原始数据返回给用户,并在返回的HTTP请求Header中,声明该数据进行了服务器端加密。

应用场景

OSS通过服务器端加密机制,提供静态数据保护。适合于对于文件存储有高安全性或者合规性要求的应用场景。例如,深度学习样本文件的存储、在线协作类文档数据的存储。针对不同的应用场景,OSS有如下两种服务器端加密方式:

  • 使用KMS托管密钥进行加解密(SSE-KMS)
    上传文件时,可以使用指定的CMK ID或者默认KMS托管的CMK进行加解密操作。这种场景适合于大量的数据加解密。数据无需通过网络发送到KMS服务端进行加解密,这是一种低成本的加解密方式。
    注意 使用KMS密钥功能时会产生少量的KMS密钥API调用费用。
  • 使用OSS完全托管加密(SSE-OSS)

    基于OSS完全托管的加密方式,是Object的一种属性。OSS服务器端加密使用AES256加密每个对象,并为每个对象使用不同的密钥进行加密,作为额外的保护,它将使用定期轮转的主密钥对加密密钥本身进行加密。该方式适合于批量数据的加解密。

注意 同一对象同一时间仅可以使用一种服务器端加密方式。

操作方式

原理介绍

  • 使用KMS托管密钥进行加解密

    KMS(Key Management Service)是阿里云提供的一款安全、易用的管理类服务。用户无需花费大量成本来保护密钥的保密性、完整性和可用性,借助密钥管理服务,用户可以安全、便捷的使用密钥,专注于开发加解密功能场景。用户可以通过KMS控制台中查看和管理KMS密钥。

    除了采用AES-256加密算法外,KMS负责保管用户主密钥CMK(对数据密钥进行加密的密钥),以及生成数据加密的密钥,通过信封加密机制,进一步防止未经授权的数据访问。

    SSE-KMS服务器端加密的逻辑示意图如下。

    关于Customer Master Key的生成方式有多种:
    • 使用OSS默认托管的KMS密钥

      您可以将Bucket默认的服务器端加密方式设置为KMS且不指定具体的CMK ID,也可以在上传Object或修改Object的meta信息时,在请求中携带X-OSS-server-side-encryption并指定其值为KMS且不指定具体的CMK ID。OSS将使用默认托管的CMK生成不同的密钥来加密不同的对象,并且在下载时自动解密。

    • 使用BYOK进行加密

      服务器端加密支持使用BYOK进行加密,您可以将Bucket默认的服务器端加密方式设置为KMS并指定具体的CMK ID,也可以在上传Object或修改Object的meta信息时,在请求中携带X-OSS-server-side-encryption,指定其值为KMS,并指定X-OSS-server-side-encryption-key-id为具体的CMK ID。OSS将使用指定的CMK生成不同的密钥来加密不同的对象,并将加密Object的CMK ID记录到对象的元数据中,因此具有解密权限的用户下载对象时会自动解密。

      使用的BYOK材料来源有两种:
      • 由阿里云提供的BYOK材料:在KMS平台创建密钥时,选择密钥材料来源为阿里云KMS
      • 使用用户自有的BYOK材料:在KMS平台创建密钥时,选择密钥材料来源为外部,并按照要求导入外部密钥材料。导入外部密钥可参考文档导入密钥材料
      说明
      • 目前使用BYOK材料进行加密处于公测中,请联系技术支持添加权限。
      • 原数据中用于加密数据的数据密钥也会被加密,并且作为Object的元数据信息一并存储。
      • KMS托管密钥的服务器端加密方式仅加密对象数据,不会加密任何对象的元数据。
      • 使用子账号对数据使用指定的KMS密钥加密时,子账号需取得KMS相关权限,详情请参考使用 RAM 实现 KMS 资源授权
  • 使用OSS完全托管加密

    数据加密密钥的生成和管理,由OSS负责,并采用高强度、多因素的安全措施进行保护。数据加密的算法采用使用行业标准的强加密算法AES-256(即256位高级加密标准)。

    OSS的服务器端加密是Object的一个属性。您可以将Bucket默认的服务器端加密方式设置为AES256,也可以在上传Object或修改Object的meta信息时,在请求中携带X-OSS-server-side-encryption并指定其值为AES256,即可以实现该Object的服务器端加密存储。