您在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
阿里云SDK名稱 | RAM憑據插件模塊名稱 | 說明 |
無。 |
身份認證方式
使用RAM憑據插件時支持如下兩種身份認證方式:
應用接入點(AAP)的Client Key:可以通過KMS實例Endpoint獲取憑據值,也可以通過KMS服務Endpoint獲取憑據值。使用前您需要創建應用接入點(AAP)以及ClientKey。具體操作,請參見創建應用接入點。
ECS實例RAM角色:通過KMS服務Endpoint調用OpenAPI。使用前您需要創建ECS實例RAM角色。具體操作,請參見通過ECS實例RAM角色授權ECS訪問其他云資源。
為了獲得更高QPS、更低時延,推薦您使用應用接入點(AAP)的Client Key,并通過KMS實例Endpoint獲取憑據值。
通過配置文件設置RAM憑據插件運行參數
RAM憑據插件僅支持通過配置文件方式,配置運行參數。您需要在應用程序的運行目錄中新增配置文件(managed_credentials_providers.properties),根據不同認證方式在配置文件中新增內容。
如果您的應用程序無法自動讀取到managed_credentials_providers.properties文件,請參考代碼示例,通過在代碼中設置配置文件路徑的方式讀取。
(推薦)使用應用接入點(AAP)的Client Key,通過KMS實例Endpoint獲取憑據值。
參數名稱為
cache_client_dkms_config_info
,采用JSON數組格式。您可配置多個KMS實例,以支持業務獲得更高標準的服務可用性保障和容災能力。根據Client Key憑證口令獲取方式不同,配置文件示例如下。方式一:通過文件獲取Client Key憑證口令
cache_client_dkms_config_info=[{"regionId":"<your kms region>","endpoint":"<your kms endpoint>","passwordFromFilePath":"<your client key password file absolute path>","clientKeyFile":"<your client key file absolute path>","ignoreSslCerts":false,"caFilePath":"<your DKMS's CA certificate file absolute path>"}]
cache_client_dkms_config_info=[{"regionId":ch-hangzhou","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromFilePath":"C:\RamSecretPlugin\src\main\resources\clientKeyPassword.txt","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]
方式二:通過環境變量獲取Client Key憑證口令
該方式您需要將Client Key文件的憑證口令配置到環境變量中,環境變量名稱即您在
passwordFromEnvVariable
中指定的名稱。cache_client_dkms_config_info=[{"regionId":"<your kms region>","endpoint":"<your kms endpoint>","passwordFromEnvVariable":"<your_password_env_variable>","clientKeyFile":"<your client key file absolute path>","ignoreSslCerts":false,"caFilePath":"<your DKMS's CA certificate file absolute path>"}]
配置項
配置項含義
說明
regionId
KMS實例所在地域ID。
具體的地域ID,請參見地域和接入地址。
endpoint
KMS實例的域名地址,格式為
{實例ID}.kms.aliyuncs.com
。在控制臺實例管理頁面,單擊目標KMS實例,在實例詳情頁面查看實例VPC地址,將
https://
去掉后即為KMS實例的域名地址。clientKeyFile
Client Key文件(JSON格式)的絕對路徑或相對路徑。
Client Key文件:在應用接入點AAP中創建Client Key時下載的應用身份憑證內容(ClientKeyContent),下載后文件名默認為ClientKey_******.json。
憑證口令:在應用接入點AAP中創建Client Key時保存的憑證口令(ClientKeyPassword)。
重要Client Key文件和憑證口令是一一對應的,僅支持您在創建Client Key時獲取。如果您在創建時未保存,則需要在應用接入點AAP中重新創建Client Key。更多詳細內容,請參見創建應用接入點。
passwordFromFilePath或passwordFromEnvVariable
passwordFromFilePath:從文件中獲取憑證口令,取值為文件的絕對路徑或相對路徑。您需要將憑證口令保存到文件中。
passwordFromEnvVariable:從環境變量獲取憑證口令,取值為環境變量名稱。您需要將憑證口令配置到環境變量中。
ignoreSslCerts
是否忽略KMS實例SSL證書的有效性檢查。KMS實例內置SSL證書,使用SSL/TLS協議用于身份驗證和加密通信。取值:
true:表示忽略,不檢查KMS實例SSL證書的有效性。
說明取值為true時,無需配置caFilePath。
false:表示驗證,檢查KMS實例SSL證書的有效性。
正式生產環境中,請將該值設置為false。
caFilePath
KMS實例CA證書文件的絕對路徑或相對路徑。
KMS實例CA證書,用于檢查KMS實例SSL證書的有效性。例如:檢查KMS實例SSL證書是否由對應的CA中心簽發、是否在有效期內、以及對應的域名是否為KMS實例的域名地址(endpoint)。
在實例管理頁面,單擊獲取實例CA證書區域的下載,下載KMS實例的CA證書。更多詳細內容,請參見獲取實例CA證書。
使用應用接入點(AAP)的Client Key,通過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#"}]
使用ECS實例RAM角色,通過KMS服務Endpoint獲取憑據值。
credentials_type=ecs_ram_role ## ECS RAM Role名稱 credentials_role_name=#credentials_role_name# ## 關聯的KMS服務地域 cache_client_region_id=[{"regionId":"#regionId#"}]
代碼示例
Java
阿里云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為例:
運行以下示例代碼時,請自行在pom.xml中添加云服務器aliyun-java-sdk-ecs依賴。
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.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.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() }