訪問憑據一旦發生泄露,會給云上資源和用戶業務帶來很大的安全隱患。本文為您介紹如何在不同的場景中安全使用訪問憑據訪問阿里云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實例RAM(Resource Access Management)角色讓ECS實例扮演具有某些權限的角色,訪問阿里云OpenAPI。 | |
針對研發、運維、產品等職能員工,需要使用AccessKey進行運維、管理、調試等操作,建議通過角色SSO的方式,扮演其對應職能的RAM角色,獲取STS Token。 | |
如果您在函數計算(FC)上部署的應用程序需要訪問其他云資源,則可以通過函數計算RAM角色將FC函數和RAM角色關聯,使用STS Token(Security Token Service)訪問云資源,解決永久憑據可能導致的安全風險問題。 | |
對于不適用以上方案的場景,建議您使用配置系統環境變量的方式,訪問阿里云OpenAPI。 |
容器實例角色扮演
前提條件
適用于支持RAM的云服務。
RRSA功能目前僅支持1.22及以上版本的集群,即ACK集群基礎版、ACK集群Pro版、ACK Serverless集群基礎版、ACK Serverless集群Pro版和ACK Edge集群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角色。詳細信息,請參見實例RAM角色。
示例代碼
Alibaba Cloud Credentials是阿里云為阿里云開發者用戶提供身份憑證管理工具,使用Credentials工具可以為您提供更加便捷的方式使用ECS實例角色扮演功能,以調用云服務器ECS的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并訪問阿里云資源。
函數計算使用STS Token
場景描述
客戶在FC函數上部署的應用程序需要訪問其他云資源,傳統的方式是客戶將RAM用戶的AK(Access Key)固化在函數中,如果將AK寫在配置文件中,容易造成AK泄露,維護困難等問題。FC函數RAM角色通過將FC函數和RAM角色關聯,使用STS Token(Security Token Service)訪問云資源,解決永久憑證可能導致的安全風險問題。
方案架構
本方案通過FC函數角色實現臨時憑證的獲取和使用。該架構和流程通過動態管理和臨時授予訪問權限,避免了長期暴露AK的風險,提高了系統的安全性和靈活性。管理員僅需一次性配置角色和權限,后續函數在運行時即可動態獲取和使用臨時憑證,簡化了運維管理工作。
管理員創建一個受信給函數計算的Role(角色),并對該角色授予相應的權限。角色權限包含訪問需要的云資源的權限(圖中1)。管理員將創建好的角色配置到對應的FC函數上,使函數與角色關聯(圖中2)。客戶應用程序從函數上下文中獲取臨時安全憑證(STS Token)(圖中3),該過程中函數計算會使用云服務的身份調用AssumeRole接口,從RAM/STS服務獲取STS Token(圖中i)。 客戶應用程序使用獲取到的STS Token來調用目標云資源服務的API(圖中4)。資源服務API處理請求并返回訪問結果,客戶端應用程序接收到返回的結果后完成相應的業務邏輯。
配置方法
具體操作,請參見通過FC函數角色實現臨時憑證的獲取和使用。
配置系統環境變量
配置方法
配置環境變量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)并自動完成鑒權。以調用云服務器ECS的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發生泄露時如何處理?。
相關文檔
更多云上安全實踐,請參閱以下文檔: