更新时间:2024-10-23 GMT+08:00

服务端加密

如果您的业务对数据存储的安全性和合规性有较高要求,可使用OBS提供的服务端加密功能,对上传到OBS存储的数据进行加密保护。服务器端加密是指OBS服务端对客户端上传到OBS的对象进行加密存储。在访问对象时,由OBS服务端对文件进行解密,然后向客户端返回解密后的数据。

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

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

对比维度

SSE-KMS

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

SSE-OBS

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

SSE-C

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

使用场景

密钥由经过安全认证的第三方硬件安全模块(HSM)产生,对密钥的关键操作都会进行访问控制及日志跟踪,适用于对合规性、安全性要求较高的场景。

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

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

密钥管理

KMS服务生成和保管密钥,OBS使用密钥加密对象。

OBS服务生成和保管密钥,并使用密钥加密对象。

用户生成和保管密钥,OBS使用密钥加密对象。

数据加密算法

AES256、SM4

AES256

AES256

支持设置加密范围

桶级、对象级

桶级、对象级

对象级

详细介绍

详见SSE-KMS加密方式

详见SSE-OBS加密方式

详见SSE-C加密方式

  • SSE-KMS支持区域以控制台实际上线区域为准。如果您在使用SSE-KMS时选择SM4加密算法,该算法仅支持华北-乌兰察布一区域。
  • SSE-OBS中国站已全网上线。
  • SSE-C以API接口实际上线区域为准。

桶级和对象级服务端加密

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

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

对比项

桶级服务端加密

对象级服务端加密

使用场景

如果您想要开启后所有对象上传时强制加密,可开启桶级的服务端加密。

如果您只想对部分对象进行加密,或者每次上传对象时都根据业务需要选择加密方式和密钥,可使用对象级服务端加密。

支持的加密方式

SSE-KMS、SSE-OBS

SSE-KMS、SSE-OBS、SSE-C

支持设置的时间

随时支持修改

上传对象时配置,上传后不支持修改

两者之间的相互影响

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

约束限制

  • 一个对象每次上传,只支持一种服务端加密方式。对象上传后,对象的加密配置不可修改。
  • 当桶或者桶内对象开启了SSE-KMS服务端加密功能,需要使用IAM为请求者配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create、kms:dek:crypto权限,才能上传下载对象。
  • 桶加密开关关闭后,访问加密对象必须使用HTTPS协议。
  • 使用中的密钥不可以删除,如果删除将导致加密对象不能下载。

SSE-KMS加密方式

图1 SSE-KMS加密流程

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

图2 SSE-KMS解密流程

解密对象时,如图2所示,KMS云服务先解密数据加密密钥密文,然后用数据加密密钥来解密对象密文,最终获得对象明文返回给客户。

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

表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-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方式对上传对象进行加密。