全部產品
Search
文件中心

Container Service for Kubernetes:通過ack-ram-authenticator完成ACK託管叢集API Server的Webhook認證

更新時間:Oct 25, 2024

通過ack-ram-authenticator組件,ACK託管叢集基於阿里雲RAM,通過Webhook機製為API Server的訪問請求提供更安全的身分識別驗證;同時,在SSO角色對接情境下,支援更安全地審計不同使用者在扮演相同角色時對叢集API Server的訪問請求。本文介紹基於ack-ram-authenticator組件的ACK託管叢集API Server的Webhook認證方式和使用方法。

前提條件

已建立ACK託管叢集,且叢集為1.24.6-aliyun.1及以上版本。具體操作, 請參見建立ACK託管叢集

注意事項

  • 安裝和卸載ack-ram-authenticator組件均會重啟叢集控制面API Server,導致與API Server的長串連斷連。請在業務低峰期進行組件的安裝和卸載。

  • 開啟Webhook認證後,不會影響DescribeClusterUserKubeconfig介面返回的KubeConfig對叢集API Server的正常訪問。

  • 已新增支援ACK Serverless叢集

認證方式介紹

ack-ram-authenticator組件是面向ACK託管叢集的認證外掛程式,基於Kubernetes原生Webhook Token認證方式,實現通過RAM完成叢集API Server的請求認證。同時,該組件通過CRD形式提供RAM身份和RBAC許可權的映射關係,幫您更靈活地配置RBAC鑒權。

對於阿里雲SSO角色對接使用ACK託管叢集的情境, ack-ram-authenticator組件可以協助您在請求API Server時,下發要求者身份對應的Session名稱,從而更安全地審計不同使用者在扮演相同角色後對叢集API Server的訪問請求。

使用ack-ram-authenticator組件後,叢集的Webhook認證流程如下圖所示。

123..png

  1. 當使用kubectl等工具發起對API Server的認證請求時,首先通過KubeConfig中的exec命令外掛程式執行機制,執行ack-ram-tool用戶端工具產生簽名後的STS請求URL。

  2. 發送Webhook認證請求到ACK託管叢集API Server,通過Webhook認證配置路由到ack-ram-authenticator組件。

  3. 基於接收到的Token URL請求對阿里雲RAM GetCallerIdentity介面進行認證。若認證成功,在ack-ram-authenticator組件中會尋找介面返回的RAM身份和使用者在指定RAMIdentityMapping的CR中配置的身份映射。

  4. API Server中對映射後的使用者和使用者組身份進行原生RBAC鑒權,並返回鑒權結果。

認證方式的優勢

與ACK叢集預設提供的x509認證認證模式相比,使用ack-ram-authenticator Webhook認證方式有以下優點。

  • 適配企業通過雲SSO情境,提供靈活可控的資料面RBAC授權。

  • 在角色SSO對接情境下,API Server審計日誌中包含企業IDP中的身份資訊,有效支援對扮演同一角色的不同IDP使用者的行為審計。

  • 當企業員工離職需刪除RAM使用者或RAM角色時,可自動清理其在叢集中的RBAC許可權。

步驟一:安裝ack-ram-authenticator組件

開啟RAM Webhook認證需要安裝ack-ram-authenticator服務端認證外掛程式,用於和叢集API Server進行認證互動。您可以通過以下方式安裝ack-ram-authenticator組件。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

  3. 組件管理頁面,單擊安全頁簽,找到ack-ram-authenticator組件,單擊卡片右下角的安裝,然後單擊確定

步驟二:安裝ack-ram-tool用戶端

通過ack-ram-tool用戶端可以更方便地在本地自動產生指定叢集的KubeConfig訪問憑據。

  1. 根據指定環境的架構類型,下載ack-ram-tool用戶端

  2. 執行以下命令,授予用戶端程式的執行許可權。

    chmod +x ./ack-ram-tool
  3. 執行以下命令,將ack-ram-tool檔案拷貝至系統PATH指定目錄。

     mkdir -p $HOME/bin && cp ./ack-ram-tool $HOME/bin/ack-ram-tool && export PATH=$HOME/bin:$PATH
  4. (可選)執行以下命令,持久化$HOME/bin中的PATH配置。

    echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile
    
  5. 執行以下命令,查看是否能夠返回用戶端組件對應的版本,以驗證ack-ram-tool用戶端組件是否安裝成功。

    ack-ram-tool version

步驟三:配置阿里雲憑據

阿里雲RAM使用者和SSO使用者可通過以下方式配置擷取雲資源的訪問憑據。

