當您通過阿里雲SDK調用OpenAPI進行資源操作時,必須正確配置憑證資訊。阿里雲的Credentials工具提供了一套強大的功能,使您能夠輕鬆地擷取和管理這些訪問憑證。無論是利用預設憑證,AccessKey(AK),還是Security Token Service(STS)令牌等,Credentials工具都能為您提供相應支援。此外,本文檔將詳細闡述如何根據優先順序使用預設憑證。您將深入理解如何在阿里雲SDK中配置和維護憑證,從而確保您對雲資源的操作既有效率又具有高度安全性。
背景資訊
憑據是指使用者證明其身份的一組資訊。使用者在系統中進行登入時,需要提供正確的憑據才能驗證身份。常見的憑據類型有:
阿里雲主帳號和RAM使用者的永久憑據 AccessKey(簡稱AK)是由AccessKey ID和AccessKey Secret組成的金鑰組。
阿里雲RAM角色的STS臨時訪問Token,簡稱STS Token。它是可以自訂時效和存取權限的臨時身份憑據,詳情請參見什麼是STS。
Bearer Token。它是一種身分識別驗證和授權的令牌類型。
前提條件
使用Credentials工具要求Python版本 >= 3.7。
使用V2.0代系的阿里雲SDK。
安裝Credentials工具
使用pip
安裝(推薦),如未安裝pip
,請先安裝pip。更多資訊,請參見pip
官網pip user guide。
pip install alibabacloud_credentials
使用最新發行Credentials依賴包,確保所有憑證支援。
請查看ChangeLog.txt擷取所有發行的版本列表。
初始化憑據用戶端
Credentials工具支援多種方式初始化憑據用戶端,您可根據實際情況選擇合適的方式進行憑據用戶端初始化。
在專案中使用明文AccessKey,容易因代碼倉庫許可權管理不當造成AccessKey泄露,會威脅該帳號下所有資源的安全。建議通過環境變數、設定檔等方式擷取AccessKey。
方式一:使用預設憑據鏈
當您在初始化憑據用戶端不傳入任何參數時,Credentials工具會使用預設憑據鏈方式初始化用戶端。預設憑據的讀取邏輯請參見預設憑據鏈。
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_tea_rpc.models import Config
# 不指定參數
credentialsClient = CredClient()
config = Config(credential=credentialsClient)
介面調用方法
方式二:使用AK
阿里雲帳號、RAM使用者可產生調用OpenAPI的金鑰組AK。如何擷取AK請參見文檔建立AccessKey。您可使用AK初始化憑據用戶端。
阿里雲主帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。
推薦使用最小化授權的RAM使用者的AK。
import os
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='access_key',
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
)
cred = Client(config)
介面調用方法
方式三:使用STS Token
以一個RAM使用者的身份調用STS服務的AssumeRole介面,設定Token的最大到期時間,即可換取到臨時憑據STS Token。以下樣本示範如何使用STS Token初始化憑據用戶端(不包含如何擷取到STS Token的過程)。
import os
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='sts',
# 從環境變數中擷取AccessKey ID的值
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
# 從環境變數中擷取AccessKeySecret的值
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
# 從環境變數中擷取臨時SecurityToken的值
security_token=os.environ.get('ALIBABA_CLOUD_SECURITY_TOKEN')
)
credClient = Client(config)
介面調用方法
方式四:使用AK及RamRoleArn
該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具可以協助開發人員前往STS換取STS Token。您也可以通過為policy
賦值來限制RAM角色到一個更小的許可權集合。
import os
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig
credentialsConfig = CredConfig(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
type='ram_role_arn',
# 要扮演的RAM角色ARN,樣本值:acs:ram::123456789012****:role/adminrole,可以通過環境變數ALIBABA_CLOUD_ROLE_ARN設定role_arn
role_arn='<role_arn>',
# 角色會話名稱,可以通過環境變數ALIBABA_CLOUD_ROLE_SESSION_NAME設定role_session_name
role_session_name='<role_session_name>',
# 設定更小的權限原則,非必填。樣本值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy='<policy>',
role_session_expiration=3600
)
credentialsClient = CredClient(credentialsConfig)
介面調用方法
方式五:使用ECS執行個體RAM角色
該方式底層實現是STS Token。Credentials工具會自動擷取ECS執行個體綁定的RAM角色,調用ECS的中繼資料服務(Meta Data Server)換取STS Token,完成憑據用戶端初始化。ECI執行個體,Container Service Kubernetes 版的Worker節點均支援綁定執行個體RAM角色。
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig
credentialsConfig = CredConfig(
type='ecs_ram_role',
# 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定role_name
role_name='<role_name>'
)
credentialsClient = CredClient(credentialsConfig)
介面調用方法
方式六:使用OIDCRoleArn
在Container Service for Kubernetes中設定了Worker節點RAM角色後,對應節點內的Pod中的應用也就可以像ECS上部署的應用一樣,通過中繼資料服務(Meta Data Server)擷取關聯角色的STS Token。但如果容器叢集上部署的是不可信的應用(比如部署您的客戶提交的應用,代碼也沒有對您開放),您可能並不希望它們能通過中繼資料服務擷取Worker節點關聯執行個體RAM角色的STS Token。為了避免影響雲上資源的安全,同時又能讓這些不可信的應用安全地擷取所需的 STS Token,實現應用層級的許可權最小化,您可以使用RRSA(RAM Roles for Service Account)功能。阿里雲容器叢集會為不同的應用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檔案路徑;
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='oidc_role_arn',
# RAM角色名稱ARN,可以通過環境變數ALIBABA_CLOUD_ROLE_ARN設定role_arn
role_arn='<role_arn>',
# OIDC供應商ARN,可以通過環境變數ALIBABA_CLOUD_OIDC_PROVIDER_ARN設定oidc_provider_arn
oidc_provider_arn='<oidc_provider_arn>',
# OIDC Token檔案路徑,可以通過環境變數ALIBABA_CLOUD_OIDC_TOKEN_FILE設定oidc_token_file_path
oidc_token_file_path='<oidc_token_file_path>',
# 角色會話名稱,可以通過環境變數ALIBABA_CLOUD_ROLE_SESSION_NAME設定role_session_name
role_session_name='<role_session_name>',
# 設定更小的權限原則,非必填。樣本值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy='<policy>',
# 設定session到期時間
role_session_expiration=3600
)
cred = Client(config)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
介面調用方法
方式七:使用URI憑據
該方案底層實現是STS Token。Credentials工具通過您提供的URI擷取STS Token,完成憑據用戶端初始化。
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='credentials_uri',
# 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變數ALIBABA_CLOUD_CREDENTIALS_URI設定credentials_uri
credentials_uri='<credentials_uri>',
)
cred = Client(config)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
介面調用方法
方式八:使用Bearer Token
目前只有Cloud Call CenterCCC這款產品支援Bearer Token的憑據初始化方式。
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='bearer',
# 填入您的Bearer Token
bearer_token='<BearerToken>',
)
cred = Client(config)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
介面調用方法
預設憑據鏈
當您的程式開發環境和生產環境採用不同的憑據類型,常見做法是在代碼中擷取當前環境資訊,編寫擷取不同憑據的分支代碼。藉助Credentials工具的預設憑據鏈,您可以用同一套代碼,通過程式之外的配置來控制不同環境下的憑據擷取方式。當您在不傳入參數的情況下,直接使用cred = CredClient()
初始化憑據用戶端時,阿里雲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. 使用設定檔
若不存在優先順序更高的憑據資訊,Credentials工具會優先在如下位置尋找檔案是否存在。
Linux系統:~/.alibabacloud/credentials.ini
Windows系統: C:\Users\USER_NAME\.alibabacloud\credentials.ini
您也可通過環境變數 ALIBABA_CLOUD_CREDENTIALS_FILE 指定設定檔路徑。如果檔案存在,程式將會使用設定檔中default 指定的憑據資訊初始化憑據用戶端。當然,您也可以通過環境變數 ALIBABA_CLOUD_PROFILE 來指定憑據資訊,例如設定 ALIBABA_CLOUD_PROFILE 的值為client1。
配置樣本資訊如下:
[default]
enable=true
type=access_key
access_key_id=<ALIBABA_CLOUD_ACCESS_KEY_ID>
access_key_secret=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
[client1]
enable=true
type=ecs_ram_role
role_name=<ecs_ram_role_name>
[client2]
enable=true
type=ram_role_arn
policy=<policy>
access_key_id=<ALIBABA_CLOUD_ACCESS_KEY_ID>
access_key_secret=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
role_arn=<ram_role_arn>
role_session_name=<role_session_name>
[client3]
enable=true
type=oidc_role_arn
policy=<policy>
oidc_provider_arn=<ALIBABA_CLOUD_ACCESS_KEY_ID>
oidc_token_file_path=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
role_arn=<ram_role_arn>
role_session_name=<role_session_name>
4. 使用ECS執行個體RAM角色
若不存在優先順序更高的憑據資訊,Credentials工具會在環境變數中擷取ALIBABA_CLOUD_ECS_METADATA(ECS執行個體RAM角色名稱),若存在,程式將會通過ECS的中繼資料服務(Meta Data Server)擷取ECS執行個體RAM角色的STS Token作為預設憑據資訊。
V2.0 SDK預設啟用加固模式(IMDSv2),以提高安全性。在初始化用戶端時,您可以通過設定參數
DisableIMDSV1
來切換至普通模式(IMDSv1)。普通模式可能存在潛在的SSRF攻擊風險,因此強烈建議使用加固模式(IMDSv2)。若未進行相關設定,則系統將預設採用加固模式,以增強身分識別驗證過程。
5. 使用Credentials工具URI
若不存在優先順序更高的憑據資訊,Credentials工具會在環境變數中擷取ALIBABA_CLOUD_CREDENTIALS_URI,若存在,程式將請求該URI地址,擷取臨時安全憑證作為預設憑據資訊。
保護憑據資訊最佳實務
在雲上業務中,憑據資訊的泄露可能導致系統遭受攻擊。因此,保護憑據資訊的安全至關重要。以下是幾種有效做法,可以避免在代碼中暴露明文憑據資訊,從而降低憑據泄露的風險。更多資訊,請參見使用訪問憑據訪問阿里雲OpenAPI最佳實務。
1. 使用臨時安全憑證(STS token)
臨時安全憑證(STS Token):STS token提供了一種具有短期有效性的身份憑證,推薦在處理敏感操作時使用STS Token,而不是長期有效Access Key。
ECS 執行個體 RAM 角色:如果您的應用部署在ECS(Elastic Compute Service)執行個體上,可以將RAM角色綁定到該執行個體。通過ECS執行個體的中繼資料服務動態擷取臨時安全憑證(STS Token),從而避免在代碼中寫入程式碼明文Access Key。更多資訊,請參見通過ECS執行個體RAM角色授權ECS訪問其他雲端服務。
開啟 RRSA 功能:在阿里雲Container ServiceKubernetes版(ACK)中,啟用RRSA(RAM Roles for Service Account)功能。此功能實現Pod層級的許可權隔離,能夠自動向環境變數注入OIDC相關資訊。藉助Credentials工具,您可以擷取臨時訪問憑據STS Token,以實現更精細的許可權控制。更多資訊,請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離。
2. 使用預設憑據鏈
當您在初始化憑據用戶端不傳入任何參數時,Credentials工具會使用預設憑據鏈方式初始化用戶端。
3. 使用Key Management Service(KMS)託管憑據
Key Management Service(Key Management Service)允許使用者安全地儲存和管理資料庫帳號口令、伺服器帳號口令、SSH Key、存取金鑰等敏感資訊,通過整合阿里雲SDK等方式,業務應用可動態擷取這些憑據資訊,從而避免明文儲存帶來的資訊泄露或非法操作風險。使用KMS託管RAM憑據時,應用程式僅需配置憑據名稱而非真實AccessKey,進一步提升安全性。此外,KMS支援自動輪轉RAM憑據,有效降低AccessKey泄露風險並確保持續安全。更多資訊,請參見管理及使用RAM憑據。
4. 風險監測與處理
關注云資訊安全中心發出的安全警示,Security Center會對已經明確發生的AK泄露,異常API調用,異常登入等風險發出警示,建議您及時查看並處理外泄的AK事件。更多資訊,請參見AK泄露檢測。
利用Action Trail追蹤,Action Trail能夠詳細記錄使用者在阿里雲上的所有操作,包括誰在何時進行了什麼操作,操作的來源IP及操作結果等資訊。利用這些記錄,您可以及時發現異常行為,並採取相應措施。更多資訊,請參見通過Action Trail查看RAM的操作事件。
如發生憑據泄露,更多資訊,請參見AccessKey泄露處理方案。通過實施以上最佳實務,您可以有效減少憑據泄露風險,從而確保雲上資源的安全性。
切勿寫入程式碼Access Key(AK):在業務代碼中寫入程式碼憑據的做法極易導致泄露,比如被同事、外部攻擊者或在公用代碼倉庫中獵取。
避免使用阿里雲主帳號AK:主帳號擁有所有資源的存取權限,一旦泄露風險巨大,強烈建議避免使用。強烈建議使用具有最小許可權的RAM使用者AK。
如何切換憑據
當您想要在程式中使用不同的訪問憑據調用不同OpenAPI時,可以通過如下方式。
使用多個憑據用戶端
通過初始化多個憑據用戶端,傳入到不同的介面請求用戶端。
import os
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config1 = Config(
type='access_key',
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
)
cred1 = Client(config1)
config2 = Config(
type='sts',
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
security_token=os.environ.get('ALIBABA_CLOUD_SECURITY_TOKEN')
)
cred2 = Client(config2)
使用AuthUtils
當我們初始化憑據用戶端採用設定檔記錄憑據資訊時,可以使用auth_util.client_type
切換到不同的憑據配置上。範例程式碼如下。
from alibabacloud_credentials.utils import auth_util
from alibabacloud_credentials.client import Client
# 若不配置AuthUtils類clientType屬性,則預設使用default。
credentialClient = Client()
# 切換到client1憑據上
auth_util.client_type = "client1"
credentialClient1 = Client()
# 切換到client2憑據上
auth_util.client_type = "client2"
credentialClient2 = Client()