通過基於服務賬戶的RAM角色(RAM Roles for Service Accounts,簡稱RRSA)功能,您可以在叢集內實現Pod維度OpenAPI許可權隔離,從而實現雲資源存取權限的細粒度隔離,降低安全風險。本文介紹RRSA功能的使用方法。
背景資訊
OIDC(OpenID Connect)是建立在OAuth 2.0基礎上的一個認證協議,阿里雲RAM支援基於OIDC的角色SSO。Kubernetes叢集內的應用可以通過執行個體RAM角色策略產生的STS臨時憑證訪問雲資源OpenAPI。阿里雲容器計算服務ACS已經支援了RRSA功能,在多租戶情境下,RRSA功能可以實現叢集內應用Pod之間的雲資源存取權限的細粒度隔離。在ACS情境下,RRSA功能可以滿足使用STS臨時憑證控制憑證有效期間的需求。
RRSA功能的工作流程如下。
提交使用了服務賬戶令牌卷投影功能的應用Pod。
說明ACS叢集預設啟用服務賬戶令牌卷投影功能。
叢集將為該應用Pod建立和掛載相應的服務賬戶OIDC Token檔案。
Pod內程式使用掛載的OIDC Token檔案訪問STS服務的AssumeRoleWithOIDC介面,擷取指定RAM角色的臨時憑證。
說明請提前修改RAM角色配置,允許Pod使用的服務賬戶使用該RAM角色。更多資訊,請參見AssumeRoleWithOIDC。
Pod內應用程式使用擷取到的臨時憑證訪問雲資源OpenAPI。
啟用RRSA功能
登入容器計算服務控制台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊。
在叢集資訊頁面,單擊基本資料頁簽,然後在安全與審計地區單擊RRSA OIDC後的開啟。
在彈出的啟用 RRSA對話方塊,單擊確定。
說明RRSA功能啟用大約需要2-3min的時間,若遇到叢集狀態一直處於更新中的情況,請手動點擊頁面右上方的
按鈕手動重新整理。當叢集狀態由更新中變為運行中後,表明該叢集的RRSA特性已變更完成。將滑鼠移動到RRSA OIDC右側的已開啟上,將顯示OIDC供應商的URL連結和ARN資訊。
叢集開啟RRSA功能後,ACS控制台將在後台執行如下操作:
自動建立一個叢集專用的OIDC Issuer服務。該服務由ACS託管,無需手動維護。
在您的帳號下建立一個使用該OIDC Issuer的OIDC身份提供者,名稱為ack-rrsa-<cluster_id>,其中 <cluster_id>為您的叢集ID。
使用RRSA功能
叢集開啟RRSA功能後,您可以參考以下內容,賦予叢集內應用通過RRSA功能擷取訪問雲資源OpenAPI的臨時憑證的能力。
使用新建立的RAM角色並授權
如果您希望使用已存在的RAM角色,不建立新的RAM角色,您可以為已有RAM角色新增相關許可權。
本樣本部署的應用將使用RRSA功能扮演指定角色,擷取當前帳號下叢集列表資訊,使用的主要資源如下。
命名空間:rrsa-demo。
服務賬戶:demo-sa。
RAM角色:demo-role-for-rrsa。
建立一個名為demo-role-for-rrsa的RAM角色。
使用阿里雲帳號登入RAM控制台。
在左側導覽列,選擇,然後在角色頁面,單擊建立角色。
在建立角色面板,單擊切換編輯器來建立角色。
以可視化編輯為例,參考如下角色資訊進行配置,然後單擊確定。
配置項
描述
效果
預設為允許。
主體
選擇身份提供者後,點擊編輯。
選擇身份提供者類型為OIDC,然後選擇對應叢集的身份提供者,如ack-rrsa-<cluster_id>。其中<cluster_id>為您的叢集ID。
操作
預設勾選sts:AssumeRole。
條件
oidc:iss:選擇身份提供者後自動添加,保持預設。
oidc:aud:選擇身份提供者後自動添加,保持預設。
oidc:sub:需要手動添加條件。
條件鍵:
oidc:sub運算子:
StringEquals條件值:格式為system:serviceaccount:<namespace>:<serviceAccountName>。
<namespace>:應用所在的命名空間。
<serviceAccountName>:服務賬戶名稱。
根據測試應用的資訊,此處需要填入
system:serviceaccount:rrsa-demo:demo-sa。

