创建加密表

为了保证表数据安全,表格存储提供了数据落盘加密功能。创建数据表时您可以配置数据表加密。表格存储提供基于密钥管理服务(Key Management Service,简称KMS)密钥加密和基于自带密钥(Bring Your Own Key,简称BYOK)自定义密钥加密两种加密方式,请根据实际需要选择。

前提条件

  • 已通过表格存储控制台创建实例。具体操作,请参见创建实例

  • 已初始化Client。具体操作,请参见初始化

基于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自定义密钥。
        //keyIdKMS自定义服务密钥的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);
    }