您在KMS託管RAM使用者的AccessKey後,可以安裝RAM憑據外掛程式,在使用阿里雲SDK時通過引用RAM憑據的名稱,擷取AccessKey完成API鑒權,無需關注AccessKey的具體資訊或者是否被輪轉。本文介紹RAM憑據外掛程式的工作原理、安裝和使用。
工作原理
RAM憑據外掛程式根據憑據名稱,從KMS擷取RAM憑據值並緩衝在應用程式的記憶體中。應用程式使用阿里雲SDK時,通過RAM憑據外掛程式本機快取的AccessKey向雲產品發起請求。
當由於憑據輪轉等原因導致RAM憑據外掛程式本機快取的AccessKey失效時,RAM憑據外掛程式將立即向KMS重新擷取憑據並重新整理本機快取,並根據您設定的錯誤重試行為,通過最新擷取的RAM憑據重試雲產品調用請求。RAM憑據外掛程式預設依據云產品調用響應錯誤碼InvalidAccessKeyId和InvalidAccessKeyId.NotFound來判斷AccessKey無效。
支援的阿里雲SDK
KMS為下表中的阿里雲SDK提供了RAM憑據外掛程式。
Java SDK(僅支援Java 8及以上版本)
阿里雲SDK名稱 | RAM憑據外掛程式模組名稱 |
Python SDK
阿里雲SDK名稱 | RAM憑據外掛程式模組名稱 | 說明 |
無。 |
Go SDK
Go憑據外掛程式遇到InvalidAccessKeyId錯誤時不會自動重試。自動輪轉的憑據可依靠定時重新整理機制(6小時)正常擷取新憑據,如果需手動輪換憑據,請確保輪換視窗至少為 12小時,以避免因憑據失效導致任務中斷。更多資訊,請參見Go RAM 外掛程式報錯 InvalidAccessKeyId後,憑據失效如何解決?。
阿里雲SDK名稱 | RAM憑據外掛程式模組名稱 | 說明 |
無。 |
步驟一:建立訪問憑證
情境一:通過共用網關擷取憑據值
網路類型為公網或VPC網路。訪問憑證支援ECS執行個體RAM角色、ClientKey。
ECS執行個體RAM角色
ECS RAM 角色是指為 ECS 執行個體授予的 RAM 角色,該 RAM 角色是一個受信服務為雲端服務器的普通服務角色。使用執行個體 RAM 角色可以實現在 ECS 執行個體內部無需配置 AccessKey 即可擷取臨時訪問憑證(STS Token),從而調用 KMS 的 OpenAPI。
具體操作,請參見執行個體RAM角色。
登入RAM 控制台,建立可信實體為阿里雲服務的 RAM 角色。
信任主體類型:選擇云服务器。
信任主體名稱:選擇Elastic Compute Service。
授予 RAM 角色訪問 KMS 的許可權。
方式一:設定基於身份的策略
單擊 RAM 角色操作列的新增授权,直接綁定 KMS 內建系統權限原則到 RAM 角色。KMS 內建系統權限原則,請參見Key Management Service系統權限原則參考。
說明同時支援自訂權限原則,具體操作請參見建立自訂權限原則。
方式二:設定基於資源的策略
KMS 支援基於資源的策略,即為單個密鑰和憑據設定存取權限,用於控制哪些阿里雲帳號、RAM 使用者、RAM 角色有許可權來管理或使用 KMS 密鑰、憑據。詳細介紹,請參見密鑰策略、憑據策略。
登入ECS 管理主控台,將 RAM 角色授予 ECS 執行個體。
ClientKey
登入Key Management Service控制台,在頂部功能表列選擇地區後,在左側導覽列單擊。
建立網路規則(非必須)。
說明如果不需要基於來源 IP 限制訪問,則不需要設定網路規則。但為了更高的安全性,通常建議合理設定。
單擊网络规则頁簽,然後單擊创建网络规则。
在创建网络规则面板,网络类型選擇Public,填寫允许访问的源IP地址後,單擊確定。
建立權限原則。
單擊权限策略,然後單擊创建权限策略。
在创建权限策略面板,按照下方提示完成共用網關配置後,單擊確定。
作用域:KMS共享网关
允许访问的资源:勾選需要訪問的憑據
网络控制规则(非必須):勾選步驟二建立網路規則。
建立應用存取點 AAP。
單擊应用接入頁簽,然後單擊创建应用接入点。
在创建应用接入点面板,创建模式選擇标准创建,然後按照下方提示完成各項配置。
配置項
說明
认证方式
選擇 ClientKey
Client Key加密口令
設定 8~64 位元包含數字、英文大小寫、特殊字元
~!@#$%^&*?_-的字串有效期
重要推薦設定為 1 年,以降低 ClientKey 被泄露的風險。請務必在到期前更換,以免無法正常訪問 KMS。具體操作,請參見更換ClientKey。
权限策略
選擇步驟三建立的權限原則。
單擊確認,瀏覽器會自動下載ClientKey。ClientKey包含以下內容:
应用身份凭证内容(ClientKeyContent):檔案名稱預設為
clientKey_****.json憑證口令(ClientKeyPassword):檔案名稱預設為
clientKey_****_Password.txt。
情境二:通過專屬網關擷取憑據值(不推薦)
網路類型為KMS私人網路。訪問憑證僅支援ClientKey。
ClientKey 支援快速建立和標準建立兩種方式。關於 ClientKey 的詳細介紹,請參見應用存取點概述、建立應用存取點。
方式一:快速建立
操作便捷高效,適用於快速測試和開發情境,該方式建立的訪問憑證可以訪問 KMS 執行個體的全部資源。
登入Key Management Service控制台,在頂部功能表列選擇地區後,在左側導覽列單擊。
在应用接入頁簽,單擊创建应用接入点,在创建应用接入点面板完成各項配置。
配置項
說明
创建模式
選擇快速创建。
作用域(KMS实例)
選擇應用要訪問的KMS執行個體。
应用接入点名称
自訂應用存取點的名稱。
认证方式
預設為ClientKey,不支援修改。
密碼編譯演算法
選擇用於加密 ClientKey 的密碼編譯演算法。可選 TripleDES-CBC 或 RC2-CBC,預設為 RC2-CBC。
默认权限策略
預設為
key/*secret/*,不支援修改。即應用可以訪問指定KMS執行個體中的所有密鑰和憑據。單擊確認,瀏覽器會自動下載ClientKey。ClientKey包含以下內容:
应用身份凭证内容(ClientKeyContent):檔案名稱預設為
clientKey_****.json憑證口令(ClientKeyPassword):檔案名稱預設為
clientKey_****_Password.txt。
方式二:標準建立
若希望對資源設定更精細化的存取權限,建議使用標準建立。
請參考建立應用存取點中的標準建立方式,建立用於訪問專屬網關的 ClientKey。關鍵配置說明如下:
配置網路規則時,網路類型選擇Private。
配置許可權規則範圍時,請選擇對應的KMS 執行個體 ID。
建立完成後,瀏覽器會自動下載 ClientKey。ClientKey 包含以下內容:
应用身份凭证内容(ClientKeyContent):檔案名稱預設為
clientKey_****.json憑證口令(ClientKeyPassword):檔案名稱預設為
clientKey_****_Password.txt。
步驟二:通過設定檔設定RAM憑據外掛程式運行參數
RAM憑據外掛程式僅支援通過設定檔方式,配置運行參數。您需要在應用程式的運行目錄中新增設定檔(managed_credentials_providers.properties),根據不同認證方式在設定檔中新增內容。
如果您的應用程式無法自動讀取到managed_credentials_providers.properties檔案,請參考程式碼範例,通過在代碼中設定設定檔路徑的方式讀取。
ECS執行個體RAM角色
設定檔內容如下。
credentials_type=ecs_ram_role
## ECS RAM Role名稱
credentials_role_name=#credentials_role_name#
## 關聯的KMS服務地區
cache_client_region_id=[{"regionId":"#regionId#"}]ClientKey(共用網關)
通過KMS共用網關Endpoint擷取憑據值,設定檔內容如下。
## 訪問憑據類型。
credentials_type=client_key
## 讀取client key的憑證口令:支援從環境變數或者檔案讀取。
## 憑證口令:在應用存取點AAP中建立Client Key時儲存的憑證口令(ClientKeyPassword)。
client_key_password_from_env_variable=#your client key private key password environment variable name#
client_key_password_from_file_path=#your client key private key password file path#
# Client Key檔案路徑。
# Client Key檔案:在應用存取點AAP中建立Client Key時下載的應用身份憑證內容(ClientKeyContent)。
# 下載後檔案名稱預設為ClientKey_******.json。
client_key_private_key_path=#your client key private key file path#
## 關聯的KMS服務地區。
cache_client_region_id=[{"regionId":"#regionId#"}]ClientKey(專屬網關)
通過KMS專屬網關Endpoint擷取憑據值,設定檔內容如下。
方案一:配置ClientKey憑證口令(
clientKey_****_Password.txt)檔案的路徑,由SDK讀取其中的內容。cache_client_dkms_config_info=[{"regionId":"<your dkms regionId>","endpoint":"<your dkms endpoint>","passwordFromFilePath":"< your password file path >","clientKeyFile":"<your Client Key file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]方案二:直接配置ClientKey憑證口令(ClientKeyPassword)內容
警告請先將憑證口令(ClientKeyPassword)即
clientKey_****_Password.txt中的內容,存放至自訂環境變數(如clientKeyPassword_content)中。cache_client_dkms_config_info=[{"regionId":"<your dkms regionId>","endpoint":"<your dkms endpoint>","passwordFromEnvVariable":"<YOUR_PASSWORD_ENV_VARIABLE>","clientKeyFile":"<your ClientKey file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]
步驟三:在雲產品SDK中使用RAM憑據外掛程式
Java
阿里雲Java SDK(V2.0)
Java 9+ 相容性說明
通過Maven的方式在專案中引入RAM憑據外掛程式。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-tea-openapi-sdk-managed-credentials-provider</artifactId> <version>[1.3.5,]</version> </dependency>說明建議您安裝最新版本的外掛程式,更多資訊,請參見原始代碼。
獲得阿里雲Java SDK用戶端並調用雲端服務,以調用ECS DescribeInstances為例。
添加雲端服務器ecs20140526依賴。
<dependency> <groupId>com.aliyun</groupId> <artifactId>ecs20140526</artifactId> <version>7.1.0</version> </dependency>調用DescribeInstances介面。
import com.aliyun.ecs20140526.Client; import com.aliyun.ecs20140526.models.DescribeInstancesResponse; import com.aliyun.kms.secretsmanager.plugin.tea.openapi.ProxyClientCreator; import com.google.gson.Gson; public class AliyunTeaOpenApiProviderSample { public static void main(String[] args) throws Exception { // Step 1: 指定託管憑據的名稱(在KMS中建立的憑據名稱) String secretName = "your-secret-name"; /* 如果應用無法設定從classpath和可執行jar包中讀取預設設定檔(managed_credentials_providers.properties), 或需自訂設定檔名稱時,可調用以下代碼設定自訂設定檔,並按以下順序讀取: 1."your-config-name"配置絕對路徑+檔案名稱,即讀取絕對路徑下的檔案 2."your-config-name"僅設定檔名稱,預設先讀取classpath下的設定檔,再讀取可執行jar包中的設定檔 */ //ConfigLoader.setConfigName("your-config-name"); // Step 2: 配置 OpenAPI 用戶端 com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); config.endpoint = "your-product-endpoint"; // 替換為實際的雲產品 endpoint // Step 3: 建立用戶端執行個體 Client client = ProxyClientCreator.createClient(config, Client.class, secretName); // Step 4: 調用雲端服務 API com.aliyun.ecs20140526.models.DescribeInstancesRequest request = new com.aliyun.ecs20140526.models.DescribeInstancesRequest(); request.setRegionId("cn-hangzhou"); // 設定地區ID DescribeInstancesResponse response = client.describeInstances(request); // Step 5: 列印結果 System.out.println(new Gson().toJson(response.getBody())); } }
阿里雲Java SDK(V1.0)
通過Maven的方式在專案中引入RAM憑據外掛程式。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>[4.3.2,5.0.0]</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core-managed-credentials-provider</artifactId> <version>[1.3.1,]</version> </dependency>說明建議您安裝最新版本的外掛程式,更多資訊,請參見原始代碼。
獲得阿里雲Java SDK用戶端並調用雲端服務。
以調用ECS DescribeInstanceStatus為例。
添加雲端服務器aliyun-java-sdk-ecs依賴。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>5.11.20</version> </dependency>調用DescribeInstanceStatus介面。
import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusResponse; import com.aliyun.kms.secretsmanager.plugin.sdkcore.ProxyAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; public class AliyunSdkProviderSample { public static void main(String[]args) { String secretName="******"; /* 如果應用無法設定從classpath和可執行jar包中讀取預設設定檔(managed_credentials_providers.properties), 或需自訂設定檔名稱時,可調用以下代碼設定自訂設定檔,並按以下順序讀取: 1."your-config-name"配置絕對路徑+檔案名稱,即讀取絕對路徑下的檔案 2."your-config-name"僅設定檔名稱,預設先讀取classpath下的設定檔,再讀取可執行jar包中的設定檔 */ //ConfigLoader.setConfigName("your-config-name"); // 1. 擷取ACSClient by aliyun-java-sdk-managed-credentials-provider IAcsClient client = null; try { client = new ProxyAcsClient("<the regionId of ECS>", secretName); } catch (ClientException e) { e.printStackTrace(); } // 2. 調用ECS的OpenAPI實現業務功能 DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest(); DescribeInstanceStatusResponse response; try { response = client.getAcsResponse(request); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } // 3. 通過下面方法關閉用戶端來釋放外掛程式關聯的資源 client.shutdown(); } }
在OSS SDK中使用
通過Maven的方式在專案中引入RAM憑據外掛程式。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.17</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>[2.1.0,3.10.2]</version> <exclusions> <exclusion> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-kms</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-sdk-oss-managed-credentials-provider</artifactId> <version>[1.3.1,]</version> </dependency>說明建議您安裝最新版本的外掛程式,更多資訊,請參見原始代碼。
獲得OSS Java SDK用戶端並調用雲端服務,以調用OSS listBuckets 為例:
import com.aliyun.kms.secretsmanager.plugin.oss.ProxyOSSClientBuilder; import com.aliyun.oss.OSS; import com.aliyun.oss.model.Bucket; import java.util.List; public class OssProviderSample { public static void main(String[] args) throws Exception { String secretName = "******"; String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; /* 如果應用無法設定從classpath和可執行jar包中讀取預設設定檔(managed_credentials_providers.properties), 或需自訂設定檔名稱時,可調用以下代碼設定自訂設定檔,並按以下順序讀取: 1."your-config-name"配置絕對路徑+檔案名稱,即讀取絕對路徑下的檔案 2."your-config-name"僅設定檔名稱,預設先讀取classpath下的設定檔,再讀取可執行jar包中的設定檔 */ //ConfigLoader.setConfigName("your-config-name"); // 擷取Oss Client OSS ossClient = new ProxyOSSClientBuilder().build(endpoint, secretName); // 以下為業務方業務代碼:調用阿里雲OSS服務實現業務功能 List<Bucket> buckets = ossClient.listBuckets(); for (Bucket bucket : buckets) { if (bucket != null) { // ... } } // 通過下面方法關閉用戶端來釋放外掛程式關聯的資源 ossClient.shutdown(); } }
Python
阿里雲Python SDK(V1.0)
執行pip命令以在專案中使用RAM憑據外掛程式。
pip install aliyun-openapi-python-sdk-managed-credentials-provider說明請確保外掛程式版本為0.1.0及以上版本,更多資訊,請參見原始代碼。
獲得阿里雲Python SDK用戶端並調用雲端服務。
from aliyun_sdk_secretsmanager_sdk_core_plugin.proxy_acs_client import ProxyAcsClient region="cn-hangzhou" secretName="******" # 1. 擷取ACSClient client = ProxyAcsClient(region_id=region, secret_name=secretName ) # 2. 業務方業務代碼:使用client調用阿里雲服務,無需代碼改動。 ... # 3. 通過下面方法關閉用戶端來釋放外掛程式關聯的資源 client.shutdown()
OSS Python SDK
執行pip命令以在專案中使用RAM憑據外掛程式。
pip install aliyun-oss-python-sdk-managed-credentials-provider說明請確保外掛程式版本為0.1.0及以上版本,更多資訊,請參見原始代碼。
獲得阿里雲OSS Python SDK用戶端並調用雲端服務。
from aliyun_sdk_secretsmanager_oss_plugin.proxy_bucket import ProxyBucket from itertools import islice endpoint = "******" secret_name ="******" bucket_name = "******" bucket = ProxyBucket(secret_name=secret_name, endpoint=endpoint, bucket_name=bucket_name) objects = bucket.list_objects() for b in islice(objects.object_list, 10): print(b.key) bucket.shutdown()
Go
阿里雲Go SDK(V1.0)
安裝阿里雲Go SDK的RAM憑據外掛程式。
重要建議安裝最新版本的外掛程式,更多資訊,請參見原始代碼。
Go語言下RAM憑據外掛程式依賴的
alibaba-cloud-sdk-go版本需小於v1.63.0,請在外掛程式的go.mod檔案中檢查並確認版本,以避免潛在的相容性問題。
方式一:使用
go.mod管理您的依賴。在
go.mod檔案中添加以下內容安裝依賴包。require ( github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/alibaba-cloud-sdk-go-managed-credentials-provider vX.X.X )方式二:使用
go get命令擷取遠程程式碼封裝。go get -u github.com/aliyun/aliyun-sdk-mxanaged-credentials-providers-go/aliyun-sdk-managed-credentials-providers/alibaba-cloud-sdk-go-managed-credentials-provider
獲得阿里雲Go SDK的用戶端並調用雲端服務。
以調用ECS DescribeInstances 為例:
package sample import ( "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" sdkcoreprovider "github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/alibaba-cloud-sdk-go-managed-credentials-provider/sdk" ) func main() { secretName := "********" regionId := "cn-hangzhou" client, err := sdkcoreprovider.GetClient(&ecs.Client{}, regionId, secretName) if err != nil { fmt.Println(err) return } ecsClient := client.(*ecs.Client) request := ecs.CreateDescribeInstancesRequest() instancesResponse, err := ecsClient.DescribeInstances(request) if err != nil { fmt.Println(err) return } for _, instance := range instancesResponse.Instances.Instance { // do something with instance } }
OSS Go SDK
安裝OSS Go SDK的RAM憑據外掛程式。
重要建議安裝最新版本的外掛程式,更多資訊,請參見原始代碼。
Go語言下RAM憑據外掛程式依賴的
alibaba-cloud-sdk-go版本需小於v1.63.0,請在外掛程式的go.mod檔案中檢查並確認版本,以避免潛在的相容性問題。
方式一:使用
go.mod管理您的依賴。在
go.mod檔案中添加以下內容安裝依賴包。require ( github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/aliyun-oss-go-sdk-managed-credentials-provider vX.X.X )方式二:使用
go get命令擷取遠程程式碼封裝。go get -u github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/aliyun-oss-go-sdk-managed-credentials-provider
獲得阿里雲OSS Go SDK用戶端並調用雲端服務。
package sample import ( "fmt" ossprovider "aliyun-oss-go-sdk-managed-credentials-provider/sdk" ) func main() { secretName := "********" endpoint := "https://oss-cn-hangzhou.aliyuncs.com" // 擷取Proxy Oss Client client, err := ossprovider.New(endpoint, secretName) if err != nil { fmt.Println(err) return } result, err := client.ListBuckets() if err != nil { fmt.Println(err) return } for _, bucket := range result.Buckets { //業務代碼 } // 關閉用戶端來釋放外掛程式關聯的資源 client.Shutdown() }
常見問題
Go RAM 外掛程式報錯 InvalidAccessKeyId後,憑據失效如何解決?
問題原因:
Go 憑據外掛程式在遇到
InvalidAccessKeyId錯誤時不會自動重試。手動輪轉時若設定了較短的輪轉視窗(比如10分鐘)小於6小時,可能會遇到用戶端AK失效但本機快取還沒來得及重新整理的情況。
解決方案
等待系統自動重新整理:自動輪轉的憑據可依靠定時重新整理機制( 時間間隔為6 小時))正常擷取新憑據。
即時重新整理:在遇到憑據失效時,捕捉異常並調用
sdk.RefreshSecretInfo(secretName)方法,手動重新整理RAM憑據。定時重新整理:設定一個定時任務,通過自訂的頻率調用
sdk.RefreshSecretInfo(secretName)重新整理RAM憑據,確保在憑據失效前就獲得新的憑據。調整輪轉視窗:針對RAM憑據手動輪轉情境,建議輪轉視窗大於12小時。