日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

管理訪問憑據

更新時間:

在使用阿里云SDK調用OpenAPI操作資源時,必須正確配置憑證信息。Go V1.0 SDK支持多種憑據配置方式,本文詳細闡述了如何配置訪問憑據,以確保安全有效地使用SDK進行開發。

背景信息

在使用阿里云SDK進行開發時,需要根據具體的應用場景和授權需求選擇合適的訪問憑據類型,并正確配置和管理這些憑據。通過合理設置環境變量或配置文件,確保SDK能夠正確讀取和使用憑據,從而幫助開發者構建穩定、可靠的應用程序。

前提條件

  • Go 環境版本必須不低于 1.10.x。

  • 安裝 SDK 核心庫 Core

    go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk

初始化憑據客戶端

方式一:使用默認憑證鏈

當您在初始化憑據客戶端不傳入任何參數時,SDK會使用默認憑據鏈方式初始化客戶端。默認憑據的讀取邏輯請參見默認憑據鏈

package main

import (
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
)

func main() {
    config := sdk.NewConfig()
    
    // 不傳參數
    credentialsProvider := credentials.NewDefaultCredentialsProvider()
    
    // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou。
    sdk.NewClientWithOptions("<REGION_ID>", config, credentialsProvider)
    
    // 省略調用API步驟...
}

方式二:使用AK

阿里云賬號和RAM用戶可以生成用于調用OpenAPI的AccessKey密鑰對,您可以使用該AccessKey初始化客戶端。

重要

由于主賬號AccessKey有資源完全的權限,一旦泄露風險巨大。建議您使用RAM用戶的AccessKey,并設置定期輪換,創建RAM用戶AccessKey的方法請參見創建AccessKey

package main

import (
    "os"

    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)

func main() {
    config := sdk.NewConfig()

    // 這里通過環境變量獲取RAM用戶的AccessKey ID和AccessKey Secret,以避免硬編碼帶來的安全風險
    credentialsProvider := credentials.NewStaticAKCredentialsProvider(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
    
    // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou
    sdk.NewClientWithOptions("<REGION_ID>", config, credentialsProvider)
    
    // 省略調用API步驟...
}

方式三:使用STS Token

通過安全令牌服務(Security Token Service,簡稱 STS),申請臨時安全憑證(Temporary Security Credentials,簡稱 TSC),創建臨時安全客戶端。

package main

import (
    "os"

    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)

func main() {
    config := sdk.NewConfig()

    // 這里通過環境變量獲取RAM用戶的AccessKey ID、AccessKey Secret和STS Token,以避免硬編碼帶來的安全風險
    credentialsProvider := credentials.NewStaticSTSCredentialsProvider(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
    
    // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou。
    client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credentialsProvider)
    
    // 省略調用API步驟...
}

方式四:使用AK及RamRoleArn

通過指定RAM角色的ARN(Alibabacloud Resource Name)來初始化客戶端。客戶端在發起請求前,需先通過調用STS服務獲取STS Token。若需限制STS Token的權限,可使用自定義權限策略.

package main

import (
    "os"

    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)

func main() {
    config := sdk.NewConfig()
    
    credentialsProvider := credentials.NewRamRoleArnWithPolicyAndExternalIdCredential(
        // os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"):從環境變量中獲取RAM用戶AccessKey ID
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
        // os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"):從環境變量中獲取RAM用戶AccessKey Secret
        os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
        // "<ROLE_ARN>":指定要扮演的RAM角色的ARN。示例值:acs:ram::123456789012****:role/adminrole。
        "<ROLE_ARN>",
        // "<ROLE_SESSION_NAME>":指定角色會話的名稱,用于標識和區分不同的會話。示例值:alice。
        "<ROLE_SESSION_NAME>",
        // "<POLICY>":指定一個自定義的授權策略用于限制角色會話的權限。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
        "<POLICY>",
        // "<EXTERNAL_ID>":指定一個角色外部ID,防止混淆代理人問題。示例值:abcd1234。
        "<EXTERNAL_ID>",
        // <ROLE_SESSION_EXPIRATION>:Token 有效期。示例值:3600。
        "<ROLE_SESSION_EXPIRATION>"
    )
    
    // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou
    client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credentialsProvider)
    
    // 省略調用API步驟...
}

方式五:使用ECS實例RAM角色

ECS和ECI實例均支持綁定實例RAM角色,當在實例中使用Credentials工具時,將自動獲取實例綁定的RAM角色,并通過訪問元數據服務獲取RAM角色的STS Token,以完成憑據客戶端的初始化。

實例元數據服務器支持加固模式和普通模式兩種訪問方式,Credentials工具默認使用加固模式(IMDSv2)獲取訪問憑據。若使用加固模式時發生異常,您可以通過環境變量ALIBABA_CLOUD_IMDSV1_DISABLED,執行不同的異常處理邏輯:

  1. 當值為false(默認值)時,會使用普通模式繼續獲取訪問憑據。

  2. 當值為true時,表示只能使用加固模式獲取訪問憑據,會拋出異常。

服務端是否支持IMDSv2,取決于您在服務器的配置。

說明
package main

import (
    "os"

    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)

func main() {
    
    // 通過ECS實例的RAM角色來獲取訪問憑證,從而創建一個阿里云客戶端
    // 它適用于那些需要在ECS實例上運行,并且需要訪問其他阿里云資源的程序
    // "<ROLE_NAME>":指定要使用的RAM角色名稱,您可以在環境變量ALIBABA_CLOUD_ECS_METADATA中設置 roleName 默認值。示例值:alice。
   credentialsProvider := credentials.NewECSRAMRoleCredentialsProvider("<ROLE_NAME>")
   
   // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou。
   client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credentialsProvider)

   // 省略調用API步驟...
}

方式六:使用OIDCRoleArn

容器服務 Kubernetes 版中,設置 Worker 節點 RAM 角色后,節點內的 Pod 可以通過元數據服務獲取關聯角色的 STS Token。然而,對于不可信的應用(如客戶提交的未公開代碼的應用),直接通過元數據服務獲取 STS Token 可能會帶來安全風險。為了解決這一問題并實現應用級別的權限最小化,可以使用 RRSA(RAM Roles for Service Account)功能。這有助于確保云上資源的安全性,同時允許不可信應用安全地獲取所需的 STS Token。阿里云容器集群會為不同的應用Pod創建和掛載相應的服務賬戶OIDC Token文件,并將相關配置信息注入到環境變量中,Credentials工具通過獲取環境變量的配置信息,調用STS服務的AssumeRoleWithOIDC - OIDC角色SSO時獲取扮演角色的臨時身份憑證接口換取綁定角色的STS Token。詳情請參見通過RRSA配置ServiceAccount的RAM權限實現Pod權限隔離。注入的環境變量如下:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;

package main

import (
	"os"

	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)

func main() {
    config := sdk.NewConfig()

    // 使用OIDCRoleArn初始化SDK客戶端
    oidcProvider, _ := credentials.NewOIDCCredentialsProviderBuilder().
	// OIDC提供商ARN,可以通過環境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設置OIDCProviderARN
	WithOIDCProviderARN(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
	// OIDC Token文件路徑,可以通過環境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設置OIDCTokenFilePath
	WithOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
	// RAM角色名稱ARN,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn
	WithRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
	// "<ROLE_SESSION_NAME>":自定義角色會話名稱。示例值:alice。
	WithRoleSessionName("<ROLE_SESSION_NAME>").
	// "<POLICY>":設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
	WithPolicy("<POLICY>").
	// <ROLE_SESSION_EXPIRATION>:設置session過期時間。示例值:3600。
	WithDurationSeconds( "<ROLE_SESSION_EXPIRATION>").
	Build()
        
        // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou。
	client, err := sdk.NewClientWithOptions("<REGION_ID>", config, oidcProvider)

        // 省略調用API步驟...
}

方式七:使用Bearer Token

目前只有云呼叫中心CCC這款產品支持Bearer Token的憑據初始化方式。

package main

import (
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)

func main() {
    config := sdk.NewConfig()

    // <BEARER_TOKEN>是一種認證方式,用于授權訪問API
    credentialsProvider := credentials.NewBearerTokenCredentialsProvider("BEARER_TOKEN")
    
    // <REGION_ID>:指定客戶端要訪問的阿里云區域。示例值:cn_hangzhou。
    client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credentialsProvider)

    // 省略調用API步驟...
}

