為了保證表數據安全,表格存儲提供了數據落盤加密功能。您可以在創建數據表時配置數據表加密。
背景信息
創建數據表時默認不加密,如果要配置數據表加密,需要在創建數據表時配置加密相關參數。表格存儲提供基于密鑰管理服務(Key Management Service,簡稱KMS)密鑰加密和基于自帶密鑰(Bring Your Own Key,簡稱BYOK)自定義密鑰加密兩種加密方式。兩種加密方式的加密密鑰均需在KMS獲取,請根據實際需要選擇。
密鑰管理服務KMS是一站式密鑰管理和數據加密服務平臺、一站式憑據安全管理平臺,提供簡單、可靠、安全、合規的數據加密保護和憑據管理能力。KMS幫助您降低在密碼基礎設施、數據加解密產品和憑據管理產品上的采購、運維、研發開銷,以便您只需關注業務本身。更多信息,請參見什么是密鑰管理服務。
加密方式 | 使用方式 | 說明 |
基于KMS服務密鑰加密 |
| 表格存儲使用默認的KMS CMK生成密鑰來加密數據,并且在讀取數據時自動解密。首次使用時,表格存儲會在KMS控制臺創建一個KMS CMK。您無需購買KMS實例即可直接使用。 |
基于BYOK自定義密鑰加密 |
| 在KMS控制臺使用BYOK材料生成CMK后,表格存儲基于您自定義的密鑰進行數據加密。您可以自行管理使用的加密密鑰。 |
適用場景
適用于對數據存儲有高安全性或者合規性要求的應用場景。
注意事項
數據加密功能只支持在創建數據表時配置。
數據加密功能開啟后不支持關閉,請謹慎操作。
目前支持數據加密功能的地域包括華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華北6(烏蘭察布)、華南1(深圳)、中國香港、日本(東京)、新加坡、印度尼西亞(雅加達)、德國(法蘭克福)、英國(倫敦)、美國(硅谷)、美國(弗吉尼亞)、華東1 金融云、華北2 阿里政務云1。
使用方式
使用控制臺
通過控制臺創建數據表時,支持使用基于KMS服務密鑰加密和基于BYOK自定義密鑰加密中的任意一種方式進行數據加密。
基于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" }
創建數據表并配置加密。
使用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); }
計費說明
數據加密費用由密鑰管理服務KMS進行收取。更多信息,請參見密鑰管理服務產品計費。