
# 使用OBS桶密钥降低SSE-KMS成本
当您使用SSE-KMS对海量对象进行加密时，每个对象的加密过程都需要OBS调用KMS服务来派生数据加密密钥，这可能会导致大量的请求发送到KMS，从而产生时延和大量的KMS访问流量。通过桶密钥在OBS内部缓存并限时使用的方法可以减少与KMS的交互次数，降低了加解密操作对KMS的流量需求，从而节约成本，提高性能。
#### 桶密钥原理
图1桶密钥和数据加密密钥派生过程   
![](https://support.huaweicloud.com/usermanual-obs/figure/zh-cn_image_0000002632613840.png "点击放大")
如图所示，桶密钥原理如下：
1. KMS会生成一个有效期较短的桶密钥，密钥轮转周期默认为365天，轮转周期可通过[设置桶的加密配置](https://support.huaweicloud.com/api-obs/obs_04_0062.html)接口中的BucketKeyRotationPeriod参数进行配置。
2. OBS会将桶密钥保存在OBS自己的缓存中，缓存时间约3分钟。
3. 系统直接使用缓存中的桶密钥来派生数据加密密钥用以加解密对象，无需向KMS发送请求。加解密过程中，KMS管理主密钥和桶密钥，OBS缓存桶密钥、保存和管理数据加密密钥。
#### 约束限制
- 跨区域复制暂不支持配置桶密钥。
- 为了保护数据安全，每个请求者至少会向KMS发送请求获取一次唯一存储桶级密钥，以确保KMS云服务校验请求者是否拥有密钥的访问权限。每个IAM用户，或者IAM用户的权限变更时，OBS会将其视为不同的请求者。
- 未开启桶密钥的对象，如果想要开启桶密钥功能，需要重新上传或复制同名对象，并在上传或复制请求中打开对象级桶密钥开关。
- 本功能仅部分区域支持，例如华北-乌兰察布一
 
#### 费用说明
如果您使用SSE-KMS加密方式，会涉及密钥管理服务KMS的计费，了解更多请参考[KMS计费项](https://support.huaweicloud.com/price-dew/dew_03_0006.html)。
#### 桶级和对象级桶密钥
OBS支持配置桶级和对象级桶密钥，对象可以继承桶的加密配置，也可以自行配置，具体关系详见[图2]。注意，表中的桶级和对象级桶密钥的开关是指OBS请求头域x-obs-server-side-encryption-bucket-key-enabled的值是true（开启）还是false（关闭）。
图2桶级、对象级桶密钥开关的作用结果   
![](https://support.huaweicloud.com/usermanual-obs/figure/zh-cn_image_0000002394127633.png "点击放大")
#### 为桶配置存储桶密钥
OBS支持通过[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)、API方式配置存储桶密钥，不支持通过SDK、OBS Browser+、obsutil方式配置存储桶密钥。
#### 使用OBS控制台
本节仅介绍针对已有桶，如何开启存储桶密钥。创建桶时如何开启存储桶密钥，请参见[创建桶](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html#ZH-CN_TOPIC_0000001952642149)。
1. 在OBS[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)左侧导航栏选择"桶列表"。
2. 在桶列表中，单击待操作的桶，进入"对象"页面。
3. 在左侧导航栏，单击"概览"，进入"概览"页。
4. 在概览页的"基础配置"区域下，单击"服务端加密"卡片，系统弹出"服务端加密"对话框。
5. 单击按钮开启服务端加密。
6. 加密模式选择"SSE-KMS"。
7. 【可选，仅部分区域支持，例如华北-乌兰察布一】选择"加密算法"，在"AES256"、"SM4"中任选一种作为对象加密的算法。
8. 选择"加密密钥类型"。此处选择"自定义密钥"或"共享密钥"。 
   **当加密密钥类型选择"自定义密钥"或"共享密钥"时，支持配置"存储桶密钥"。**
   - **自定义密钥：**通过单击"查看KMS密钥"进入密码安全中心页面创建自定义密钥，然后通过KMS密钥的下拉框选中您创建的KMS密钥。
   
   - **共享密钥：** 输入共享密钥ID，您上传的对象将使用其他用户共享的密钥进行加密。获取共享密钥ID，具体请参见[查看密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0179.html)。
   
   
   
   
9. 打开存储桶密钥开关。 
   使用SSE-KMS的OBS存储桶密钥可减少对KMS的调用，减少请求KMS的流量费用，从而降低加密成本。
   
   
10. 单击"确定"。
 
#### 使用API
表1支持配置桶密钥的API接口（桶级） 
| 资源粒度 | 接口                                                                   | 相关参数                                                                                                                                       |
|:---|:---|:---|
| 桶级   | [创建桶](https://support.huaweicloud.com/api-obs/obs_04_0021.html)      | 请求头域和响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关 |
| 桶级   | [获取桶元数据](https://support.huaweicloud.com/api-obs/obs_04_0023.html)   | 响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关  |
| 桶级   | [设置桶的加密配置](https://support.huaweicloud.com/api-obs/obs_04_0062.html) | 桶密钥配置位于请求body体中，配置BucketKeyEnabled和BucketKeyRotationPeriod参数，详见[设置桶的加密配置](https://support.huaweicloud.com/api-obs/obs_04_0062.html)。       |
| 桶级   | [获取桶的加密策略](https://support.huaweicloud.com/api-obs/obs_04_0063.html) | 桶密钥配置位于响应body体中，返回BucketKeyEnabled和BucketKeyRotationPeriod参数，详见[获取桶的加密策略](https://support.huaweicloud.com/api-obs/obs_04_0063.html)。       |
   
#### 为对象配置存储桶密钥
OBS支持通过[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)、API方式配置存储桶密钥，不支持通过SDK、OBS Browser+、obsutil方式配置存储桶密钥。
#### 使用OBS控制台
本节仅介绍为新上传的对象开启存储桶密钥。
1. 在OBS[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)左侧导航栏选择"桶列表"。
2. 在桶列表中，单击待操作的桶，进入"对象"页面。
3. 单击"上传对象"，系统弹出"上传对象"对话框。
4. 添加待上传的文件。
5. 开启服务端加密开关。
6. 加密模式选择"SSE-KMS"。如果桶已开启服务端加密且配置了存储桶密钥，可以选择"继承桶的加密配置"。
7. 【可选，仅部分区域支持，例如华北-乌兰察布一】选择"加密算法"，在"AES256"、"SM4"中任选一种作为对象加密的算法。
8. 选择"加密密钥类型"。此处选择"自定义密钥"或"共享密钥"。 
   **当加密密钥类型选择"自定义密钥"或"共享密钥"时，支持配置"存储桶密钥"。**
   - **自定义密钥：**通过单击"查看KMS密钥"进入密码安全中心页面创建自定义密钥，然后通过KMS密钥的下拉框选中您创建的KMS密钥。
   
   - **共享密钥：** 输入共享密钥ID，您上传的对象将使用其他用户共享的密钥进行加密。获取共享密钥ID，具体请参见[查看密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0179.html)。
   
   
   
   
9. 打开存储桶密钥开关。 
   使用SSE-KMS的OBS存储桶密钥可减少对KMS的调用，减少请求KMS的流量费用，从而降低加密成本。
   
   
10. 单击"确定"。 
    对象上传成功后，可在对象详情中查看对象的加密状态。
    
    
 
#### 使用API
表2支持配置桶密钥的API接口（对象级） 
| 资源粒度 | 接口                                                                       | 相关参数                                                                                                                                           |
|:---|:---|:---|
| 对象级  | [PUT上传对象](https://support.huaweicloud.com/api-obs/obs_04_0080.html)      | 请求头域和响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关 |
| 对象级  | [POST上传对象](https://support.huaweicloud.com/api-obs/obs_04_0081.html)     | 请求头域和响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关 |
| 对象级  | [初始化上传段任务](https://support.huaweicloud.com/api-obs/obs_04_0098.html)     | 请求头域和响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关 |
| 对象级  | [复制对象](https://support.huaweicloud.com/api-obs/obs_04_0082.html)         | 请求头域和响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关 |
| 对象级  | [上传段](https://support.huaweicloud.com/api-obs/obs_04_0099.html)          | 响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关     |
| 对象级  | [合并段](https://support.huaweicloud.com/api-obs/obs_04_0102.html)          | 响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关     |
| 对象级  | [追加写对象](https://support.huaweicloud.com/api-obs/obs_04_0088.html)        | 响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关     |
| 对象级  | [拷贝段](https://support.huaweicloud.com/api-obs/obs_04_0100.html)          | 响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关     |
| 对象级  | [下载对象](https://support.huaweicloud.com/api-obs/obs_04_0083.html)（包括范围下载） | 响应头域： x-obs-server-side-encryption-bucket-key-enabled：桶密钥功能开关     |
   
