訪問憑據一旦發生泄露,會給雲上資源和使用者業務帶來很大的安全隱患。本文為您介紹如何在不同的情境中安全使用訪問憑據訪問阿里雲OpenAPI。
什麼是訪問憑據
訪問憑據是指使用者證明其身份的一組資訊。使用者通過開發工具(API、CLI、SDK、Terraform等)訪問阿里雲時,需要提供正確的訪問憑據才能驗證身份。常見的訪問憑據類型:
AccessKey:存取金鑰AccessKey(簡稱AK)是阿里雲提供給阿里雲帳號(主帳號)和RAM使用者(子帳號)的永久訪問憑據,一組由AccessKey ID和AccessKey Secret組成的金鑰組。更多資訊,請參見建立AccessKey。
STS Token:安全性權杖(STS Token)是阿里雲提供給RAM角色的臨時訪問憑據,可以自訂時效和存取權限。更多資訊,請參見什麼是STS。
常見的訪問憑據泄露案例
開發人員直接將AK寫入程式碼在業務代碼中,有代碼倉庫閱讀許可權的開發人員均能擷取到AK資訊。開發人員直接將業務代碼上傳到開源社區或代碼託管服務,導致AK的進一步泄露。
使用者為了能夠讓自己的用戶端直接調用到OpenAPI,將AK寫到用戶端代碼中。攻擊者通過反編譯用戶端代碼,擷取到AK資訊。
開發人員的技術文檔或者分享材料中包含AK資訊。
產品說明文檔中包含的範例代碼含有AK資訊。
使用者無許可權控制的介面中返回了訪問憑據資訊。
訪問憑據的安全使用方式情節
訪問憑據的安全使用方式情節的主要思路:降低訪問憑據的暴露時間和暴露範圍。常見情境的訪問憑據安全使用方式情節如下表所示。
方案名稱 | 適用情境 |
容器執行個體角色扮演 | 如果您的應用程式部署在阿里雲ACK容器叢集上,則可以基於RRSA(RAM Roles for Service Accounts)功能,在容器叢集內實現應用隔離的RAM角色功能,各個應用可以扮演獨立的RAM角色,訪問阿里雲OpenAPI。 |
ECS執行個體角色扮演 | 如果您的應用程式部署在阿里雲ECS執行個體上,則可以通過ECS執行個體RAM(Resource Access Management)角色讓ECS執行個體扮演具有某些許可權的角色,訪問阿里雲OpenAPI。 |
員工使用STS Token進行開發調試 | 針對研發、營運、產品等職能員工,需要使用AccessKey進行營運、管理、調試等操作,建議通過角色SSO的方式,扮演其對應職能的RAM角色,擷取STS Token。 |
Function Compute使用STS Token | 如果您在Function Compute(FC)上部署的應用程式需要訪問其他雲資源,則可以通過Function ComputeRAM角色將FC函數和RAM角色關聯,使用STS Token(Security Token Service)訪問雲資源,解決永久憑據可能導致的安全風險問題。 |
配置系統內容變數 | 對於不適用以上方案的情境,建議您使用配置系統內容變數的方式,訪問阿里雲OpenAPI。 |
容器執行個體角色扮演
前提條件
適用於支援RAM的雲端服務。
RRSA功能目前僅支援1.22及以上版本的叢集,即ACK叢集基礎版、ACK叢集Pro版、ACK Serverless叢集基礎版和ACK Serverless叢集Pro版。
使用V2.0版本的阿里雲SDK。
自建網關類產品的自研SDK無法使用。
原理介紹
基於RRSA功能,您可以在叢集內實現Pod層級隔離的應用關聯RAM角色功能。各個應用可以扮演獨立的RAM角色並使用擷取的臨時憑證訪問雲資源,從而實現應用RAM許可權最小化以及無AccessKey訪問阿里雲OpenAPI避免AccessKey泄露的需求。
從使用者側視角來看,RRSA功能的工作流程如下。
使用者提交使用了服務賬戶令牌卷投影功能的應用Pod。
叢集將為該應用Pod建立和掛載相應的服務賬戶OIDC Token檔案。
Pod內程式使用掛載的OIDC Token檔案訪問STS服務的AssumeRoleWithOIDC介面,擷取扮演指定RAM角色的臨時憑證。
說明請提前修改RAM角色配置,允許Pod使用的服務賬戶扮演該RAM角色。更多資訊,請參見AssumeRoleWithOIDC。
從檔案中讀取的OIDC Token是一個臨時Token,建議應用程式每次在使用時都從檔案中讀取最新的Token,叢集會在Token到期前更新替換檔案內已有的Token。
Pod內程式使用擷取到的臨時憑證訪問雲資源OpenAPI。
配置方法
程式碼範例
目前,阿里雲V2.0 SDK已經內建了支援使用RRSA OIDC Token進行OpenAPI認證的功能,所有基於V2.0 SDK產生並且支援STS Token認證的雲產品SDK都將預設支援RRSA OIDC Token認證。支援此功能的SDK版本資訊和參考代碼如下。
程式設計語言 | 支援認證的SDK版本 | 使用樣本 |
Go | Alibaba Cloud Credentials for Go 1.2.6及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn。 | |
Java | Alibaba Cloud Credentials for Java 0.2.10及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn。 | |
Python 3 | Alibaba Cloud Credentials for Python 0.3.1及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn。 | |
Node.js和TypeScript | Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn。 |
ECS執行個體角色扮演
前提條件
適用於支援阿里雲RAM的雲端服務。
使用V2.0版本的阿里雲SDK。
自建網關類產品的自研SDK無法使用。
原理介紹
執行個體RAM角色允許您將一個角色關聯到ECS執行個體,在ECS執行個體內部基於STS(Security Token Service)臨時憑證訪問其他雲產品的API,臨時憑證將周期性更新。既可以保證雲帳號AccessKey的安全性,也可以藉助存取控制RAM實現精細化控制和許可權管理。
工作流程如下:
應用程式訪問ECS執行個體中繼資料擷取STS臨時憑證。詳細資料,請參見ECS執行個體中繼資料概述。
使用STS臨時憑證訪問雲資源。詳細資料,請參見什麼是STS。
配置方法
為ECS執行個體授予RAM角色。詳細資料,請參見通過ECS執行個體RAM角色授權ECS訪問其他雲端服務。
範例程式碼
Alibaba Cloud Credentials是阿里雲為阿里雲開發人員使用者提供身份憑證管理工具,使用Credentials工具可以為您提供更加便捷的方式使用ECS執行個體角色扮演功能,以調用Elastic Compute Service的DescribeRegions介面為例,參考代碼如下。
程式設計語言 | 使用樣本 |
Go | |
Java | |
Python | |
PHP | |
Node.js | |
.NET |
員工使用STS Token進行開發調試
情境描述
針對研發、營運、產品等職能員工,需要使用AccessKey進行營運、管理、調試等操作,建議通過角色SSO的方式,扮演其對應職能的RAM角色,擷取STS Token。
配置方法
針對單帳號情境,建議在雲帳號內配置基於SAML的角色SSO,並按職能為員工分配RAM角色。員工可以在命令列中使用saml2alibabacloud工具,完成IdP側的認證後,即可擷取到STS Token。
針對多帳號情境,建議使用雲SSO進行多帳號的單點登入配置。配置完成後,員工即可使用CLI登入雲SSO並訪問阿里雲資源。
Function Compute使用STS Token
情境描述
客戶在FC函數上部署的應用程式需要訪問其他雲資源,傳統的方式是客戶將RAM使用者的AK(Access Key)固化在函數中,如果將AK寫在設定檔中,容易造成AK泄露,維護困難等問題。FC函數RAM角色通過將FC函數和RAM角色關聯,使用STS Token(Security Token Service)訪問雲資源,解決永久憑證可能導致的安全風險問題。
方案架構
本方案通過FC函數角色實現臨時憑證的擷取和使用。該架構和流程通過動態管理和臨時授予存取權限,避免了長期暴露AK的風險,提高了系統的安全性和靈活性。管理員僅需一次性配置角色和許可權,後續函數在運行時即可動態擷取和使用臨時憑證,簡化了營運管理工作。
管理員建立一個受信給Function Compute的Role(角色),並對該角色授予相應的許可權。角色許可權包含訪問需要的雲資源的許可權(圖中1)。管理員將建立好的角色配置到對應的FC函數上,使函數與角色關聯(圖中2)。客戶應用程式從函數上下文中擷取臨時安全憑證(STS Token)(圖中3),該過程中Function Compute會使用雲端服務的身份調用AssumeRole介面,從RAM/STS服務擷取STS Token(圖中i)。 客戶應用程式使用擷取到的STS Token來調用目標雲資源服務的API(圖中4)。資源服務API處理請求並返回訪問結果,用戶端應用程式接收到返回的結果後完成相應的商務邏輯。
配置方法
具體操作,請參見授予Function Compute訪問其他雲端服務的許可權。
配置系統內容變數
配置方法
配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
。
Linux和macOS系統配置方法
執行以下命令:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
<access_key_id>
需替換為已準備好的AccessKey ID,<access_key_secret>
替換為AccessKey Secret。Windows系統配置方法
建立環境變數檔案,添加環境變數
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,並寫入已準備好的AccessKey ID和AccessKey Secret。重啟Windows系統。
阿里雲SDK程式碼範例
阿里雲SDK支援通過定義ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數來建立預設的訪問憑證。調用介面時,程式直接存取憑證,讀取您的存取金鑰(即AccessKey)並自動完成鑒權。以調用Elastic Compute Service的DescribeRegions介面為例,參考代碼如下。
程式設計語言 | 使用樣本 |
Go | |
Java | |
Python | |
PHP | |
Node.js | |
.NET |
通用程式碼範例
對於自建網關類產品的自研SDK等無法使用阿里雲SDK的情境,以Java語言為例,可以採用下面的方式載入環境變數。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class DemoTest {
public static void main(String[] args) throws Exception{
Config config = new Config();
// Which type of credential you want
config.setType("access_key");
// AccessKeyId of your ram user
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// AccessKeySecret of your ram user
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Client client = new Client(config);
}
}
訪問憑據泄露處理方案
AccessKey泄露:具體操作,請參見AccessKey泄露處理方案。
STS Token泄露:具體操作,請參見STS Token發生泄露時如何處理?。
相關文檔
更多雲上安全實踐,請參閱以下文檔: