全部產品
Search
文件中心

Resource Access Management:使用訪問憑據訪問阿里雲OpenAPI最佳實務

更新時間:Aug 16, 2024

訪問憑據一旦發生泄露,會給雲上資源和使用者業務帶來很大的安全隱患。本文為您介紹如何在不同的情境中安全使用訪問憑據訪問阿里雲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泄露的需求。

3

從使用者側視角來看,RRSA功能的工作流程如下。

  1. 使用者提交使用了服務賬戶令牌卷投影功能的應用Pod。

  2. 叢集將為該應用Pod建立和掛載相應的服務賬戶OIDC Token檔案。

  3. Pod內程式使用掛載的OIDC Token檔案訪問STS服務的AssumeRoleWithOIDC介面,擷取扮演指定RAM角色的臨時憑證。

    說明
    • 請提前修改RAM角色配置,允許Pod使用的服務賬戶扮演該RAM角色。更多資訊,請參見AssumeRoleWithOIDC

    • 從檔案中讀取的OIDC Token是一個臨時Token,建議應用程式每次在使用時都從檔案中讀取最新的Token,叢集會在Token到期前更新替換檔案內已有的Token。

  4. 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

Go SDK使用樣本

Java

Alibaba Cloud Credentials for Java 0.2.10及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn

Java SDK使用樣本

Python 3

Alibaba Cloud Credentials for Python 0.3.1及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn

Python 3 SDK使用樣本

Node.js和TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6及以上版本。更多資訊,請參考方式六:使用OIDCRoleArn

Node.js和TypeScript使用樣本

ECS執行個體角色扮演

前提條件

  • 適用於支援阿里雲RAM的雲端服務

  • 使用V2.0版本的阿里雲SDK。

  • 自建網關類產品的自研SDK無法使用。

原理介紹

執行個體RAM角色允許您將一個角色關聯到ECS執行個體,在ECS執行個體內部基於STS(Security Token Service)臨時憑證訪問其他雲產品的API,臨時憑證將周期性更新。既可以保證雲帳號AccessKey的安全性,也可以藉助存取控制RAM實現精細化控制和許可權管理。

1

工作流程如下:

  1. 應用程式訪問ECS執行個體中繼資料擷取STS臨時憑證。詳細資料,請參見ECS執行個體中繼資料概述

  2. 使用STS臨時憑證訪問雲資源。詳細資料,請參見什麼是STS

配置方法

為ECS執行個體授予RAM角色。詳細資料,請參見通過ECS執行個體RAM角色授權ECS訪問其他雲端服務

範例程式碼

Alibaba Cloud Credentials是阿里雲為阿里雲開發人員使用者提供身份憑證管理工具,使用Credentials工具可以為您提供更加便捷的方式使用ECS執行個體角色扮演功能,以調用Elastic Compute Service的DescribeRegions介面為例,參考代碼如下。

程式設計語言

使用樣本

Go

Go語言程式碼範例

Java

Java語言程式碼範例

Python

Python語言程式碼範例

PHP

PHP語言程式碼範例

Node.js

Node.js語言程式碼範例

.NET

.NET語言程式碼範例

員工使用STS Token進行開發調試

情境描述

針對研發、營運、產品等職能員工,需要使用AccessKey進行營運、管理、調試等操作,建議通過角色SSO的方式,扮演其對應職能的RAM角色,擷取STS Token。

配置方法

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處理請求並返回訪問結果,用戶端應用程式接收到返回的結果後完成相應的商務邏輯。

image

配置方法

具體操作,請參見授予Function Compute訪問其他雲端服務的許可權

配置系統內容變數

配置方法

配置環境變數ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_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系統配置方法

    1. 建立環境變數檔案,添加環境變數ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,並寫入已準備好的AccessKey ID和AccessKey Secret。

    2. 重啟Windows系統。

阿里雲SDK程式碼範例

阿里雲SDK支援通過定義ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數來建立預設的訪問憑證。調用介面時,程式直接存取憑證,讀取您的存取金鑰(即AccessKey)並自動完成鑒權。以調用Elastic Compute Service的DescribeRegions介面為例,參考代碼如下。

程式設計語言

使用樣本

Go

Go語言程式碼範例

Java

Java語言程式碼範例

Python

Python語言程式碼範例

PHP

PHP語言程式碼範例

Node.js

Node.js語言程式碼範例

.NET

.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);
    }
}

訪問憑據泄露處理方案

相關文檔

更多雲上安全實踐,請參閱以下文檔: