為了保證表資料安全,Table Store提供了資料落盤加密功能。建立資料表時您可以配置資料表加密。Table Store提供基於Key Management Service(Key Management Service,簡稱KMS)祕密金鑰加密和基於內建密鑰(Bring Your Own Key,簡稱BYOK)自訂祕密金鑰加密兩種加密方式,請根據實際需要選擇。
前提條件
已通過Table Store控制台建立執行個體。具體操作,請參見建立執行個體。
已初始化Client。具體操作,請參見初始化OTSClient。
基於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); }