对象存储OSS支持服务器端加密功能。上传文件(Object)时,OSS对收到的文件进行加密,再将得到的加密文件持久化保存;下载文件时,OSS自动将加密文件解密后返回给用户,并在返回的HTTP请求Header中,声明该文件进行了服务器端加密。
加密方式
OSS通过服务器端加密机制,提供静态数据保护。适合于对于文件存储有高安全性或者合规性要求的应用场景。例如,深度学习样本文件的存储、在线协作类文档数据的存储。
- 使用KMS(Key Management Service)托管密钥进行加解密(SSE-KMS)
使用KMS托管的默认CMK(Customer Master Key)或指定CMK进行加解密操作。数据无需通过网络发送到KMS服务端进行加解密,是一种低成本的加解密方式。注意
- 使用KMS密钥功能会产生少量的KMS密钥使用费用。费用详情,请参见KMS计费标准。
- 用于加密Object的密钥也会被加密,并写入Object的元信息中。
- KMS托管密钥的服务器端加密方式仅加密Object数据,不加密Object的元数据。
- 使用OSS完全托管密钥进行加解密(SSE-OSS)
使用OSS完全托管的密钥加密每个Object。为了提升安全性,OSS还会使用定期轮转的主密钥对加密密钥本身进行加密。该方式适合于批量数据的加解密。
操作方式
操作方式 | 说明 |
---|---|
控制台 | Web应用程序,直观易用。 |
命令行工具ossutil | 命令行工具,性能好。 |
Java SDK | 丰富、完整的各类语言SDK demo。 |
Python SDK | |
Go SDK |
使用KMS托管密钥进行加解密
使用KMS托管的用户主密钥CMK生成加密密钥加密数据,通过信封加密机制,可进一步防止未经授权的数据访问。借助KMS,您可以专注于数据加解密、电子签名验签等业务功能,无需花费大量成本来保障密钥的保密性、完整性和可用性。
- 使用OSS默认托管的KMS密钥
OSS使用默认托管的KMS CMK生成不同的密钥来加密不同的Object,并且在下载时自动解密。首次使用时,OSS会在KMS平台创建一个OSS托管的CMK。
配置方式如下:
- 配置Bucket默认加密方式
配置Bucket默认加密方式为KMS,指定加密算法为AES256或SM4,但不指定具体的CMK ID。此后,所有上传至此Bucket的Object都会被加密。
- 为指定Object配置加密方式
上传Object或修改Object的meta信息时,在请求中携带
x-oss-server-side-encryption
参数,并设置参数值为KMS
。此时,OSS将使用默认托管的KMS CMK,并通过AES256加密算法加密Object。如需修改加密算法为SM4,您还需增加x-oss-server-side-data-encryption
参数,并指定值为SM4
。更多详情,请参见PutObject。
- 配置Bucket默认加密方式
- 使用自带密钥BYOK(Bring Your Own Key)
您在KMS控制台使用BYOK材料生成CMK后,OSS可使用指定的KMS CMK生成不同的密钥来加密不同的Object,并将加密Object的CMK ID记录到Object的元数据中,只有具有解密权限的用户下载Object时才会自动解密。
BYOK材料来源有两种:- 由阿里云提供的BYOK材料:在KMS平台创建密钥时,选择密钥材料来源为阿里云KMS。
- 使用用户自有的BYOK材料:在KMS平台创建密钥时,选择密钥材料来源为外部,并按照要求导入外部密钥材料。导入外部密钥可参考文档导入密钥材料。
配置方式如下:- 配置Bucket默认加密方式
配置Bucket默认加密方式为KMS,指定加密算法为AES256或SM4,并指定具体的CMK ID。此后,所有上传至此Bucket的Object都会被加密。
- 为目标Object配置加密方式
上传Object或修改Object的meta信息时,在请求中携带
x-oss-server-side-encryption
参数,并设置参数值为KMS
;携带x-oss-server-side-encryption-key-id
参数,并设置参数值为指定CMK ID。此时,OSS将使用指定的KMS CMK,并通过AES256加密算法加密Object。如需修改加密算法,您还需增加x-oss-server-side-data-encryption
参数,并设置参数值为SM4
。更多详情,请参见PutObject。
使用OSS完全托管密钥进行加解密
OSS负责生成和管理数据加密密钥,并采用高强度、多因素的安全措施进行保护。数据加密的算法采用行业标准的AES256(即256位高级加密标准)和国密SM4算法。
配置方式如下:
- 配置Bucket默认加密方式
配置Bucket默认加密方式为OSS完全托管,并指定加密算法为AES256或SM4。此后,所有上传至此Bucket的Object都会默认被加密。
- 为目标Object配置加密方式
上传Object或修改Object的meta信息时,在请求中携带
x-oss-server-side-encryption
参数,并设置参数值为AES256
或SM4
。此时,目标Object将使用OSS完全托管的密钥进行加密。更多详情,请参见PutObject。
权限说明
- 设置Bucket默认加密方式
- 具有对目标Bucket的管理权限。
- 具有
PutBucketEncryption
和GetBucketEncryption
权限。 - 若设置加密方式为SSE-KMS,且指定了CMK ID,还需要
ListKeys
、Listalias
、ListAliasesByKeyId
以及DescribeKeys
权限。此场景下的RAM Policy授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:List*", "kms:DescribeKey" ], "Resource": [ "acs:kms:*:1416614965936597:*" //示例表示允许调用该账号下所有的KMS密钥,如果仅允许使用某个CMK,此处可输入对应的CMK ID。 ] } ] }
- 上传文件至设置了默认加密方式的Bucket
- 具有目标Bucket的上传文件权限。
- 若设置加密方式为KMS,并指定了CMK ID,还需要
ListKeys
、Listalias
、ListAliasesByKeyId
、DescribeKeys
、GenerateDataKey
以及kms:Decrypt
权限。此场景下的RAM Policy授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:List*", "kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": [ "acs:kms:*:1416614965936597:*"//示例表示允许调用该账号下所有的KMS密钥,如果仅允许使用某个CMK,此处可输入对应的CMK ID。 ] } ] }
- 从设置了默认加密方式的Bucket中下载文件
- 具有目标Bucket的文件访问权限。
- 若设置加密方式为KMS,并指定了CMK ID,还需要
Decrypt
权限。此场景下的RAM Policy授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "acs:kms:*:1416614965936597:*"//示例表示具有当前所有KMS的解密权限。若要针对某个KMS密钥进行解密,此处可输入对应的CMK ID。 ] } ] }
常见问题
配置Bucket默认加密方式后,OSS会对历史文件进行加密吗?
OSS只对服务器端加密配置生效后上传的Object进行加密,不会加密历史文件。若您需要加密历史文件,可通过CopyObject覆写历史文件。