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支持AES256、SM4两种加密算法。
- 设置桶的加密方式为SSE-KMS,以及其他使用SSE-KMS加解密的所有GET、PUT类请求必须使用HTTPS协议。
- 匿名用户不能访问被SSE-KMS加密的对象,必须使用有效的凭证(访问密钥或临时访问密钥)对请求进行签名,更多签名相关信息参见OBS签名。
- 如果您使用CMK自定义密钥,那么开启服务端加密的桶,必须和自定义密钥处于同一区域中。默认密钥不区分区域和IAM用户,单个华为账号内所有IAM用户、所有区域共有一个默认密钥。
- 仅支持使用AES256、SM4的CMK自定义密钥,请在创建CMK自定义密钥时选择正确的加密算法。
- 跨账号访问场景请使用自定义密钥进行SSE-KMS加密。
SSE-KMS原理介绍
加密对象时,如图1所示,SSE-KMS采用信封加密机制,加密流程如下:
- KMS通过CMK派生出DEK,然后使用CMK加密DEK得到DEK的密文,KMS将DEK的明文和密文一同发送给OBS。
- OBS使用DEK明文加密数据,并在使用后将DEK明文尽快从内存中删除。
- OBS将DEK密文作为元数据与对象密文一起存储。
解密对象时,如图2所示,解密流程如下:
- OBS向KMS发送DEK密文,申请KMS解密DEK。
- KMS使用与加密过程相同的CMK为DEK解密,然后将DEK明文返回OBS。
- OBS使用DEK明文解密对象密文,得到对象明文,并尽快从内存中删除DEK明文。
相关权限配置
- 设置桶的加密方式为SSE-KMS,您必须是桶拥有者或拥有设置桶加密方式的权限。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutEncryptionConfiguration、obs:bucket:GetEncryptionConfiguration权限,如果使用桶策略则需授予PutEncryptionConfiguration、GetEncryptionConfiguration权限。相关授权方式介绍可参见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,需要完成桶和对象资源、密钥资源两方面的授权:
- 桶和对象资源授权:账号A向账号B授权访问桶,详细操作可以参考为其他账号授权。
- 密钥资源授权:账号A向账号B授权访问密钥k,详细操作请参考为自定义密钥创建授权。
注意,跨账号访问场景请使用自定义密钥进行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修改对象的加密方式。