当您在设置了服务器端加密的存储空间(Bucket)中上传文件(Object)时,OSS对收到的文件进行加密,再将得到的加密文件持久化保存。当您通过GetObject请求下载文件时,OSS自动将加密文件解密后返回给用户,并在响应头中返回x-oss-server-side-encryption,用于声明该文件进行了服务器端加密。
使用场景
OSS通过服务器端加密机制,提供静态数据保护。适合于对于文件存储有高安全性或者合规性要求的应用场景。例如,深度学习样本文件的存储、在线协作类文档数据的存储。
注意事项
- 华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北 3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国香港、美国(硅谷)、美国(弗吉尼亚)、日本(东京)、韩国(首尔)、新加坡、澳大利亚(悉尼)、马来西亚(吉隆坡)、印度尼西亚(雅加达)、菲律宾(马尼拉)、泰国(曼谷)、印度(孟买)、德国(法兰克福)、英国(伦敦)、阿联酋(迪拜)地域支持开启服务器端加密。
- 无法使用存储空间的默认加密方式自动加密镜像回源的文件。
- 开启或修改存储空间默认加密方式不会影响存储空间中已有文件的加密配置。
- 同一个Object在同一时间内仅可以使用一种服务器端加密方式。
- 如果配置了存储空间加密,仍然可以在上传或拷贝Object时单独对Object配置加密方式,且以Object配置的加密方式为准。详情请参见PutObject。
加密方式
OSS针对不同使用场景提供了两种服务器端加密方式,您可以根据实际使用场景选用。
加密方式 | 功能描述 | 使用场景 | 注意事项 | 费用说明 |
---|---|---|---|---|
使用KMS托管密钥进行加解密(SSE-KMS) | 使用KMS托管的默认CMK(Customer Master Key)或指定CMK进行加解密操作。数据无需通过网络发送到KMS服务端进行加解密。 | 因安全合规的要求,需要使用自管理、可指定的密钥。 |
| 在KMS服务侧产生少量的KMS密钥请求费用。费用详情,请参见KMS计费标准。 |
使用OSS完全托管密钥进行加解密(SSE-OSS) | 使用OSS完全托管的密钥加密每个Object。为了提升安全性,OSS还会使用定期轮转的主密钥对加密密钥本身进行加密。 | 仅需要基础的加密能力,对密钥无自管理需求。 | 无 | 免费 |
使用OSS控制台
方式一:创建Bucket时开启服务器端加密功能
- 登录OSS管理控制台。
- 单击Bucket列表,然后单击创建Bucket。
- 在创建Bucket面板,按以下说明填写各项参数。
其中,服务器端加密区域配置参数说明如下:
参数 说明 服务端加密方式 选择Object的加密方式。 - 无:不启用服务器端加密。
- OSS完全托管:使用OSS托管的密钥进行加密。OSS会为每个Object使用不同的密钥进行加密,作为额外的保护,OSS会使用定期轮转的主密钥对加密密钥本身进行加密。
- KMS:使用KMS默认托管的CMK或指定CMK ID进行加解密操作。
使用KMS加密方式前,需要开通KMS服务。具体步骤,请参见购买专属KMS实例。
加密算法 仅支持AES256。 加密密钥 仅当加密方式选择KMS时,需要配置该选项。 - alias/acs/oss:使用默认托管的CMK生成不同的密钥来加密不同的Object,并且在Object被下载时自动解密。
- CMK ID:使用指定的CMK生成不同的密钥来加密不同的Object,并将加密Object的CMK ID记录到Object的元信息中,具有解密权限的用户下载Object时会自动解密。
指定的CMK ID前,您需要在KMS管理控制台创建一个与Bucket处于相同地域的普通密钥或外部密钥。详情请参见创建密钥。
其他参数配置详情,请参见创建存储空间。
- 单击确定。
方式二:对已创建的Bucket开启服务器端加密
- 登录OSS管理控制台。
- 单击Bucket列表,然后单击目标Bucket名称。
- 在左侧导航栏,选择 。
- 在服务器端加密页面,单击设置,按以下说明配置各项参数。
参数 说明 服务端加密方式 选择Object的加密方式。 - 无:不启用服务器端加密。
- OSS完全托管:使用OSS托管的密钥进行加密。OSS会为每个Object使用不同的密钥进行加密,作为额外的保护,OSS会使用定期轮转的主密钥对加密密钥本身进行加密。
- KMS:使用KMS默认托管的CMK或指定CMK ID进行加解密操作。
使用KMS加密方式前,需要开通KMS服务。具体步骤,请参见购买专属KMS实例。
加密算法 仅支持AES256。 加密密钥 仅当加密方式选择KMS时,需要配置该选项。 - alias/acs/oss:使用默认托管的CMK生成不同的密钥来加密不同的Object,并且在Object被下载时自动解密。
- CMK ID:使用指定的CMK生成不同的密钥来加密不同的Object,并将加密Object的CMK ID记录到Object的元信息中,具有解密权限的用户下载Object时会自动解密。
指定的CMK ID前,您需要在KMS管理控制台创建一个与Bucket处于相同地域的普通密钥或外部密钥。详情请参见创建密钥。
- 单击保存。
使用阿里云SDK
以下仅列举常见SDK的服务器端加密的代码示例。关于其他SDK的服务器端加密的代码示例,请参见SDK简介。
import com.aliyun.oss.*;
import com.aliyun.oss.model.*;
public class Demo {
public static void main(String[] args) throws Throwable {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写KMS用户主密钥ID, 例如e1935511-cf88-1123-a0f8-1be8d2511***。
String kmsId = "e1935511-cf88-1123-a0f8-1be8d2511***";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 设置Bucket加密。
ServerSideEncryptionByDefault applyServerSideEncryptionByDefault = new ServerSideEncryptionByDefault(SSEAlgorithm.KMS);
applyServerSideEncryptionByDefault.setKMSMasterKeyID(kmsId);
ServerSideEncryptionConfiguration sseConfig = new ServerSideEncryptionConfiguration();
sseConfig.setApplyServerSideEncryptionByDefault(applyServerSideEncryptionByDefault);
SetBucketEncryptionRequest request = new SetBucketEncryptionRequest(bucketName, sseConfig);
ossClient.setBucketEncryption(request);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Model\ServerSideEncryptionConfig;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "<yourAccessKeyId>";
$accessKeySecret = "<yourAccessKeySecret>";
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
try {
// 将Bucket默认的服务器端加密方式设置为OSS完全托管加密(SSE-OSS)。
$config = new ServerSideEncryptionConfig("AES256");
$ossClient->putBucketEncryption($bucket, $config);
// 将Bucket默认的服务器端加密方式设置为KMS,且不指定CMK ID。
$config = new ServerSideEncryptionConfig("KMS");
$ossClient->putBucketEncryption($bucket, $config);
// 将Bucket默认的服务器端加密方式设置为KMS,且指定了CMK ID。
$config = new ServerSideEncryptionConfig("KMS", "your kms id");
$ossClient->putBucketEncryption($bucket, $config);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require("ali-oss");
const store = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret',
// yourbucketname填写存储空间名称。
bucket: 'yourbucketname'
});
async function putBucketEncryption() {
try {
// 配置Bucket加密方式。
const result = await store.putBucketEncryption("bucket-name", {
SSEAlgorithm: "AES256", // 此处以设置AES256加密为例。若使用KMS加密,需添加KMSMasterKeyID属性。
// KMSMasterKeyID:“yourKMSMasterKeyId”,设置KMS密钥ID,加密方式为KMS可设置此项。当SSEAlgorithm值为KMS,且使用指定的密钥加密时,需输入密钥ID。其他情况下,必须为空。
});
console.log(result);
} catch (e) {
console.log(e);
}
}
putBucketEncryption();
# -*- coding: utf-8 -*-
import oss2
from oss2.models import ServerSideEncryptionRule
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 创建Bucket加密配置,以AES256加密为例。
rule = ServerSideEncryptionRule()
rule.sse_algorithm = oss2.SERVER_SIDE_ENCRYPTION_AES256
# 设置KMS密钥ID,加密方式为KMS可设置此项。如需使用指定的密钥加密,需输入指定的CMK ID;若使用OSS托管的CMK进行加密,此项为空。使用AES256进行加密时,此项必须为空。
rule.kms_master_keyid = ""
# 设置Bucket加密。
result = bucket.put_bucket_encryption(rule)
# 查看HTTP返回码。
print('http response code:', result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
var accessKeyId = "yourAccessKeyId";
var accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
var bucketName = "examplebucket";
// 创建OSSClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 配置Bucket加密。
var request = new SetBucketEncryptionRequest(bucketName, "KMS", null);
client.SetBucketEncryption(request);
Console.WriteLine("Set bucket:{0} Encryption succeeded ", bucketName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 初始化一个加密规则,加密方式以AES256为例。
config := oss.ServerEncryptionRule{SSEDefault: oss.SSEDefaultRule{SSEAlgorithm: "AES256"}}
err = client.SetBucketEncryption("yourBucketName", config)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS账号信息。*/
/* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/* 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
/* 填写Bucket名称,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
SetBucketEncryptionRequest setrequest(BucketName);
setrequest.setSSEAlgorithm(SSEAlgorithm::KMS);
/* 设置KMS服务端加密。*/
auto outcome = client.SetBucketEncryption(setrequest);
if (!outcome.isSuccess()) {
/* 异常处理。*/
std::cout << "SetBucketEncryption fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 释放网络等资源。*/
ShutdownSdk();
return 0;
}
使用命令行工具ossutil
方式一:创建Bucket时开启服务器端加密
关于使用ossutil在创建Bucket时开启服务器端加密的具体操作,请参见bucket-encryption(服务器端加密)。
方式二:上传文件并指定加密方式
关于使用ossutil上传文件并指定加密方式的具体操作,请参见上传并指定加密方式。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketEncryption。
使用KMS托管密钥进行加解密
使用KMS托管的用户主密钥CMK生成加密密钥加密数据,通过信封加密机制,可进一步防止未经授权的数据访问。借助KMS,您可以专注于数据加解密、电子签名验签等业务功能,无需花费大量成本来保障密钥的保密性、完整性和可用性。

- 使用OSS默认托管的KMS密钥
OSS使用默认托管的KMS CMK生成不同的密钥来加密不同的Object,并且在下载时自动解密。首次使用时,OSS会在KMS平台创建一个OSS托管的CMK。
配置方式如下:
- 配置Bucket默认加密方式
配置Bucket默认加密方式为KMS,但不指定具体的CMK ID。此后,所有上传至此Bucket的Object都会被加密。
- 为指定Object配置加密方式
上传Object或修改Object的meta信息时,在请求中携带
x-oss-server-side-encryption
参数,并设置参数值为KMS
。此时,OSS将使用默认托管的KMS CMK,并通过AES256加密算法加密Object。更多详情,请参见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,并指定具体的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。更多详情,请参见PutObject。
使用OSS完全托管密钥进行加解密
OSS负责生成和管理数据加密密钥,并采用高强度、多因素的安全措施进行保护。数据加密的算法采用行业标准的AES256(即256位高级加密标准)算法。
配置方式如下:
- 配置Bucket默认加密方式
配置Bucket默认加密方式为OSS完全托管,并指定加密算法为AES256。此后,所有上传至此Bucket的Object都会默认被加密。
- 为目标Object配置加密方式
上传Object或修改Object的meta信息时,在请求中携带
x-oss-server-side-encryption
参数,并设置参数值为AES256
。此时,目标Object将使用OSS完全托管的密钥进行加密。更多详情,请参见PutObject。
权限说明
RAM用户在不同场景中使用服务端加解密的权限说明如下:
- 设置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:*:141661496593****:*" //表示允许调用该阿里云账号ID下所有的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:*:141661496593****:*"//表示允许调用该阿里云账号ID下所有的KMS密钥,如果仅允许使用某个CMK,此处可输入对应的CMK ID。 ] } ] }
- 从设置了默认加密方式的Bucket中下载文件
- 具有目标Bucket的文件访问权限。
- 若设置加密方式为KMS,并指定了CMK ID,还需要
Decrypt
权限。此场景下的RAM Policy授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "acs:kms:*:141661496593****:*"//表示具有该阿里云账号ID下所有KMS的解密权限。若要针对某个KMS密钥进行解密,此处可输入对应的CMK ID。 ] } ] }
常见问题
配置Bucket默认加密方式后,OSS会对历史文件进行加密吗?
OSS只对服务器端加密配置生效后上传的Object进行加密,不会加密历史文件。若您需要加密历史文件,可通过CopyObject覆写历史文件。