【最佳实践】使用BYOK密钥加密OSS中对象

  1. 云栖社区>
  2. 阿里云存储服务>
  3. 博客>
  4. 正文

【最佳实践】使用BYOK密钥加密OSS中对象

陈鹏飞Figo Chen 2018-10-24 20:50:08 浏览2113

1. 服务端加密介绍

使用服务器端加密方式保护静态数据,即OSS将用户数据写入数据中心内的磁盘时,会在对象级别加密数据,并且在访问这些数据时自动解密。用户只需要验证请求是否拥有访问权限。当前OSS支持如下两种服务端加密方式(注意:您不能对同一对象同时应用两种不同类型的服务器端加密方式):

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

PS:如下重点介绍SSE-KMS加密方式:

2. 使用由KMS托管密钥的服务器端加密

KMS(Key Management Service)是阿里云提供的一款安全、易用的密钥管理系统。当用户上传object时,在请求中携带x-oss-server-side-encryption的HTTP Header,并指定其值为KMS。OSS支持使用默认的CMK加密对象,同时也支持使用用户指定的CMK 进行加密。
image

如上是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。

【补充说明】

  • 用户需要实现开通KMS服务;
  • 使用“服务端加密-KMS托管主密钥”加解密对象时,会产生一定的KMS请求调用费用;
  • 用于加密数据的数据密钥也会被加密,并且作为Object的元数据信息一并存储;
  • KMS托管密钥的服务器端加密方式仅加密对象数据,不会加密任何对象的元数据;

1.目前以下操作,支持在请求中携带这些x-oss-server-side-encryption Header头:

  • Put Object: 简单上传
  • Copy Object: 复制Object
  • Initiate Multipart Upload:

2.通过服务器端加密存储的object时,以下API请求中OSS会返回x-oss-server-side-encryption头:

  • Put Object
  • Copy Object
  • Initiate Multipart Upload
  • Upload Part
  • Complete Multipart Upload
  • Get Object
  • Head Object

3.配置示例:

3.1配置前提

  • 演示region:香港站
  • 演示bucket :test-hongkong-2025
  • 演示工具:ossutil

3.2演示说明

  1. 【step1】:上传1个明文对象至OSS
    我们当前使用香港region进行演示说明。因此,我们将1个对象上传至香港region的bucket(bucket名:test-hongkong-2025)
D:\5-AK账号\ossutil64>ossutil64.exe stat  oss://test-hongkong-2025/01.txt
ACL                         : default
Accept-Ranges               : bytes
Content-Length              : 62
Content-Md5                 : k2GA4LeqHvVpQvBfnleNOg==
Content-Type                : text/plain
Etag                        : 936180E0B7AA1EF56942F05F9E578D3A
Last-Modified               : 2018-10-24 20:41:54 +0800 CST
Owner                       : 1416614965936597
X-Oss-Hash-Crc64ecma        : 9888192182077127097
X-Oss-Object-Type           : Normal
X-Oss-Storage-Class         : Standard
1.257000(s) elapsed

如上所示,我们上传了1个明文文件;

2.【step2】:在香港region创建KMS密钥
由于KMS加密服务不支持跨region操作。因此,我们在香港region创建1个CMK,并且导入外部密钥材料。如下所示:
image

3.【step3】:使用指定的CMK ID加密上传对象
为了简化演示过程,我们通过python将【step1】中上传的明文文件01.txt的加密属性修改为使用指定的CMK ID进行加密;

#PYTHON 脚本如下

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>
')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hongkong.aliyuncs.com', 'test-hongkong-2025')

bucket.update_object_meta('01.txt',{'x-oss-server-side-encryption':'KMS','x-oss-server-side-encryption-key-id': '33701a45-6723-4a04-a367-68c060382652'})

4.【step4】:查看使用指定CMK ID 加密对象的元数据信息
如下,我们使用ossutil工具查看:

D:\5-AK账号\ossutil64>ossutil64.exe stat  oss://test-hongkong-2025/01.txt
ACL                         : default
Accept-Ranges               : bytes
Content-Length              : 62
Content-Md5                 : k2GA4LeqHvVpQvBfnleNOg==
Content-Type                : text/plain
Etag                        : 936180E0B7AA1EF56942F05F9E578D3A
Last-Modified               : 2018-10-24 20:46:39 +0800 CST
Owner                       : 1416614965936597
X-Oss-Hash-Crc64ecma        : 9888192182077127097
X-Oss-Object-Type           : Normal
X-Oss-Server-Side-Encryption: KMS
X-Oss-Server-Side-Encryption-Key-Id: 33701a45-6723-4a04-a367-68c060382652
X-Oss-Storage-Class         : Standard
1.411000(s) elapsed