通過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認證流程如下圖所示。
當使用kubectl等工具發起對API Server的認證請求時,首先通過KubeConfig中的
exec
命令插件執行機制,執行ack-ram-tool客戶端工具生成簽名后的STS請求URL。發送Webhook認證請求到ACK托管集群API Server,通過Webhook認證配置路由到ack-ram-authenticator組件。
基于接收到的Token URL請求對阿里云RAM GetCallerIdentity接口進行認證。若認證成功,在ack-ram-authenticator組件中會尋找接口返回的RAM身份和用戶在指定RAMIdentityMapping的CR中配置的身份映射。
在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組件。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁面,單擊安全頁簽,找到ack-ram-authenticator組件,單擊卡片右下角的安裝,然后單擊確定。
步驟二:安裝ack-ram-tool客戶端
通過ack-ram-tool客戶端可以更方便地在本地自動生成指定集群的KubeConfig訪問憑據。
根據指定環境的架構類型,下載ack-ram-tool客戶端。
執行以下命令,授予客戶端程序的執行權限。
chmod +x ./ack-ram-tool
執行以下命令,將ack-ram-tool文件拷貝至系統PATH指定目錄。
mkdir -p $HOME/bin && cp ./ack-ram-tool $HOME/bin/ack-ram-tool && export PATH=$HOME/bin:$PATH
(可選)執行以下命令,持久化
$HOME/bin
中的PATH配置。echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile
執行以下命令,查看是否能夠返回客戶端組件對應的版本,以驗證ack-ram-tool客戶端組件是否安裝成功。
ack-ram-tool version
步驟三:配置阿里云憑據
阿里云RAM用戶和SSO用戶可通過以下方式配置獲取云資源的訪問憑據。
如果當前環境中存在訪問憑據相關的環境變量,ack-ram-tool將優先使用環境變量中配置的訪問憑據。您可以通過在執行ack-ram-tool命令時增加參數--ignore-env-credentials
的方式忽略這些環境變量。關于ack-ram-tool支持的憑據相關環境變量,請參見憑證信息。
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
使用以下命令,生成KubeConfig。關于命令詳情,請參見get-kubeconfig。
ack-ram-tool credential-plugin get-kubeconfig --cluster-id $cluster_id --mode ram-authenticator-token
在本地或指定環境中配置上述命令返回的KubeConfig。更多信息,請參見Kubernetes官方文檔。
步驟五:配置RAM身份和RBAC權限的映射關系
ack-ram-authenticator組件安裝完成后,默認會在集群中安裝一個名為RAMIdentityMapping的CRD,該CRD用于配置RAM身份和K8s用戶模型映射。集群權限管理員可以參考以下方式配置指定RAM用戶或RAM角色與Kubernetes RBAC權限綁定的用戶身份。
使用以下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和username
、groups
的映射。如需不同的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
執行以下命令,創建RAMIdentityMapping實例。
kubectl apply -f auth.yaml
配置目標集群的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