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 进行加密.
如上是 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 演示说明
[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, 并且导入外部密钥材料. 如下所示:
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
来源: https://yq.aliyun.com/articles/657148