說明

如果當前環境中存在訪問憑據相關的環境變數,ack-ram-tool將優先使用環境變數中配置的訪問憑據。您可以通過在執行ack-ram-tool命令時增加參數--ignore-env-credentials的方式忽略這些環境變數。關於ack-ram-tool支援的憑據相關環境變數,請參見Credentials

RAM使用者

ack-ram-tool用戶端依賴本地配置的阿里雲金鑰認證訪問RAM進行身份認證。

關於配置資源訪問憑證的具體操作,請參見阿里雲CLI

SSO使用者

對於阿里雲雲SSO的使用者,可以通過使用雲SSO服務提供的CLI工具acs-sso完成登入,並擷取雲資源訪問憑據。關於acs-sso更多資訊,請參見使用CLI登入雲SSO並訪問阿里雲資源。阿里雲CLI工具中支援external模式,可實現通過執行外部命令列工具的方式動態擷取資源憑據。通過執行如下命令,在本地完成雲SSO登入和憑據的自動化配置。

aliyun configure --mode External --profile sso

Configuring profile 'sso' in 'External' authenticate mode...
Process Command [acs-sso login --profile sso]:
Default Region Id [cn-shanghai]:
Default Output Format [json]: json (Only support json)
Default Language [zh|en] en:
Saving profile[sso] ...Done.


Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............

步驟四:產生KubeConfig

  1. 使用以下命令,產生KubeConfig。關於命令詳情,請參見get-kubeconfig

    ack-ram-tool credential-plugin get-kubeconfig --cluster-id $cluster_id --mode ram-authenticator-token
  2. 在本地或指定環境中配置上述命令返回的KubeConfig。更多資訊,請參見Kubernetes官方文檔

步驟五:配置RAM身份和RBAC許可權的映射關係

ack-ram-authenticator組件安裝完成後,預設會在叢集中安裝一個名為RAMIdentityMapping的CRD,該CRD用於配置RAM身份和K8s使用者模型映射。叢集許可權管理員可以參考以下方式配置指定RAM使用者或RAM角色與Kubernetes RBAC許可權綁定的使用者身份。

  1. 使用以下YAML內容,建立配置模板auth.yaml檔案。

    cat >auth.yaml <<EOF
    ---
    apiVersion: ramauthenticator.k8s.alibabacloud/v1alpha1
    kind: RAMIdentityMapping
    metadata:
      name: tester
    spec:
      arn: '<ARN>'
      username: tester
      groups:
        - system:users    
    EOF
    • RAMIdentityMapping執行個體中的spec欄位僅支援配置一個RAM ARN和usernamegroups的映射。如需不同的RAM身份映射,則需要建立多個RAMIdentityMapping執行個體。

    • 需要將 <ARN>替換為指定RAM使用者或RAM角色的ARN。不同類型帳號的ARN格式說明如下。

      帳號類型

      ARN格式

      樣本

      阿里雲帳號(主帳號)

      acs:ram::<root_uid>:root

      其中 <root_uid>是阿里雲帳號的帳號 ID。

      acs:ram::123456789012****:root

      RAM使用者(子帳號)

      acs:ram::<root_uid>:user/<user_name>

      其中 <root_uid>是阿里雲帳號的帳號 ID,<user_name>是RAM使用者的使用者名稱。

      acs:ram::123456789012****:user/testuser

      RAM角色

      acs:ram::<root_uid>:role/<role_name>

      其中 <root_uid>是阿里雲帳號的帳號 ID,<role_name>是RAM角色的名稱。關於如何查看RAM角色的ARN資訊,請參見查看RAM角色

      acs:ram::123456789012****:role/testrole

  2. 執行以下命令,建立RAMIdentityMapping執行個體。

    kubectl apply -f auth.yaml
  3. 配置目的地組群的RBAC許可權,根據需求建立自訂的RBAC角色和綁定。

    一個RBAC綁定的建立樣本如下。

    cat >binding.yaml <<EOF
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: tester-clusterrolebinding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cs:ops
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: tester
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: tester2
    EOF
    
    kubectl apply -f binding.yaml

步驟六:使用KubeConfig發起請求

通過步驟四產生的KubeConfig發起對APIServer的請求,並驗證是否能夠在許可權範圍內成功請求API Server

kubectl get ns

預期輸出:

NAME              STATUS   AGE
arms-prom         Active   4h48m
default           Active   4h50m
kube-node-lease   Active   4h50m
kube-public       Active   4h50m
kube-system       Active   4h50m