全部產品
Search
文件中心

Alibaba Cloud SDK:管理訪問憑據

更新時間:Oct 16, 2024

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

使用AccessKey

重要
  • 阿里雲帳號的AccessKey泄露會威脅該帳號下所有資源的安全。為保證帳號安全,強烈建議您使用RAM使用者的AccessKey。具體操作,請參見建立AccessKey

  • 請確保代碼運行環境已設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請參見在Linux、macOS和Windows系統配置環境變數

  • 通過IClientProfile配置AccessKey初始化用戶端。

    using Aliyun.Acs.Core;
    using Aliyun.Acs.Core.Profile;
    
    namespace AlibabaCloud.SDK.Sample
    {
        public class Sample
        {
            public static void Main(string[] args)
            {
                IClientProfile profile = DefaultProfile.GetProfile(
                    // 地區ID
                    "<REGION_ID>",
                    // 從環境變數擷取RAM使用者的AccessKey ID
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    // 從環境變數擷取RAM使用者的AccessKey SECRET
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                DefaultAcsClient client = new DefaultAcsClient(profile);
                // 省略調用API步驟...
            }
        }
    }
    
  • 通過AlibabaCloudCredentialsProvider配置AccessKey初始化用戶端。

    using Aliyun.Acs.Core;
    using Aliyun.Acs.Core.Profile;
    using Aliyun.Acs.Core.Auth;
    
    namespace AlibabaCloud.SDK.Sample
    {
        public class Sample
        {
            public static void Main(string[] args)
            {
                AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider(
                    // 從環境變數擷取RAM使用者的AccessKey ID
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    // 從環境變數擷取RAM使用者的AccessKey SECRET
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
                DefaultAcsClient client = new DefaultAcsClient(profile, provider);
                // 省略調用API步驟...
            }
        }
    }
    

使用STS Token

使用臨時訪問憑據(STS Token)初始化憑據用戶端。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            AlibabaCloudCredentialsProvider provider = new StsCredentialProvider(
                // 從環境變數擷取RAM使用者的AccessKey ID
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 從環境變數擷取RAM使用者的AccessKey SECRET
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                // 從環境變數擷取RAM使用者的SECURITY TOKEN
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_SECURITY_TOKEN"));
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略調用API步驟...
        }
    }
}

使用RamRoleArn

以一個RAM使用者的身份調用STS服務的AssumeRole介面擷取STS Token。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider(
                // 從環境變數擷取RAM使用者的AccessKey ID
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 從環境變數擷取RAM使用者的AccessKey SECRET
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // 使用RAM Role Arn
            STSAssumeRoleSessionCredentialsProvider stsProvider = new STSAssumeRoleSessionCredentialsProvider(
                provider,
                "<ROLE_ARN>",
                profile
                );

            DefaultAcsClient client = new DefaultAcsClient(profile, stsProvider);
            // 省略調用API步驟...
        }
    }
}

使用ECSRamRole

為了在提高應用部署安全性的同時增強便利性,阿里雲SDK支援通過ECS執行個體RAM角色Token服務來擷取ECS RAM角色的授權資訊,以訪問阿里雲資源和服務。使用這種方式,您在ECS上部署的應用程式無需在SDK中配置授權資訊即可訪問阿里雲API(即無需配置AccessKey)。通過這種方式授權的SDK,將具備該ECS RAM角色的許可權。

重要

確保ECS執行個體已經配置了RAM角色。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Core.Auth;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            // 使用ECS RAM Role方式
            InstanceProfileCredentialsProvider provider = new InstanceProfileCredentialsProvider(
                "<ROLE_NAME>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略調用API步驟...
        }
    }
}

使用OIDCRoleArn

在Container ServiceKubernetes版中配置了Worker節點RAM角色後,您可以基於RRSA功能在叢集內實現Pod層級的應用關聯RAM角色功能。各個應用可以獨立扮演不同的RAM角色,並利用擷取的臨時憑證訪問雲資源,從而實現應用RAM許可權的最小化,並滿足無AccessKey訪問阿里雲OpenAPI的需求,以避免AccessKey泄露。

阿里雲容器叢集會為不同的應用Pod建立和掛載相應的服務賬戶OIDC Token檔案,並將相關配置資訊注入到環境變數中,SDK底層通過擷取環境變數的配置資訊,調用STS服務的AssumeRoleWithOIDC - OIDC角色SSO時擷取扮演角色的臨時身份憑證介面換取綁定角色的STS Token。詳情請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            AlibabaCloudCredentialsProvider provider = new OIDCCredentialsProvider(
                // RAM角色名稱ARN
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ROLE_ARN"), 
                // OIDC供應商ARN
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"), 
                // OIDC Token檔案路徑
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_OIDC_TOKEN_FILE"),
                // 自訂臨時會話名稱
                "<ROLE_SESSION_NAME>",
                // 指定調用STS服務的region id
                "<REGION_ID>");
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略調用API步驟...
        }
    }
}

使用Bearertoken

說明

只有CCC這個產品支援此方式。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            AlibabaCloudCredentialsProvider provider = new BearerTokenCredentialProvider("<BEARER_TOKEN>");
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略調用API步驟...
        }
    }
}

使用預設憑證提供鏈

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth.Provider;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            var alibabaCloudClientCredential = new DefaultCredentialProvider();
            var client = new DefaultAcsClient(profile,alibabaCloudClientCredential);
            // 省略調用API步驟...
        }
    }
}

預設憑證提供者鏈尋找可用的憑證,尋找順序如下:

1. 環境憑證

在環境變數裡尋找環境憑證,如果定義了 ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET 環境變數且不為空白,程式將使用它們建立預設憑證。

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介面換取STS Token作為預設憑據。

3. 設定檔

如果使用者主目錄存在預設檔案~/.alibabacloud/credentials.ini (Windows 為 C:\Users\USER_NAME\.alibabacloud\credentials.ini),程式會自動建立指定名稱和類型的憑證。可以通過定義ALIBABA_CLOUD_CREDENTIALS_FILE環境變數修改預設檔案的路徑。可以通過環境變數ALIBABA_CLOUD_PROFILE指定憑據名稱來選擇憑據,若不設定則使用預設配置 default對應的憑據。

[default]                            # 預設配置
type = access_key                    # 認證方式為 access_key
access_key_id = foo                  # Key
access_key_secret = bar              # Secret

[client1]                            # 命名為 `client1` 的配置
type = ecs_ram_role                  # 認證方式為 ecs_ram_role
role_name = EcsRamRoleTest           # Role Name

[client2]                            # 命名為 `client2` 的配置
type = ram_role_arn                  # 認證方式為 ram_role_arn
access_key_id = foo
access_key_secret = bar
role_arn = role_arn                  # Role Arn
role_session_name = role_session_name # 自訂會話名稱

4. 執行個體 RAM 角色

若不存在優先順序更高的憑據資訊,Credentials工具會在環境變數中擷取ALIBABA_CLOUD_ECS_METADATA(ECS執行個體RAM角色名稱),若存在,程式將會通過ECS的中繼資料服務(Meta Data Server)擷取ECS執行個體RAM角色的STS Token作為預設憑據資訊。