
服务器端加密
OSS支持在服务器端对上传的数据进行加密(Server-Side Encryption)。上传数据时,OSS对收到的用户数据进行加密,然后再将得到的加密数据持久化保存下来;下载数据时,OSS自动对保存的加密数据进行解密并把原始数据返回给用户,并在返回的HTTP请求Header中,声明该数据进行了服务器端加密。
应用场景
OSS通过服务器端加密机制,提供静态数据保护。适合于对于文件存储有高安全性或者合规性要求的应用场景。例如,深度学习样本文件的存储、在线协作类文档数据的存储。针对不同的应用场景,OSS有如下两种服务器端加密方式:
- 使用KMS托管密钥进行加解密(SSE-KMS)
上传文件时,可以使用指定的CMK ID或者默认KMS托管的CMK进行加解密操作。这种场景适合于大量的数据加解密。数据无需通过网络发送到KMS服务端进行加解密,这是一种低成本的加解密方式。注意 使用KMS密钥功能时会产生少量的KMS密钥API调用费用,费用详情请参考KMS计费标准。
- 使用OSS完全托管加密(SSE-OSS)
基于OSS完全托管的加密方式,是Object的一种属性。OSS服务器端加密使用AES256加密每个对象,并为每个对象使用不同的密钥进行加密,作为额外的保护,它将使用定期轮转的主密钥对加密密钥本身进行加密。该方式适合于批量数据的加解密。
操作方式
操作方式 | 说明 |
---|---|
控制台 | Web应用程序,直观易用 |
命令行工具ossutil | 命令行工具,性能好 |
Java SDK | 丰富、完整的各类语言SDK demo |
Python SDK | |
Go SDK |
原理介绍
- 使用KMS托管密钥进行加解密
KMS(Key Management Service)是阿里云提供的一款安全、易用的管理类服务。用户无需花费大量成本来保护密钥的保密性、完整性和可用性,借助密钥管理服务,用户可以安全、便捷的使用密钥,专注于开发加解密功能场景。用户可以通过KMS控制台中查看和管理KMS密钥。
除了采用AES-256加密算法外,KMS负责保管用户主密钥CMK(Customer Master Key,对数据密钥进行加密的密钥),以及生成数据加密的密钥,通过信封加密机制,进一步防止未经授权的数据访问。
SSE-KMS服务器端加密的逻辑示意图如下。关于CMK的生成方式有多种:- 使用OSS默认托管的KMS密钥
您可以将Bucket默认的服务器端加密方式设置为KMS且不指定具体的CMK ID,也可以在上传Object或修改Object的meta信息时,在请求中携带
X-OSS-server-side-encryption
并指定其值为KMS且不指定具体的CMK ID。OSS将使用默认托管的CMK生成不同的密钥来加密不同的对象,并且在下载时自动解密。 - 使用BYOK进行加密
服务器端加密支持使用BYOK进行加密,您可以将Bucket默认的服务器端加密方式设置为KMS并指定具体的CMK ID,也可以在上传Object或修改Object的meta信息时,在请求中携带
X-OSS-server-side-encryption
,指定其值为KMS,并指定X-OSS-server-side-encryption-key-id
为具体的CMK ID。OSS将使用指定的CMK生成不同的密钥来加密不同的对象,并将加密Object的CMK ID记录到对象的元数据中,因此具有解密权限的用户下载对象时会自动解密。使用的BYOK材料来源有两种:- 由阿里云提供的BYOK材料:在KMS平台创建密钥时,选择密钥材料来源为阿里云KMS。
- 使用用户自有的BYOK材料:在KMS平台创建密钥时,选择密钥材料来源为外部,并按照要求导入外部密钥材料。导入外部密钥可参考文档导入密钥材料。
注意- 目前使用BYOK材料进行加密处于公测中,请联系技术支持添加权限。
- 使用BYOK材料加密的对象当前不支持跨区域复制到其他区域的Bucket。
- 原数据中用于加密数据的数据密钥也会被加密,并且作为Object的元数据信息一并存储。
- KMS托管密钥的服务器端加密方式仅加密对象数据,不会加密任何对象的元数据。
- 使用子账号对数据使用指定的KMS密钥加密时,子账号需取得KMS相关权限,详情请参考使用RAM实现访问控制。
- 使用OSS默认托管的KMS密钥
- 使用OSS完全托管加密
数据加密密钥的生成和管理,由OSS负责,并采用高强度、多因素的安全措施进行保护。数据加密的算法采用使用行业标准的强加密算法AES-256(即256位高级加密标准)。
OSS的服务器端加密是Object的一个属性。您可以将Bucket默认的服务器端加密方式设置为AES256,也可以在上传Object或修改Object的meta信息时,在请求中携带
X-OSS-server-side-encryption
并指定其值为AES256
,即可以实现该Object的服务器端加密存储。
权限说明
- 设置Bucket默认加密方式
- 具有对应Bucket的管理权限。
- 具有“put bucket encryption”和“Get Bucket Encryption”权限。
- 若设置加密方式为KMS指定的CMK ID,还需要“ListKeys”、“Listalias”、“ListAliasesByKeyId”以及“DescribeKeys”权限。指定CMK
ID相关权限的RAM Policy策略如下:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:List*", "kms:DescribeKey" ], "Resource": [ "acs:kms:*:1416614965936597:*" //当前示例表示允许调用该账号下所有的KMS密钥,如果仅限制使用某个KMS,此处可输入对应的CMK ID。 ] } ] }
- 上传文件至设置了默认加密方式的Bucket
- 指定Bucket上传文件权限。
- 若设置加密方式为KMS指定的CMK ID,还需要“ListKeys”、“Listalias”、“ListAliasesByKeyId”、“DescribeKeys”以及“GenerateDataKey”权限,若无改权限,则上传文件失败。指定CMK
ID相关权限的RAM Policy策略如下:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:List*", "kms:DescribeKey", "kms:GenerateDataKey" ], "Resource": [ "acs:kms:*:1416614965936597:*"//当前示例表示允许调用该账号下所有的KMS密钥,如果仅限制使用某个KMS,此处可输入对应的CMK ID ] } ] }
- 从设置了默认加密方式的Bucket中下载文件
- 指定Bucket的文件访问权限。
- 若设置加密方式为KMS指定的CMK ID,还需要“Decrypt”权限,若无该权限,则下载文件失败。指定CMK ID相关权限的RAM Policy 策略如下:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "acs:kms:*:1416614965936597:*"//该示例表示子账号具有当前所有KMS的解密权限。若要针对某个KMS密钥进行解密,此处可输入对应的CMK ID ] } ] }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论