为了保证表数据安全,表格存储提供了数据落盘加密功能。创建数据表时您可以配置数据表加密。表格存储提供基于密钥管理服务(Key Management Service,简称KMS)密钥加密和基于自带密钥(Bring Your Own Key,简称BYOK)自定义密钥加密两种加密方式,请根据实际需要选择。
前提条件
基于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自定义密钥加密
已通过KMS控制台创建软件密钥。具体操作,请参见软件密钥。
创建自定义角色并配置权限。
创建自定义角色。具体操作,请参见创建可信实体为阿里云账号的RAM角色。
配置角色名称为AliyunOTSAccessingKMS。
创建自定义权限策略,配置为KMS加解密权限。具体操作,请参见通过脚本编辑模式创建自定义权限策略。
配置权限策略名称为otskmspolicytest。权限策略示例如下:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "*" ] } ] }
为自定义角色(AliyunOTSAccessingKMS)授予KMS加解密权限策略(otskmspolicytest)。具体操作,请参见为RAM角色授权。
授权完成后,记录角色的ARN,即需要扮演角色的ID。
修改自定义角色的信任策略。具体操作,请参见修改RAM角色的信任策略。
角色的信任策略示例如下:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ots.aliyuncs.com" ] } } ], "Version": "1" }
创建数据表时配置加密参数。
创建数据表并配置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); }