在彈窗頁面中,輸入角色名稱
demo-role-for-rrsa,單擊確定。
為建立的角色授予測試應用所需的AliyunCSReadOnlyAccess系統策略許可權。具體操作,請參見為RAM角色授權。

部署測試應用。
使用以下內容,建立demo.yaml檔案。
說明請替換應用模板範例程式碼中的如下欄位。
<role_arn>需要替換為當前應用使用的RAM角色ARN。該ARN可在RAM控制台角色基本資料頁面的ARN擷取。<oid_provider_arn>:替換為當前叢集的OIDC供應商ARN。該ARN可在叢集資訊頁面的基本資料頁簽,將滑鼠移動到RRSA OIDC右側的已開啟上擷取。
執行以下命令,部署測試應用。
kubectl apply -f demo.yaml部署應用後,應用內程式可以通過掛載的OIDC Token、RAM角色的ARN以及OIDC身份供應商的ARN,調用STS的AssumeRoleWithOIDC介面,以擷取指定RAM角色的臨時憑證。然後使用該臨時憑證訪問雲資源OpenAPI。更多資訊,請參見AssumeRoleWithOIDC。
執行以下命令,查看測試應用日誌。
kubectl -n rrsa-demo logs demo預期輸出ACK叢集列表資訊:
20**/**/** 08:35:23 ======= [begin] list ACK clusters with RRSA ======= clusters: cluster id: cf***, cluster name: foo* cluster id: c8***, cluster name: bar* cluster id: c4***, cluster name: foob* 20**/**/** 08:35:24 ======= [end] list ACK clusters with RRSA =======可選:移除角色被授予的AliyunCSReadOnlyAccess系統策略許可權。具體操作,請參見為RAM角色移除許可權。
等待30秒左右,執行以下命令,再次查看測試應用日誌。
kubectl -n rrsa-demo logs demo預期輸出無許可權的錯誤記錄檔:
20**/**/** 10:09:33 ======= [begin] list ACK clusters with RRSA ======= 20**/**/** 10:09:33 SDKError: StatusCode: 403 Code: StatusForbidden Message: code: 403, STSToken policy Forbidden for action cs:DescribeClusters request id: XXXX Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClusters","AuthPrincipalDisplayName":"demo-role-for-rrsa:ack-ram-tool","AuthPrincipalOwnerId":"XXXX","AuthPrincipalType":"AssumedRoleUser","EncodedDiagnosticMessage":"XXXX","NoPermissionType":"ImplicitDeny","PolicyType":"ResourceGroupLevelIdentityBasedPolicy"},"code":"StatusForbidden","message":"STSToken policy Forbidden for action cs:DescribeClusters","requestId":"XXXX","status":403,"statusCode":403}
使用已存在的RAM角色並授權
如果您的應用需要使用已存在的RAM角色,而非建立新的單獨RAM角色,您可以修改RAM角色的信任策略,新增一條允許使用指定的服務賬戶的應用有許可權通過扮演此RAM角色擷取臨時憑證的信任策略。更多資訊,請參見修改RAM角色的信任策略。
RAM角色信任策略中新增的Statement條目內容樣本如下。
請替換Statement條目內容樣本中的如下欄位。
<oidc_issuer_url>:替換為當前叢集的OIDC供應商URL。在叢集資訊頁面的基本資料頁簽,將滑鼠移動到RRSA OIDC右側的已開啟上擷取。<oidc_provider_arn>:替換為當前叢集的OIDC供應商ARN。在叢集資訊頁面的基本資料頁簽,將滑鼠移動到RRSA OIDC右側的已開啟上擷取。<namespace>:替換為應用所在的命名空間。<service_account>:替換為應用使用的服務賬戶。
{
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"oidc:aud": "sts.aliyuncs.com",
"oidc:iss": "<oidc_issuer_url>",
"oidc:sub": "system:serviceaccount:<namespace>:<service_account>"
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"<oidc_provider_arn>"
]
}
}相關文檔
目前部分阿里雲官方SDK已經內建了支援使用RRSA OIDC Token進行OpenAPI認證的功能。支援此功能的SDK版本資訊和參考代碼如下。
程式設計語言
支援認證的SDK版本
使用樣本
Go
Alibaba Cloud Credentials for Go 1.2.6及以上版本
Java
Alibaba Cloud Credentials for Java 0.2.10及以上版本
Python 3
Alibaba Cloud Credentials for Python 0.3.1及以上版本
Node.js和TypeScript
進行OIDC角色SSO時,您通過調用AssumeRoleWithOIDC介面,擷取扮演RAM角色的臨時身份憑證(STS Token)。