您可以使用KMS建立憑據,在應用程式中整合您的憑據資訊,實現對敏感性資料的統一管理。本文介紹如何建立憑據以及如何在應用程式中整合憑據資訊。
背景資訊
KMS提供憑據的建立、更新、刪除等全生命週期的管理服務,應用程式通過SDK來擷取憑據,解決您在應用程式中寫入程式碼憑據帶來的敏感性資料泄露問題。
KMS支援託管通用憑據、RAM憑據、資料庫憑據和ECS憑據。關於憑據的更多資訊,請參見憑據管理概述。
注意事項
KMS使用您指定的密鑰來加密憑據值,該密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型。
前提條件
已購買並啟用KMS執行個體。具體操作,請參見購買和啟用KMS執行個體。
已在KMS執行個體中建立用於加密憑據的對稱金鑰。具體操作,請參見建立密鑰。
步驟一:建立憑據
建立憑據時支援設定輪轉資訊,KMS將定期為您更新憑據值,保護您的憑據安全。
登入Key Management Service控制台,在頂部功能表列選擇地區後,在左側導覽列單擊。
在凭据管理頁面單擊您要建立的憑據頁簽,選擇实例ID後,單擊创建凭据,完成各項配置後單擊確定。
通用憑據
說明通用憑據不支援在建立時設定輪轉資訊,如果您需要輪轉通用憑據,請參見管理及使用通用憑據。
配置項
說明
凭据名称
自訂的憑據名稱。憑據名稱在當前地區內唯一。
设置凭据值
根據您要託管的敏感性資料類型,選擇憑據鍵/值或純文字。
長度不超過30720位元組(30KB)。
初始版本号
憑據的初始版本號碼。預設為v1,也支援自訂版本號碼。
加密主密钥
選擇用於加密憑據值的密鑰。
重要密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型和密鑰規格。
如果是RAM使用者、RAM角色,需要具備使用加密主要金鑰執行GenerateDataKey操作的許可權。
標籤
憑據的標籤,方便您對憑據進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
說明標籤鍵和標籤值的格式:最多支援128個字元,可以包含英文大小寫字母、數字、正斜線(/)、反斜線(\)、底線(_)、短劃線(-)、半形句號(.)、加號(+)、等號(=)、半形冒號(:)、字元at(@)、空格。
標籤鍵不能以aliyun或acs:開頭。
每個憑據最多可以設定20個標籤索引值對。
描述信息
憑據的描述資訊。
憑據的策略配置。詳細介紹,請參見憑據策略概述。
您可以先選擇預設策略,建立憑據後根據業務需要再修改策略。
RAM憑據
配置項
說明
选择RAM用户
選擇您要託管憑據的RAM使用者,所選RAM使用者至少需要有一個AccessKey。若沒有,請先建立AccessKey,詳細步驟請參考建立AccessKey。
憑據名稱根據RAM使用者的名稱自動產生,憑據名稱在當前地區內是唯一。
设置凭据值
輸入對應的AccessKey Secret。
長度不超過30720位元組(30KB)。
加密主密钥
選擇用於加密憑據值的密鑰。
重要密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型和密鑰規格。
如果是RAM使用者、RAM角色,需要具備使用加密主要金鑰執行GenerateDataKey操作的許可權。
標籤
憑據的標籤,方便您對憑據進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
說明標籤鍵和標籤值的格式:最多支援128個字元,可以包含英文大小寫字母、數字、正斜線(/)、反斜線(\)、底線(_)、短劃線(-)、半形句號(.)、加號(+)、等號(=)、半形冒號(:)、字元at(@)、空格。
標籤鍵不能以aliyun或acs:開頭。
每個憑據最多可以設定20個標籤索引值對。
自动轮转
選擇開啟或關閉憑據的周期性自動輪轉。
天数(7天~365天)
僅當开启自动轮转需要設定。
表示輪轉的周期,設定後KMS將定期為您更新憑據值。
描述信息
憑據的描述資訊。
憑據的策略配置。詳細介紹,請參見憑據策略概述。
您可以先選擇預設策略,建立憑據後根據業務需要再修改策略。
資料庫憑據(RDS)
僅支援選擇创建单个凭据。
配置項
說明
数据库类型
選擇RDS凭据。
凭据名称
自訂的憑據名稱。憑據名稱在當前地區內唯一。
RDS实例
選擇阿里雲帳號下已有的RDS執行個體。
账号托管
双账号托管(推薦):適用於程式化訪問資料庫情境。託管兩個相同許可權的帳號,保證口令重設切換的瞬間,程式訪問資料庫不被中斷。
單擊新建账号,配置帳號名、選擇資料庫並指定許可權。
說明一鍵建立和授權不會立即為您配置新的帳號,而是在您審核確認憑據資訊之後進行配置。
單擊导入已有账号,選擇使用者名稱、配置口令。
說明建議您將口令配置為建立RDS執行個體使用者帳號時對應的密碼。如果匯入的帳號和口令不匹配,您可以在憑據首次輪轉之後,擷取正確的帳號和口令。
单账号托管:適用於高許可權帳號或者人工營運帳號託管情境。口令重設切換的瞬間,憑據的目前的版本可能暫時無法使用。
單擊新建账号,配置帳號名、選擇帳號類型。
您可以選擇普通账号和高权限账号兩種帳號類型。當您選擇普通账号時,還需選擇資料庫並指定許可權。
單擊导入已有账号頁簽,選擇使用者名稱、配置口令。
加密主密钥
選擇用於加密憑據值的密鑰。
重要密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型和密鑰規格。
如果是RAM使用者、RAM角色,需要具備使用加密主要金鑰執行GenerateDataKey操作的許可權。
標籤
憑據的標籤,方便您對憑據進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
說明標籤鍵和標籤值的格式:最多支援128個字元,可以包含英文大小寫字母、數字、正斜線(/)、反斜線(\)、底線(_)、短劃線(-)、半形句號(.)、加號(+)、等號(=)、半形冒號(:)、字元at(@)、空格。
標籤鍵不能以aliyun或acs:開頭。
每個憑據最多可以設定20個標籤索引值對。
自动轮转
選擇開啟或關閉憑據的周期性自動輪轉。
轮转周期
僅當开启自动轮转時需要設定。支援設定為6小時~365天。
表示輪轉的周期,設定後KMS將定期為您更新憑據值。
描述信息
憑據的描述資訊。
憑據的策略配置。詳細介紹,請參見憑據策略概述。
您可以先選擇預設策略,建立憑據後根據業務需要再修改策略。
資料庫憑據(PolarDB)
僅支援選擇创建单个凭据,並且僅支援PolarDB MySQL/PgSQL新建账号、双账号托管,不支援导入已有账号、以及单账号托管。
配置項
說明
数据库类型
選擇PolarDB凭据。
凭据名称
自訂的憑據名稱,憑據名稱在當前地區內唯一。
PolarDB实例
選擇阿里雲帳號下已有的PolarDB執行個體。
账号托管
双账号托管:適用於程式化訪問資料庫情境。建立兩個相同許可權的帳號,保證口令重設切換的瞬間,程式訪問資料庫不被中斷。
新建账号:配置帳號名和許可權,帳號類型只支援普通帳號。MySQL憑據建立時候需要選擇資料庫+許可權
說明一鍵建立和授權不會立即為您配置新的帳號,而是在您審核確認憑據資訊之後進行配置。
帳號名必須唯一,如果帳號名已經存在,就不能託管到憑據中。
加密主密钥
選擇用於加密憑據值的密鑰。
重要密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型和密鑰規格。
如果是RAM使用者、RAM角色,需要具備使用加密主要金鑰執行GenerateDataKey操作的許可權。
標籤
憑據的標籤,方便您對憑據進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
說明標籤鍵和標籤值的格式:最多支援128個字元,可以包含英文大小寫字母、數字、正斜線(/)、反斜線(\)、底線(_)、短劃線(-)、半形句號(.)、加號(+)、等號(=)、半形冒號(:)、字元at(@)、空格。
標籤鍵不能以aliyun或acs:開頭。
每個憑據最多可以設定20個標籤索引值對。
自动轮转
選擇開啟或關閉憑據的周期性自動輪轉。
轮转周期
僅當开启自动轮转時需要設定。支援設定為6小時~365天。
表示輪轉的周期,設定後KMS將定期為您更新憑據值。
描述信息
憑據的描述資訊。
憑據的策略配置。詳細介紹,請參見憑據策略概述。
您可以先選擇預設策略,建立憑據後根據業務需要再修改策略。
資料庫憑據(Redis)
支援创建单个凭据和创建批量凭据,以單個憑據為例介紹。
配置項
說明
数据库类型
選擇Redis/Tair实例。
凭据名称
自訂的憑據名稱。憑據名稱在當前地區內唯一。
Redis/Tair实例
選擇阿里雲帳號下已有的Redis執行個體或Tair執行個體。
账号托管
僅支援双账号托管。
设置凭据值
僅支援託管新建立的帳號且僅支援雙帳號託管,不支援託管已存在的Redis/Tair存量帳號。
定制账号名:您需要自訂Redis/Tair資料庫的帳號,此時KMS會調用Redis/Tair的API新建立兩個許可權相同的資料庫帳號及口令。以Redis為例,您自訂的Redis資料庫的帳號為
user,則會建立兩個Redis資料庫帳號user、user_clone。指定权限:取值為读写、只读。新建立的兩個資料庫帳號許可權相同。
加密主密钥
選擇用於加密憑據值的密鑰。
重要密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型和密鑰規格。
如果是RAM使用者、RAM角色,需要具備使用加密主要金鑰執行GenerateDataKey操作的許可權。
標籤
憑據的標籤,方便您對憑據進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
說明標籤鍵和標籤值的格式:最多支援128個字元,可以包含英文大小寫字母、數字、正斜線(/)、反斜線(\)、底線(_)、短劃線(-)、半形句號(.)、加號(+)、等號(=)、半形冒號(:)、字元at(@)、空格。
標籤鍵不能以aliyun或acs:開頭。
每個憑據最多可以設定20個標籤索引值對。
自动轮转
選擇開啟或關閉憑據的周期性自動輪轉。
轮转周期
僅當開啟自动轮转時需要設定。支援設定為6小時~365天。
表示輪轉的周期,設定後KMS將定期為您更新憑據值。
描述信息
憑據的描述資訊。
憑據的策略配置。詳細介紹,請參見憑據策略概述。
您可以先選擇預設策略,建立憑據後根據業務需要再修改策略。
ECS憑據
配置項
說明
凭据名称
自訂的憑據名稱。憑據名稱在當前地區內唯一。
托管实例
選擇阿里雲帳號下已有的ECS執行個體。
托管用户
填寫ECS執行個體上已有的使用者名稱稱,例如:root(Linux系統)或Administrator(Windows系統)。
初始凭据值
長度不超過30720位元組(30KB)。
口令:使用者登入ECS執行個體的密碼。
金鑰組:使用者登入ECS執行個體的SSH金鑰組。
說明請您輸入正確的憑據值。如果輸入的憑據值不正確,在ECS憑據首次輪轉前,您從KMS擷取到的口令或金鑰組將不能正常登入ECS執行個體。
加密主密钥
選擇用於加密憑據值的密鑰。
重要密鑰和憑據需要屬於同一個KMS執行個體,且密鑰必須為對稱金鑰。關於KMS支援哪些對稱金鑰,請參見密鑰管理類型和密鑰規格。
如果是RAM使用者、RAM角色,需要具備使用加密主要金鑰執行GenerateDataKey操作的許可權。
標籤
憑據的標籤,方便您對憑據進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
說明標籤鍵和標籤值的格式:最多支援128個字元,可以包含英文大小寫字母、數字、正斜線(/)、反斜線(\)、底線(_)、短劃線(-)、半形句號(.)、加號(+)、等號(=)、半形冒號(:)、字元at(@)、空格。
標籤鍵不能以aliyun或acs:開頭。
每個憑據最多可以設定20個標籤索引值對。
自动轮转
選擇開啟或關閉憑據的周期性自動輪轉。
轮转周期
僅當开启自动轮转時需要設定。支援設定為1小時~365天。
表示輪轉的周期,設定後KMS將定期為您更新憑據值。
描述信息
憑據的描述資訊。
憑據的策略配置。詳細介紹,請參見憑據策略概述。
您可以先選擇預設策略,建立憑據後根據業務需要再修改策略。
步驟二:應用程式擷取憑據
本文以阿里雲SDK Java版為例進行介紹。
準備工作
環境準備。
環境要求
已下載並安裝Java 8或以上版本。
驗證版本
開啟終端,輸入
java -version,查看Java(JDK)版本。安裝SDK。
在專案中添加Maven依賴,從Maven倉庫中自動下載Java安裝包。請使用阿里雲SDK(V2.0)。
<dependency> <groupId>com.aliyun</groupId> <artifactId>kms20160120</artifactId> <version>1.2.3</version> </dependency>建立介面調用憑證。
阿里雲SDK支援基於RAM的多種認證方式,本文以使用RAM使用者的AccessKey為例。更多認證方式的介紹,請參見管理訪問憑據。
在RAM控制台建立RAM使用者的AccessKey。具體操作,請參見建立AccessKey。
如果您已有AccessKey,請跳過該步驟。

