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

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

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

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

  • 直接使用KMS进行加密、解密

    用户直接调用KMS的API,使用指定的CMK进行加密、解密数据。这种方式适合于少量数据的加解密服务(且文件大小小于4KB)。用户数据会通过安全信道传输至KMS服务端,对应的加解密结果通过安全信道返回给客户。

  • 使用KMS托管的信封加密

    用户直接调用KMS的API,使用指定的CMK来产生明文数据密钥、密文数据密钥。这种场景适合于大量的数据加解密。用户数据无需通过网络发送到KMS服务端进行加解密,这是一种低成本的加解密方式。

  • 使用OSS完全托管加密

    基于OSS完全托管的加密方式,是Object的一种属性。用户创建object时,只需要put object 请求中携带x-oss-server-side-encryption的HTTP Header,并指定其值为AES256,即可以实现该Object的服务器端加密存储。该方式适合于批量数据的加解密。

服务端加密选项

OSS服务端加密有以下选项,用户可根据需要(密钥管理策略)进行选择:

  • 使用由OSS完全托管的服务端加密功能:数据加密密钥的生成和管理,由OSS负责,并采用高强度、多因素的安全措施进行保护。数据加密的算法采用使用行业标准的强加密算法AES-256(即256位高级加密标准)。
  • 使用由KMS托管密钥的服务端加密功能:除了采用AES-256加密算法外,KMS负责保管用户主密钥CMK(对数据密钥进行加密的密钥),以及生成数据加密的密钥,通过信封加密机制,进一步防止未经授权的数据访问。其中,会涉及少量额外的KMS密钥API调用费用(参考:KMS计费标准)。
    说明
    暂时只支持中国大陆区域、新加坡区域,其余区域会尽快开放。

服务端加密-OSS完全托管

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

以下操作支持在请求中携带这些HTTP Header:

  • PutObject:简单上传
  • CopyObject:复制Object
  • InitiateMultipartUpload:分片上传

服务端加密-KMS托管主密钥

当用户创建Object时,在请求中携带x-oss-server-side-encryption的HTTP Header,并指定其值为KMS,即可实现在服务端加密存储该Object(密钥管理使用KMS服务)。OSS通过KMS服务,采用信封加密机制、AES-256加密算法等强安全方法,对用户存储在OSS的对象进行加密保护。

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

以下操作支持在请求中携带这些HTTP Header

  • PutObject:简单上传
  • CopyObject:复制Object
  • InitiateMultipartUpload:分片上传
说明
  • 您需要先开通KMS服务,请参见KMS开通指南
  • 使用该模式,首次向某地域中的Bucket添加加密对象时,将自动为您在该地域创建一个默认KMS密钥(用作用户主密钥CMK)。此密钥将用于服务端加密(KMS模式)。
  • 您可以在KMS控制台查看该密钥信息,请参见KMS使用文档
  • 关于费用,使用“服务端加密-KMS托管主密钥”创建Object或下载Object时,可能会产生少许额外KMS使用费用,请参见KMS计费标准

服务端加密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托管主密钥
说明
  • 其他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
Meta信息

通过服务器端加密-KMS托管主密钥模式存储的Object,其Meta信息会增加以下字段:

名称 描述 示例
x-oss-server-side-encryption 指定服务器端加密的模式 x-oss-server-side-encryption: KMS
x-oss-server-side-encryption-key-id 该Object加密所用的用户KMS key的ID x-oss-server-side-encryption-key-id: 72779642-7d88-4a0f-8d1f-1081a9cc7afb