文档

数据加密

更新时间:

为了保证表数据安全,表格存储提供了数据落盘加密功能。您可以在创建数据表时配置数据表加密。

背景信息

创建数据表时默认不加密,如果要配置数据表加密,需要在创建数据表时配置加密相关参数。表格存储提供基于密钥管理服务(Key Management Service,简称KMS)密钥加密和基于自带密钥(Bring Your Own Key,简称BYOK)自定义密钥加密两种加密方式。两种加密方式的加密密钥均需在KMS获取,请根据实际需要选择。

密钥管理服务KMS是一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台,提供简单、可靠、安全、合规的数据加密保护和凭据管理能力。KMS帮助您降低在密码基础设施、数据加解密产品和凭据管理产品上的采购、运维、研发开销,以便您只需关注业务本身。更多信息,请参见什么是密钥管理服务

加密方式

使用方式

说明

基于KMS服务密钥加密

  • 表格存储管理控制台

  • SDK

表格存储使用默认的KMS CMK生成密钥来加密数据,并且在读取数据时自动解密。首次使用时,表格存储会在KMS控制台创建一个KMS CMK。您无需购买KMS实例即可直接使用。

基于BYOK自定义密钥加密

SDK

在KMS控制台使用BYOK材料生成CMK后,表格存储基于您自定义的密钥进行数据加密。您可以自行管理使用的加密密钥。

适用场景

适用于对数据存储有高安全性或者合规性要求的应用场景。

注意事项

  • 数据加密功能只支持在创建数据表时配置。

  • 数据加密功能开启后不支持关闭,请谨慎操作。

  • 目前支持使用数据加密功能的地域有华东1(杭州)、华东1 金融云、华东2(上海)、华南1(深圳)、华北2(北京)、华北3(张家口)、中国香港、新加坡、美国(硅谷)、美国(弗吉尼亚)、英国(伦敦)、日本(东京)、澳大利亚(悉尼)关停中、德国(法兰克福)、印度尼西亚(雅加达)。

使用方式

使用控制台

通过控制台只支持使用基于KMS服务密钥加密的方式进行数据加密。表格存储负责生成和管理数据加密密钥。

  1. 登录表格存储管理控制台

  2. 在页面上方,选择地域。

  3. 概览页面,单击实例名称或在操作列单击实例管理

  4. 实例详情页签,单击创建数据表

  5. 创建数据表对话框,配置数据表参数。

    关于数据表参数说明的更多信息,请参见创建数据表

    1. 配置数据表名称、表主键、是否允许更新等。

    2. 打开是否加密开关后,选择加密类型kms服务主密钥

    image..png

  6. 单击确定

    创建数据表后,单击数据表名称,您可以在表管理页面中基本详情页签,确认表的是否加密取值为是-kms服务主密钥,表示数据表已配置数据加密功能。

    image..png

使用SDK

通过SDK创建数据表时支持使用基于KMS服务密钥加密和基于BYOK自定义密钥加密中的任意一种方式进行数据加密。您可以通过Java SDK实现数据加密。

基于KMS服务密钥加密

创建数据表并配置KMS服务密钥,只要开通KMS即可,无需创建KMS实例。创建数据表后,您可以通过DescribeTable接口查询数据表的加密配置。

以下示例用于创建数据表时使用基于KMS服务密钥加密表中数据。该表的主键为pk(String类型),属性列值只保留最新版本数据以及数据永不过期。

private static void createTable(SyncClient client) {
    //设置数据表名称。
    TableMeta tableMeta = new TableMeta("<TABLE_NAME>");
    //如果要配置表加密,需要对建表请求配置加密相关参数,支持KMS服务密钥或BYOK自定义密钥两种类型。此处为使用KMS服务密钥。
    SSESpecification sseKms = new SSESpecification(true, SSEKeyType.SSE_KMS_SERVICE);
    //为数据表添加主键列。
    tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk", PrimaryKeyType.STRING)); 
    //数据的过期时间,单位为秒,-1表示永不过期。带索引表的数据表数据生命周期必须设置为-1。
    int timeToLive = -1; 
    //保存的最大版本数,1表示每列上最多保存一个版本即保存最新的版本。带索引表的数据表最大版本数必须设置为1。
    int maxVersions = 1; 
    TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
    CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
    //设置预留读写吞吐量,容量型实例中的数据表只能设置为0,高性能实例中的数据表可以设置为非零值。
    request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0))); 
    request.setSseSpecification(sseKms);
    client.createTable(request);
}

基于BYOK自定义密钥加密

  1. 已通过KMS控制台创建软件密钥。具体操作,请参见软件密钥

  2. 创建自定义角色并配置权限。

    1. 创建自定义角色。具体操作,请参见创建可信实体为阿里云账号的RAM角色

      配置角色名称为AliyunOTSAccessingKMS。

    2. 创建自定义权限策略,配置为KMS加解密权限。具体操作,请参见通过脚本编辑模式创建自定义权限策略

      配置权限策略名称为otskmspolicytest。权限策略示例如下:

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "kms:Decrypt",
                      "kms:GenerateDataKey"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
    3. 为自定义角色(AliyunOTSAccessingKMS)授予KMS加解密权限策略(otskmspolicytest)。具体操作,请参见为RAM角色授权

      授权完成后,记录角色的ARN,即需要扮演角色的ID。

      image..png

    4. 修改自定义角色的信任策略。具体操作,请参见修改RAM角色的信任策略

      角色的信任策略示例如下:

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "ots.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
  3. 创建数据表时配置加密参数。

    创建数据表并配置BYOK密钥。创建数据表后,您可以通过DescribeTable接口查询数据表的加密配置。

    以下示例用于创建数据表时使用BYOK密钥加密表中数据。该表的主键为pk(String类型),属性列值只保留最新版本数据以及数据永不过期。

    private static void createTable(SyncClient client) {
        //设置数据表名称。
        TableMeta tableMeta = new TableMeta("<TABLE_NAME>");
        //如果要配置表加密,需要对建表请求配置加密相关参数,支持KMS服务密钥或BYOK自定义密钥两种类型。
        //设置为步骤1中通过KMS控制台创建的软件密钥ID。
        String keyId="key-hzz65****************";
        //设置为步骤2中记录的角色ARN信息。
        String roleArn="acs:ram::****************:role/aliyunotsaccessingkms";
        //此处使用BYOK自定义密钥。
        //keyId为KMS自定义服务密钥的ID。roleArn为角色ARN,您需要创建一个角色,然后获取roleArn作为参数填写到建表请求中。
        SSESpecification sseByok = new SSESpecification(true, SSEKeyType.SSE_BYOK, keyId, roleArn);
        //为数据表添加主键列。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk", PrimaryKeyType.STRING)); 
        //数据的过期时间,单位为秒,-1表示永不过期。带索引表的数据表数据生命周期必须设置为-1。
        int timeToLive = -1; 
        ////保存的最大版本数,1表示每列上最多保存一个版本即保存最新的版本。带索引表的数据表最大版本数必须设置为1。
        int maxVersions = 1; 
        TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
        CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
        request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0))); //设置预留读写吞吐量,容量型实例中的数据表只能设置为0,高性能实例中的数据表可以设置为非零值。
        request.setSseSpecification(sseByok);
        client.createTable(request);
    }

计费说明

数据加密费用由密钥管理服务KMS进行收取。更多信息,请参见密钥管理服务产品计费