更新时间:2025-09-02 GMT+08:00
分享

SSE-KMS加密(KMS托管密钥)

SSE-KMS加密方式适用于对合规性、安全性要求较高的场景。SSE-KMS将密钥管理服务KMS和对象存储服务OBS结合起来,KMS为OBS提供密钥,OBS使用密钥加密上传到桶中的数据。该密钥由经过安全认证的第三方硬件安全模块(HSM)产生,对密钥的关键操作都会进行访问控制及日志跟踪,安全性更高。您还可以借助KMS来管理密钥,例如使用KMS创建自定义密钥,编辑、查询和删除密钥。

背景介绍

使用SSE-KMS加密方式时,您可能想要了解以下背景知识:

  • 密钥管理服务(Key Management Service,以下简称KMS),是华为云提供的一种安全、可靠、简单易用的密钥托管服务,您可以使用KMS创建并管理您的密钥,KMS生成的密钥可应用于OBS服务端加密,了解更多请参见KMS服务简介
  • 用户主密钥(Customer Master Key,以下简称CMK)是KMS加密系统中最高级别的密钥,用于生成和管理其他密钥(如会话密钥、数据加密密钥等)。主密钥有自定义密钥默认密钥两种,配置OBS的SSE-KMS加密方式时,您可以根据业务需要任选一种参与SSE-KMS加密,如未指定则首次使用SSE-KMS加密数据时,系统会自动为当前华为账号创建一个“默认密钥”并默认使用。了解更多请参见KMS基本概念说明默认密钥如何生成自定义密钥与默认密钥有什么区别创建自定义密钥
  • 数据加密密钥(Data Encrypt Key,以下简称DEK):用于直接加密数据的密钥,SSE-KMS方式加密时,更多信息请参见什么是数据加密密钥?
  • 信封加密(Envelope Encryption)是一种加密手段,不使用用户主密钥直接加解密数据,而是通过主密钥派生数据加密密钥,使用“数据加密密钥”加解密数据明文,然后使用“主密钥”加解密“数据加密密钥”。了解更多参见信封加密方式有什么优势

费用说明

如果您使用SSE-KMS加密方式,会涉及密钥管理服务KMS的计费,了解更多请参考KMS计费项

注意事项

  • 由于数据加密服务DEW服务接口存在流控限制(详见DEW API概览),开启SSE-KMS加密后,您的业务访问可能会受流控影响。
  • 加密后对象的ETag值不是对象明文的MD5值,而是对象密文的MD5值。

约束限制

  • SSE-KMS支持AES256SM4两种加密算法。
  • 设置桶的加密方式为SSE-KMS,以及其他使用SSE-KMS加解密的所有GET、PUT类请求必须使用HTTPS协议。
  • 匿名用户不能访问被SSE-KMS加密的对象,必须使用有效的凭证(访问密钥或临时访问密钥)对请求进行签名,更多签名相关信息参见OBS签名
  • 如果您使用CMK自定义密钥,那么开启服务端加密的桶,必须和自定义密钥处于同一区域中。默认密钥不区分区域和IAM用户,单个华为账号内所有IAM用户、所有区域共有一个默认密钥。
  • 仅支持使用AES256SM4CMK自定义密钥,请在创建CMK自定义密钥时选择正确的加密算法。
  • 跨账号访问场景请使用自定义密钥进行SSE-KMS加密。

SSE-KMS原理介绍

图1 SSE-KMS加密流程

加密对象时,如图1所示,SSE-KMS采用信封加密机制,加密流程如下:

  1. KMS通过CMK派生出DEK,然后使用CMK加密DEK得到DEK的密文,KMS将DEK的明文和密文一同发送给OBS。
  2. OBS使用DEK明文加密数据,并在使用后将DEK明文尽快从内存中删除。
  3. OBS将DEK密文作为元数据与对象密文一起存储。
图2 SSE-KMS解密流程

解密对象时,如图2所示,解密流程如下:

  1. OBS向KMS发送DEK密文,申请KMS解密DEK。
  2. KMS使用与加密过程相同的CMK为DEK解密,然后将DEK明文返回OBS。
  3. OBS使用DEK明文解密对象密文,得到对象明文,并尽快从内存中删除DEK明文。

相关权限配置

配置桶加密方式、上传下载加密对象需要配置相关权限:
  • 设置桶的加密方式为SSE-KMS,您必须是桶拥有者或拥有设置桶加密方式的权限。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutEncryptionConfigurationobs:bucket:GetEncryptionConfiguration权限,如果使用桶策略则需授予PutEncryptionConfigurationGetEncryptionConfiguration权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略自定义创建桶策略
  • 上传对象时使用SSE-KMS方式加密对象,除了拥有对象上传权限,还需要使用IAM为请求者配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create权限。
  • 下载使用SSE-KMS加密的对象,除了拥有对象下载权限,还需要使用IAM为请求者配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create、kms:dek:crypto权限。

对桶的访问请求执行服务端加密限制:

  • 您可以通过设置桶策略,对桶的访问请求执行服务端加密限制。例如,要求使用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"
                    }
                }
            }
        ]
    }
    
  • 跨账号场景下授权其他账号访问被服务端加密的对象
    例如华为账号A用自己的密钥k加密了桶A中的对象a,此时华为账号B想要访问对象a,需要完成桶和对象资源、密钥资源两方面的授权:

    注意,跨账号访问场景请使用自定义密钥进行SSE-KMS加密。

服务端加密对其他操作的影响

对上传下载对象的影响

只要您满足相关权限要求,您访问加密和未加密对象的方式没有区别。例如,如果您使用预签名的 URL来共享您的对象,那么对于加密和解密的对象,该 URL 的工作方式是相同的。此外,在您列出存储桶中的对象时,列表API操作会返回所有对象的列表(无论对象是否加密)。

对于跨桶复制对象的影响(包括跨区域和同区域)

  • 当源桶未开启服务端加密,目标桶开启加密时,复制到目标桶的对象副本将被加密,且加密方式与目标桶保持一致。此时源对象的ETag与副本对象的ETag不同,如果您有使用ETag的应用程序,则需要适配该差异。
  • 当源桶和目标桶都开启了服务端加密,但是加密方式不一致时,复制到目标桶的对象副本加密方式与目标桶保持一致。此时源对象的ETag与副本对象的ETag也不相同,请注意适配。
  • 当源桶开启服务端加密,目标桶未开启时,复制到目标桶的对象副本将被加密,且加密方式与源桶保持一致。

前提条件

如果您的用户主密钥计划使用自定义密钥,请在配置SSE-KMS之前,提前完成密钥创建,如何创建请参考创建自定义密钥

为桶配置SSE-KMS加密

OBS支持通过控制台、API、SDK方式配置桶SSE-KMS加密,不支持通过OBS Browser+、obsutil方式配置。

为对象配置SSE-KMS加密

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

修改已有对象的加密状态

您可以使用复制同名对象的方式,将桶中已有的未加密对象更改为加密状态,或者修改对象的加密方式。

OBS支持通过API、SDK修改对象的加密方式。

相关文档