服务端加密
如果您的业务对数据存储的安全性和合规性有较高要求,可使用OBS提供的服务端加密功能,对上传到OBS存储的数据进行加密保护。服务器端加密是指OBS服务端对客户端上传到OBS的对象进行加密存储。在访问对象时,由OBS服务端对文件进行解密,然后向客户端返回解密后的数据。
OBS支持SSE-KMS、SSE-OBS、SSE-C三种加密方式:
对比维度 |
SSE-KMS (KMS 托管密钥的服务器端加密) |
SSE-OBS (OBS 托管密钥的服务器端加密) |
SSE-C (用户提供密钥的服务器端加密) |
---|---|---|---|
使用场景 |
密钥由经过安全认证的第三方硬件安全模块(HSM)产生,对密钥的关键操作都会进行访问控制及日志跟踪,适用于对合规性、安全性要求较高的场景。 |
加解密时不需要与KMS交互,访问时延更低,性能较SSE-KMS更好,适用于仅需要基础的加密能力的场景,以及批量加密的场景。 |
适用于需要用户保存和管理密钥的场景。 |
密钥管理 |
KMS服务生成和保管密钥,OBS使用密钥加密对象。 |
OBS服务生成和保管密钥,并使用密钥加密对象。 |
用户生成和保管密钥,OBS使用密钥加密对象。 |
数据加密算法 |
AES256、SM4 |
AES256 |
AES256 |
支持设置加密范围 |
桶级、对象级 |
桶级、对象级 |
对象级 |
详细介绍 |
- SSE-KMS支持区域以控制台实际上线区域为准。如果您在使用SSE-KMS时选择SM4加密算法,该算法仅支持华北-乌兰察布一区域。
- SSE-OBS中国站已全网上线。
- SSE-C以API接口实际上线区域为准。
桶级和对象级服务端加密
下表为桶级和对象级服务端加密的介绍和对比:
对比项 |
桶级服务端加密 |
对象级服务端加密 |
---|---|---|
使用场景 |
如果您想要开启后所有对象上传时强制加密,可开启桶级的服务端加密。 |
如果您只想对部分对象进行加密,或者每次上传对象时都根据业务需要选择加密方式和密钥,可使用对象级服务端加密。 |
支持的加密方式 |
SSE-KMS、SSE-OBS |
SSE-KMS、SSE-OBS、SSE-C |
支持设置的时间 |
随时支持修改 |
上传对象时配置,上传后不支持修改 |
两者之间的相互影响 |
|
约束限制
- 一个对象每次上传,只支持一种服务端加密方式。对象上传后,对象的加密配置不可修改。
- 当桶或者桶内对象开启了SSE-KMS服务端加密功能,需要使用IAM为请求者配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create、kms:dek:crypto权限,才能上传下载对象。
- 桶加密开关关闭后,访问加密对象必须使用HTTPS协议。
- 使用中的密钥不可以删除,如果删除将导致加密对象不能下载。
SSE-KMS加密方式
加密对象时,如图1所示,SSE-KMS采用信封加密机制,KMS云服务托管的用户主密钥并没有直接用来加密数据,系统先是从用户主密钥中派生出数据加密密钥和数据加密密钥的密文,然后使用数据加密密钥来加密OBS对象,加密完成后,OBS存储数据加密密钥的密文和对象密文。
解密对象时,如图2所示,KMS云服务先解密数据加密密钥密文,然后用数据加密密钥来解密对象密文,最终获得对象明文返回给客户。
KMS通过使用硬件安全模块 (HSM) 保护密钥安全的托管,帮助用户轻松创建和控制加密密钥。用户密钥不会明文出现在HSM之外,避免密钥泄露。对密钥的所有操作都会进行访问控制及日志跟踪,提供所有密钥的使用记录,满足监督和合规性要求。
由于数据加密服务DEW服务接口存在流控限制(详见DEW API概览),开启SSE-KMS加密后,您的业务访问可能会受流控影响。
资源粒度 |
接口 |
头域 |
---|---|---|
桶级 |
|
|
加密配置位于body体中,详见设置桶的加密配置。 |
||
对象级 |
|
|
您可以通过设置桶策略,对桶的访问请求执行服务端加密限制。例如,要求使用PUT上传方式向名为ExampleBucket的桶中上传对象时,对象必须选择SSE-KMS加密方式,可使用以下桶策略达成,该桶策略拒绝不包含头域x-obs-server-side-encryption:"kms"的上传操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "PutObject", "Resource": "ExampleBucket/*", "Condition": { "StringNotEquals": { "x-obs-server-side-encryption": "kms" } } } ] } |
SSE-OBS加密方式
SSE-OBS使用OBS根密钥派生的数据加密密钥对数据进行信封加密和解密。支持的SSE-OBS加密的API接口:
资源粒度 |
接口 |
头域 |
---|---|---|
桶级 |
x-obs-server-side-encryption:指定桶加密配置的加密模式。 |
|
加密配置位于body体中,详见设置桶的加密配置。 |
||
对象级 |
x-obs-server-side-encryption:指定桶加密配置的加密模式。 |
|
您可以通过设置桶策略,来限制指定桶的请求头域,如果您要对桶中的所有对象执行服务端加密限制,则可通过设置桶策略达成。例如,如果要求本租户的上传对象请求不包含服务端加密 (SSE-OBS) 的相关头域x-obs-server-side-encryption:"AES256",则可使用以下桶策略达成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "PutObject", "Resource": "YourBucket/*", "Condition": { "StringNotEquals": { "x-obs-server-side-encryption": "AES256" } } } ] } |
SSE-C加密方式
SSE-C方式,OBS使用用户提供的密钥和密钥的MD5值进行服务端加密。
支持的SSE-C加密的API接口:
资源粒度 |
接口 |
头域 |
---|---|---|
对象级 |
|
|
如果源段或源对象已进行服务端加密,而目标段和目标对象也需要加密,除了使用以上3个头域外,还需要使用以下3个头域解密源对象:
|
||
开启并配置桶服务端加密
OBS支持通过控制台、API、SDK方式配置桶服务端加密,不支持通过OBS Browser+、obsutil方式配置桶服务端加密。
配置对象级服务端加密
OBS支持通过控制台、API、SDK方式对上传对象进行加密,不支持通过OBS Browser+、obsutil方式对上传对象进行加密。