更新时间:2024-07-31 GMT+08:00
分享

服务端加密

使用场景

如果您的业务对数据存储的安全性和合规性有较高要求,可使用OBS提供的服务端加密功能,对上传到OBS存储的数据进行加密保护。

功能介绍

服务器端加密是指上传对象时,客户端上传到OBS的文件,由OBS服务端对文件进行加密然后存储密文,在访问对象时,由OBS服务端对文件进行解密,然后向客户端返回解密后的数据。对于客户视角而言,数据的上传和访问与未加密时没有区别,加解密的过程由服务端在后台自动完成,您只需要确保拥有上传和访问加密对象的权限即可。

OBS支持SSE-KMS、SSE-OBS、SSE-C三种加密方式:

图1 OBS的3种加密方式
表1 OBS的3种服务端加密方式

对比维度

SSE-KMS

(KMS 托管密钥的服务器端加密)

SSE-OBS

OBS 托管密钥的服务器端加密

SSE-C

客户提供密钥的服务器端加密

功能描述

在上传对象或访问对象时,OBS使用KMS主密钥派生的数据加密密钥,对OBS对象进行加解密。

在上传对象或访问对象时,OBS使用OBS根密钥派生的数据加密密钥,对OBS对象进行加解密。

在上传对象或访问对象时,OBS使用用户提供的密钥,对OBS对象进行加解密。

使用场景

适用于对合规性、安全性要求较高的场景。

加解密时不需要再与KMS交互,性能较SSE-KMS更好,适用于仅需要基础的加密能力,批量加密的场景。

适用于需要自己保存和管理密钥的场景。

密钥生成和管理

KMS服务保存和管理密钥,用户可以通过KMS云服务查看和管理密钥。

OBS服务保存和管理密钥。

用户自己保存和管理密钥。

是否调用KMS服务相关接口

数据加密算法

AES256、SM4

AES256

AES256、SM4

支持设置加密范围

桶级、对象级

桶级、对象级

对象级

详细介绍

详见SSE-KMS加密方式

详见SSE-OBS加密方式

详见SSE-C加密方式

  • 创建桶时,SSE-KMS服务端加密方式支持拉美-墨西哥城一、拉美-墨西哥城二、拉美-圣保罗一、非洲-约翰内斯堡、华北-北京四、华北-乌兰察布一、华东-上海一、华南-广州、西南-贵阳一、亚太-曼谷、亚太-新加坡、亚太-雅加达、土耳其-伊斯坦布尔区域。如果您在使用SSE-KMS时选择SM4加密算法,该算法仅支持华北-乌兰察布一区域。
  • 上传对象时,SSE-KMS服务端加密方式支持拉美-墨西哥城一、拉美-圣保罗一、非洲-约翰内斯堡、华北-北京四、华北-乌兰察布一、华东-上海一、华南-广州、华南-广州-友好用户环境、西南-贵阳一、中国-香港、亚太-曼谷、亚太-新加坡、亚太-雅加达、土耳其-伊斯坦布尔区域。如果您在使用SSE-KMS时选择SM4加密算法,该算法仅支持华北-乌兰察布一区域。
  • SSE-OBS服务端加密方式中国站已全网上线。

桶级和对象级服务端加密

下表为桶级和对象级服务端加密的介绍和对比:

表2 桶级和对象级服务端加密对比

对比项

桶级对象加密

对象级服务端加密

使用场景

  • 如果您想要强制桶内所有对象都必须加密,可开启桶级的服务端加密,开启后桶内对象虽可以更改加密方式和密钥,但都必须要经过服务端加密处理。
  • 如果您桶内绝大多数对象都计划使用同一种加密方式和密钥配置,可开启桶级的服务端加密,开启后,上传的对象会默认继承桶的加密配置,无需您逐一手动设置。
  • 如果您只需要对桶中的部分对象进行加密,可以在对象上传时针对指定对象开启服务端加密。
  • 如果您的桶内对象计划使用多种加密方式和密钥配置,可以在对象上传时根据业务需求配置对象的加密方式和选择要使用的密钥。

支持的加密方式

SSE-KMS、SSE-OBS

SSE-KMS、SSE-OBS、SSE-C

支持设置的时间

  • 支持创建新桶时配置
  • 支持对已有桶开启、更改和关闭加密配置
  • 支持上传对象时配置
  • 不支持对已有对象开启、更改和关闭加密配置

两者之间的相互影响

  • 桶未开启加密时,对象不强制加密,可以单独配置加密。
  • 桶开启加密时,OBS仅会对开启桶服务端加密之后上传的对象进行加密,不会改变开启前已有对象的加密状态。桶的加密配置会成为对象默认的加密配置,但对象仍可自定义加密配置。
  • 桶更改加密配置时,仅影响更改后上传对象的默认配置,不会改变更改前已有对象的加密配置。
  • 桶关闭加密时,也不会影响桶中已有对象的加密状态,关闭后可在上传对象时进行单独加密。

约束限制

  • 一个对象每次上传,只支持一种服务端加密方式。对象的加密状态不可以修改。
  • 镜像回源至Bucket中的文件默认不加密。
  • 当桶或者桶内对象开启了SSE-KMS服务端加密功能,需要使用IAM为请求者配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create、kms:dek:crypto权限,才能上传下载对象。
  • 桶加密开关关闭后,访问加密对象必须使用HTTPS协议。
  • 使用中的密钥不可以删除,如果删除将导致加密对象不能下载。
  • 对象进行服务端加密后,且未在IAM进行委托的情况下,即使其他账号和用户拥有该对象的读权限,也无法访问该对象。

