全部產品
Search
文件中心

Container Compute Service:通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

更新時間:Mar 27, 2025

通過基於服務賬戶的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功能的工作流程如下。

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

    說明

    ACS叢集預設啟用服務賬戶令牌卷投影功能。

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

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

    說明

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

  4. Pod內應用程式使用擷取到的臨時憑證訪問雲資源OpenAPI。

啟用RRSA功能

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊

  3. 叢集資訊頁面,單擊基本資料頁簽,然後在安全與審計地區單擊RRSA OIDC後的開啟

  4. 在彈出的啟用 RRSA對話方塊,單擊確定

    說明
    • RRSA功能啟用大約需要2-3min的時間,若遇到叢集狀態一直處於更新中的情況,請手動點擊頁面右上方的image按鈕手動重新整理。

    • 當叢集狀態由更新中變為運行中後,表明該叢集的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。

  1. 建立一個名為demo-role-for-rrsa的RAM角色。

    1. 使用阿里雲帳號登入RAM控制台

    2. 在左側導覽列,選擇身份管理 > 角色,然後在角色頁面,單擊建立角色

    3. 建立角色面板,單擊切換編輯器來建立角色。

    4. 可視化編輯為例,參考如下角色資訊進行配置,然後單擊確定

      配置項

      描述

      效果

      預設為允許

      主體

      選擇身份提供者後,點擊編輯

      選擇身份提供者類型為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

      image

    5. 在彈窗頁面中,輸入角色名稱demo-role-for-rrsa,單擊確定

  2. 為建立的角色授予測試應用所需的AliyunCSReadOnlyAccess系統策略許可權。具體操作,請參見為RAM角色授權

    image

  3. 部署測試應用。

    1. 使用以下內容,建立demo.yaml檔案。

      說明

      請替換應用模板範例程式碼中的如下欄位。

      • <role_arn>需要替換為當前應用使用的RAM角色ARN。該ARN可在RAM控制台角色基本資料頁面的ARN擷取。

      • <oid_provider_arn>:替換為當前叢集的OIDC供應商ARN。該ARN可在叢集資訊頁面的基本資料頁簽,將滑鼠移動到RRSA OIDC右側的已開啟上擷取。

      展開查看範例程式碼

      ---
      apiVersion: v1
      kind: Namespace
      metadata:
        name: rrsa-demo
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: demo-sa
        namespace: rrsa-demo
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: demo
        namespace: rrsa-demo
      spec:
        containers:
        - args:
          - rrsa
          - demo
          env:
          - name: ALIBABA_CLOUD_ROLE_ARN
            value: <role_arn>
          - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
            value: <oid_provider_arn>
          - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
            value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
          image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0
          imagePullPolicy: Always
          name: demo
          volumeMounts:
          - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
            name: rrsa-oidc-token
            readOnly: true
        restartPolicy: OnFailure
        serviceAccount: demo-sa
        serviceAccountName: demo-sa
        volumes:
        - name: rrsa-oidc-token
          projected:
            defaultMode: 420
            sources:
            - serviceAccountToken:
                audience: sts.aliyuncs.com
                expirationSeconds: 3600  # 單位為秒,取值範圍為[600, 43200],即10分鐘~12小時。
                path: token
    2. 執行以下命令,部署測試應用。

      kubectl apply -f demo.yaml

      部署應用後,應用內程式可以通過掛載的OIDC Token、RAM角色的ARN以及OIDC身份供應商的ARN,調用STS的AssumeRoleWithOIDC介面,以擷取指定RAM角色的臨時憑證。然後使用該臨時憑證訪問雲資源OpenAPI。更多資訊,請參見AssumeRoleWithOIDC

  4. 執行以下命令,查看測試應用日誌。

    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 =======
  5. 可選:移除角色被授予的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>"
    ]
  }
}

相關文檔