对象存储OSS支持服务器端加密功能。上传文件(Object)时,OSS对收到的文件进行加密,再将得到的加密文件持久化保存;下载文件时,OSS自动将加密文件解密后返回给用户,并在返回的HTTP请求Header中,声明该文件进行了服务器端加密。

注意 无法使用Bucket的默认加密方式自动加密镜像回源的文件。

加密方式

OSS通过服务器端加密机制,提供静态数据保护。适合于对于文件存储有高安全性或者合规性要求的应用场景。例如,深度学习样本文件的存储、在线协作类文档数据的存储。

同一对象在同一时间内仅可以使用一种服务器端加密方式。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,您可以专注于数据加解密、电子签名验签等业务功能,无需花费大量成本来保障密钥的保密性、完整性和可用性。

SSE-KMS加密方式的逻辑示意图如下。加密1
使用SSE-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

  • 使用自带密钥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参数,并设置参数值为AES256SM4。此时,目标Object将使用OSS完全托管的密钥进行加密。更多详情,请参见PutObject

权限说明

RAM用户在如下场景中使用服务端加解密时,需要具有以下权限:
  • 设置Bucket默认加密方式
    • 具有对目标Bucket的管理权限。
    • 具有PutBucketEncryptionGetBucketEncryption权限。
    • 若设置加密方式为SSE-KMS,且指定了CMK ID,还需要ListKeysListaliasListAliasesByKeyId以及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,还需要ListKeysListaliasListAliasesByKeyIdDescribeKeys以及GenerateDataKey权限。此场景下的RAM Policy授权策略如下:
      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "kms:List*",
              "kms:DescribeKey",
              "kms:GenerateDataKey"
            ],
            "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覆写历史文件。