背景信息
创建数据表时默认不加密,如果要配置数据表加密,需要在创建数据表时配置加密相关参数。表格存储提供基于密钥管理服务(Key Management Service,简称KMS)密钥加密和基于自带密钥(Bring Your Own Key,简称BYOK)自定义密钥加密两种加密方式。两种加密方式的加密密钥均需在KMS获取,请根据实际需要选择。
密钥管理服务KMS是一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台,提供简单、可靠、安全、合规的数据加密保护和凭据管理能力。KMS帮助您降低在密码基础设施、数据加解密产品和凭据管理产品上的采购、运维、研发开销,以便您只需关注业务本身。更多信息,请参见什么是密钥管理服务。
加密方式 | 使用方式 | 说明 |
基于KMS服务密钥加密 | | 表格存储使用默认的KMS CMK生成密钥来加密数据,并且在读取数据时自动解密。首次使用时,表格存储会在KMS控制台创建一个KMS CMK。您无需购买KMS实例即可直接使用。 |
基于BYOK自定义密钥加密 | | 在KMS控制台使用BYOK材料生成CMK后,表格存储基于您自定义的密钥进行数据加密。您可以自行管理使用的加密密钥。 |
适用场景
适用于对数据存储有高安全性或者合规性要求的应用场景。
使用方式
使用控制台
通过控制台创建数据表时,支持使用基于KMS服务密钥加密和基于BYOK自定义密钥加密中的任意一种方式进行数据加密。
基于KMS服务密钥加密
登录表格存储管理控制台。
在页面上方,选择地域。
在概览页面,单击实例名称或在操作列单击实例管理。
在实例详情页签,单击创建数据表。
在创建数据表对话框,配置数据表参数。
说明 关于数据表参数说明的更多信息,请参见创建数据表。
配置数据表名称、表主键、是否允许更新等。
打开是否加密开关,选择加密类型为kms服务主密钥。
单击确定。
创建数据表后,单击数据表名称,您可以在表管理页面中基本详情页签,确认数据表的是否加密取值为是-kms服务主密钥,表示数据表已配置数据加密功能。
基于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自定义密钥,然后配置密钥ID和ARN。
单击确定。
创建数据表后,单击数据表名称,您可以在表管理页面中基本详情页签,确认数据表的是否加密取值为是-BYOK自定义密钥,表示数据表已配置数据加密功能。
使用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自定义密钥加密
已通过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);
}