默認憑據鏈

當開發環境與生產環境使用的憑據類型不一致時,常見做法是在代碼中獲取當前環境信息,編寫獲取不同憑據的分支代碼。借助Credentials工具的默認憑據鏈,您可以用同一套代碼,通過程序之外的配置來控制不同環境下的憑據獲取方式。當您使用credentials.NewDefaultCredentialsProvider()初始化憑據客戶端,且不傳入任何參數時,阿里云SDK將會嘗試按照如下順序查找相關憑據信息。

1. 使用環境變量

若不存在優先級更高的憑據信息,Credentials工具會優先在環境變量中獲取憑據信息。

  • 如果系統環境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key) ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value) 不為空,Credentials工具會優先使用它們作為默認憑據。

  • 如果系統環境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key)、ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value)、ALIBABA_CLOUD_SECURITY_TOKEN(Token)均不為空,Credentials工具會優先使用STS Token作為默認憑據。

2. 使用OIDC RAM角色

若不存在優先級更高的憑據信息,Credentials工具會在環境變量中獲取如下內容:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;

若以上三個環境變量都已設置內容,Credentials將會使用變量內容調用STS服務的AssumeRoleWithOIDC - OIDC角色SSO時獲取扮演角色的臨時身份憑證接口換取STS Token作為默認憑據。

3. 使用config.json配置文件

若不存在優先級更高的憑據信息,Credentials工具會優先在如下位置查找config.json文件是否存在:

Linux系統:~/.aliyun/config.json

Windows系統: C:\Users\USER_NAME\.aliyun\config.json

如果文件存在,程序將會使用配置文件中current 指定的憑據信息初始化憑據客戶端。當然,您也可以通過環境變量 ALIBABA_CLOUD_PROFILE 來指定憑據信息,例如設置 ALIBABA_CLOUD_PROFILE 的值為client1

config.json配置文件中每個mode的值代表了不同的憑據信息獲取方式:

  • AK:使用用戶的Access Key作為憑據信息;

  • RamRoleArn:使用RAM角色的ARN來獲取憑據信息;

  • EcsRamRole:利用ECS綁定的RAM角色來獲取憑據信息;

  • OIDC:通過OIDC ARN和OIDC Token來獲取憑據信息;

  • ChainableRamRoleArn:采用角色鏈的方式,通過指定JSON文件中的其他憑據,以重新獲取新的憑據信息。

配置示例信息如下:

{
	"current": "default",
	"profiles": [
		{
			"name": "default",
			"mode": "AK",
			"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
			"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
		},
		{
			"name":"client1",
			"mode":"RamRoleArn",
			"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
			"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		},
		{
			"name":"client2",
			"mode":"EcsRamRole",
			"ram_role_name":"<RAM_ROLE_ARN>"
		},
		{
			"name":"client3",
			"mode":"OIDC",
			"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
			"oidc_token_file":"<OIDC_TOKEN_FILE>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		},
		{
			"name":"client4",
			"mode":"ChainableRamRoleArn",
			"source_profile":"<PROFILE_NAME>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		}
	]
}

4. ECS實例RAM角色

若不存在優先級更高的憑據信息,Credentials工具將通過環境變量獲取ALIBABA_CLOUD_ECS_METADATA(ECS實例RAM角色名稱)的值。若該變量的值存在,程序將采用加固模式(IMDSv2)訪問ECS的元數據服務(Meta Data Server),以獲取ECS實例RAM角色的STS Token作為默認憑據信息。在使用加固模式時若發生異常,將使用普通模式兜底來獲取訪問憑據。您也可以通過設置環境變量ALIBABA_CLOUD_IMDSV1_DISABLED,執行不同的異常處理邏輯:

  1. 當值為false(默認值)時,會使用普通模式繼續獲取訪問憑據。

  2. 當值為true時,表示只能使用加固模式獲取訪問憑據,會拋出異常。

服務端是否支持IMDSv2,取決于您在服務器的配置。

5. 使用Credentials工具URI

若不存在優先級更高的憑據信息,Credentials工具會在環境變量中獲取ALIBABA_CLOUD_CREDENTIALS_URI,若存在,程序將請求該URI地址,獲取臨時安全憑證作為默認憑據信息。

相關文檔