SSE-KMS加密方式

图2 SSE-KMS加密流程
图3 SSE-KMS解密流程

所示,SSE-KMS采用信封加密机制,KMS云服务托管的用户主密钥CMK并没有直接用来加密数据,系统先是从CMK中派生出数据加密密钥,然后使用数据加密密钥来完成OBS数据的加密,加密完成后,OBS存储对象加密后的密文和加密后的数据加密密钥。

同理,如所示,解密数据时,KMS云服务先解密数据加密密钥,然后用它来解密对象密文,最终获得对象明文返回给客户。借助KMS,每一个对象都有一个单独的随机的数据密钥,您可以专注于数据加解密、电子签名验签等业务功能,无需花费时间和精力来保障密钥的保密性、完整性和可用性。

KMS通过使用硬件安全模块 (HSM) 保护密钥安全的托管,帮助用户轻松创建和控制加密密钥。用户密钥不会明文出现在HSM之外,避免密钥泄露。对密钥的所有操作都会进行访问控制及日志跟踪,提供所有密钥的使用记录,满足监督和合规性要求。

支持的SSE-KMS加密的API接口:

使用SSE-KMS 需要使用IAM为请求者配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create、kms:dek:crypto权限。

表3 支持的SSE-KMS加密的API接口

资源粒度

接口

头域

桶级

创建桶

  • x-obs-server-side-encryption:指定桶加密配置的加密模式
  • x-obs-server-side-data-encryption:指定服务端加密配置的加密算法
  • x-obs-server-side-encryption-kms-key-id:指定加密方式下使用的KMS主密钥,如果用户没有提供该头域,那么默认的主密钥将会被使用
  • x-obs-sse-kms-key-project-id:SSE-KMS加密方式下KMS主密钥所属的项目ID

设置桶的加密配置

加密配置位于body体中,详见设置桶的加密配置

对象级

PUT上传对象

  • x-obs-server-side-data-encryption:指定服务端加密配置的加密算法
  • x-obs-server-side-encryption-kms-key-id:指定加密方式下使用的KMS主密钥,如果用户没有提供该头域,那么默认的主密钥将会被使用
  • x-obs-sse-kms-key-project-id:SSE-KMS加密方式下KMS主密钥所属的项目ID

POST上传对象

初始化上传段任务

复制对象

您可以通过设置桶策略,对桶的访问请求执行服务端加密限制。例如,要求使用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-KMS的区别在于SSE-OBS是OBS管理密钥,而非KMS。

支持的SSE-OBS加密的API接口:

表4 支持的SSE-OBS加密的API接口

资源粒度

接口

头域

桶级

创建桶

x-obs-server-side-encryption:指定桶加密配置的加密模式

设置桶的加密配置

加密配置位于body体中,详见设置桶的加密配置

对象级

PUT上传对象

x-obs-server-side-encryption:指定桶加密配置的加密模式

POST上传对象

初始化上传段任务

复制对象

您可以通过设置桶策略,来限制指定桶的请求头域,如果您要对桶中的所有对象执行服务端加密限制,则可通过设置桶策略达成。例如,如果要求本租户的上传对象请求不包含服务端加密 (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接口:

表5 支持的SSE-C加密的API接口

资源粒度

接口

头域

对象级

PUT上传对象

  • x-obs-server-side-encryption-customer-algorithm:加密对象使用的算法。
  • x-obs-server-side-encryption-customer-key:加密对象使用的密钥,头域值是256位密钥的base64编码。
  • x-obs-server-side-encryption-customer-key-MD5:表示加密对象使用的密钥的MD5值。

POST上传对象

初始化上传段任务

上传段

获取对象元数据

获取对象内容

拷贝段

  • 如果源段或源对象没有加密,而目标段和目标对象需要加密,则只需要以下3个头域:
  • x-obs-server-side-encryption-customer-algorithm:加密对象使用的算法。
  • x-obs-server-side-encryption-customer-key:加密对象使用的密钥,头域值是256位密钥的base64编码。
  • x-obs-server-side-encryption-customer-key-MD5:表示加密对象使用的密钥的MD5值。

如果源段或源对象已进行服务端加密,而目标段和目标对象也需要加密,除了使用以上3个头域外,还需要使用以下3个头域解密源对象:

  • x-obs-copy-source-server-side-encryption-customer-algorithm:表示解密源对象使用的算法。
  • x-obs-copy-source-server-side-encryption-customer-key:解密源对象使用的密钥,头域值是256位密钥的base64编码。
  • x-obs-copy-source-server-side-encryption-customer-key-MD5:表示解密源对象使用的密钥的MD5值。

复制对象

开启并配置桶服务端加密

OBS支持通过控制台、API、SDK方式配置桶服务端加密,不支持通过OBS Browser+、obsutil方式配置桶服务端加密

配置对象级服务端加密

OBS支持通过控制台、API、SDK方式对上传对象进行加密,不支持通过OBS Browser+、obsutil方式对上传对象进行加密。

相关文档