為RAM使用者佈建合適的存取權限。
例如,您希望該RAM使用者能擷取憑據值,可以授予其系統權限原則
AliyunKMSSecretUserAccess和AliyunKMSCryptoUserAccess。具體操作,請參見為RAM使用者授權。
說明KMS提供了兩種設定存取權限的途徑:
擷取KMS執行個體的CA認證。
在实例管理頁面,單擊软件密钥管理或硬件密钥管理頁簽後,選擇目標KMS執行個體。
單擊執行個體ID或單擊操作列詳情,在詳情頁,執行個體CA認證地區單擊下载並妥善保管。
CA認證下載後檔案名稱預設為PrivateKmsCA_kst-******.pem。

擷取執行個體VPC地址。
在实例管理頁面,單擊软件密钥管理或硬件密钥管理頁簽後,選擇目標KMS執行個體。
單擊執行個體ID進入到詳情頁,查看实例VPC地址。

擷取憑據
初始化阿里雲SDK。
重要請使用阿里雲SDK(V2.0),Endpoint請填寫執行個體VPC地址,同時需要設定執行個體CA認證。
public static com.aliyun.kms20160120.Client createClient() throws Exception { // 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。 // 建議使用更安全的 STS 方式,更多鑒權訪問方式請參見:https://www.alibabacloud.com/help/document_detail/378657.html。 com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。 .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // Endpoint請輸入執行個體VPC地址,例如kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com config.endpoint = "<執行個體VPC地址>"; // 請填寫執行個體ca認證的內容 config.ca = "<執行個體CA認證>"; return new com.aliyun.kms20160120.Client(config); }調用GetSecretValue擷取憑據值。
// This file is auto-generated, don't edit it. Thanks. package com.aliyun.sample; import com.aliyun.tea.*; public class Sample { public static com.aliyun.kms20160120.Client createClient() throws Exception { // 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。 // 建議使用更安全的 STS 方式,更多鑒權訪問方式請參見:https://www.alibabacloud.com/help/document_detail/378657.html。 com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。 .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // Endpoint請輸入執行個體VPC地址,例如kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com config.endpoint = "<執行個體VPC地址>"; // 請填寫執行個體ca認證的內容 config.ca = "<執行個體CA認證>"; return new com.aliyun.kms20160120.Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.kms20160120.Client client = Sample.createClient(); com.aliyun.kms20160120.models.GetSecretValueRequest getSecretValueRequest = new com.aliyun.kms20160120.models.GetSecretValueRequest() .setSecretName("<SecretName>"); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); try { // 複製代碼運行請自行列印 API 的傳回值 client.getSecretValueWithOptions(getSecretValueRequest, runtime); } catch (TeaException error) { // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。 // 錯誤 message System.out.println(error.getMessage()); // 診斷地址 System.out.println(error.getData().get("Recommend")); com.aliyun.teautil.Common.assertAsString(error.message); } catch (Exception _error) { TeaException error = new TeaException(_error.getMessage(), _error); // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。 // 錯誤 message System.out.println(error.getMessage()); // 診斷地址 System.out.println(error.getData().get("Recommend")); com.aliyun.teautil.Common.assertAsString(error.message); } } }