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

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

OSS服务端加密主要应用场景

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

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

    基于OSS完全托管的加密方式,是Object的一种属性。您可以在上传object或修改object的meta信息时,在请求中携带X-OSS-server-side-encrpytion并指定其值为AES256,阿里云oss服务端加密使用AES256加密每个对象。OSS会为每个对象使用不同的密钥进行加密,作为额外的保护,它将使用定期轮转的主密钥对加密密钥本身进行加密。该方式适合于批量数据的加解密。

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

配置步骤

详细配置步骤请参考通过服务端加密保护数据

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

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

当您创建Object时,在请求中携带x-oss-server-side-encryption的HTTP Header,并指定其值为KMS,即可实现在服务端加密存储该Object(密钥管理使用KMS服务)。

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

SSE-KMS服务端加密的逻辑示意图:

关于Customer Master Key的生成方式有多种:

  • 使用OSS默认托管的KMS密钥

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

  • 使用用户指定的CMK

    您可以在上传object或修改object的meta信息时,在请求中携带X-OSS-server-side-encrpytion,指定其值为KMS,并指定X-oss-server-side-encrpytion-key-id为具体的CMK ID。OSS将使用指定的CMK生成不同的密钥来加密不同的对象,并将加密object的CMK ID记录到对象的元数据中,因此具有解密权限的用户下载对象时会自动解密。

  • 使用用户BYOK材料进行加密

    阿里云KMS服务支持导入自己的BYOK密钥材料作为CMK-ID。您可以创建1个不带密钥材料的CMK,并按照要求导入外部密钥材料。导入外部密钥可参考文档导入密钥材料

说明
  • 原数据中用于加密数据的数据密钥也会被加密,并且作为Object的元数据信息一并存储。
  • KMS托管密钥的服务器端加密方式仅加密对象数据,不会加密任何对象的元数据。
  • 使用子账号对数据使用指定的KMS密钥加密时,子账号需取得KMS相关权限,详情请参考使用RAM实现KMS资源授权

使用OSS完全托管加密

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

OSS的服务器端加密是Object的一个属性。用户创建一个Object的时候,只需要在Put Object的请求中携带x-oss-server-side-encryption的HTTP Header,并指定其值为AES256,即可以实现该Object的服务器端加密存储。

服务端加密API

  • 操作请求
    以下API支持请求携带 x-oss-server-side-encryption头:
    • PutObject:简单上传
    • CopyObject:复制Object
    • InitiateMultipartUpload:分片上传
    HTTP Header格式如下:
    名称 描述 示例
    x-oss-server-side-encryption 指定服务端加密的模式

    有效值:AES256、KMS

    x-oss-server-side-encryption:KMS表示使用服务端加密模式为KMS托管主密钥
    x-oss-server-side-encryption-key-id 该Object加密所用的用户KMS key的ID

    当您使用指定CMK-ID进行加密的时候,需增加此项

    x-oss-server-side-encryption-key-id: 72779642-7d88-4a0f-8d1f-1081a9cc7afb
    说明
    • 其他OSS收到的请求中,如果出现x-oss-server-side-encryption头,OSS会直接返回HTTP状态码400,并在消息体内注明错误码为InvalidArgument。
    • 如果您指定的x-oss-server-side-encryption头不为有效值,OSS会直接返回HTTP状态码400,并在消息体内注明错误码为InvalidEncryptionAlgorithmError
  • 操作响应
    通过服务器端加密存储的Object,以下API请求中OSS会返回 x-oss-server-side-encryption头:
    • PutObject
    • CopyObject
    • InitiateMultipartUpload
    • UploadPart
    • CompleteMultipartUpload
    • GetObject
    • HeadObject