如何設定 SSO 使用者以存取我的 Amazon EKS 叢集?
我正在使用 AWS IAM Identity Center (AWS Single Sign-On 的後繼者)。但是,我無法存取 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集。我想要設定 SSO 使用者以存取我的叢集。
解決方案
請確認符合下列先決條件:
- 您已開啟並設定 IAM Identity Center。
- 您的 SSO 使用者與 Amazon EKS 叢集所在的 AWS 帳戶關聯。
**注意:**下列步驟會使用 kubectl 來存取叢集。設定 kubectl 存取權後,您可以在 Amazon EKS 主控台中查看叢集資源,方法是以 IAM Identity Center 使用者身分登入。
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您執行的是最新版本的 AWS CLI。
設定 AWS CLI 來使用您的 SSO 使用者
建立在執行 AWS CLI 命令時會使用 SSO 身分驗證的 AWS Command Line Interface (AWS CLI) 設定檔。如需詳細資訊,請參閱設定 AWS CLI 以使用 AWS IAM Identity Center (AWS Single Sign-On 的後繼者)。
以下是使用自動程序的 AWS CLI SSO 組態範例:
aws configure sso SSO start URL [None]: https://my-sso-portal.awsapps.com/start SSO region [None]: us-east-1
AWS CLI 會嘗試開啟您的預設瀏覽器,並開始 IAM Identity Center 帳戶的登入程序。
Attempting to automatically open the SSO authorization page in your default browser.
如果 AWS CLI 無法開啟瀏覽器,您會收到下列訊息,其中包含如何手動啟動登入程序的說明:
If the browser does not open or you wish to use a different device to authorize this request, open the following URL: https://device.sso.us-east-2.amazonaws.com/ Then enter the code: XXXX-XXXX The only AWS account available to you is: 123456789999 Using the account ID 123456789999 The only role available to you is: ViewOnlyAccess Using the role name "ViewOnlyAccess" CLI default client Region [us-east-2]: CLI default output format [json]: CLI profile name [ViewOnlyAccess-123456789999]: test-profile To use this profile, specify the profile name using --profile, as shown: aws s3 ls --profile test-profile
您現在可以使用這個新的設定檔執行 AWS CLI 命令。此組態讓您的 SSO 使用者可以執行下列動作:
- 使用 AWS 進行驗證。
- 擔任由 IAM Identity Center 建立的 AWS Identity and Management (IAM) 角色。
範例:
$ aws sts get-caller-identity { "UserId": "AROAXMRV33N1234567890:test-user", "Account": "123456789999", "Arn": "arn:aws:sts::123456789999:assumed-role/AWSReservedSSO_ViewOnlyAccess_05a3861234567890/test-user" }
設定 kubectl 環境以使用針對 SSO 建立的 AWS CLI 設定檔
Kubectl 使用 AWS CLI 命令。因此,您必須在 kubectl 的目前環境中指定新的 AWS CLI 設定檔。若要更新 kubectl 環境以使用新的設定檔,請執行下列命令:
aws eks update-kubeconfig --name $CLUSTER-NAME --profile test-profile
執行此命令之後,kubectl 會使用設定檔 test-profile 來以叢集 API 伺服器進行驗證。
透過排除路徑建置 ARN 版本
在 aws-auth ConfigMap 中映射的 IAM 角色不包含路徑。根據預設,與您 SSO 使用者關聯的 IAM 角色之 Amazon Resource Name (ARN) 會包含路徑。
範例:
arn:aws:iam::123456789999:role/aws-reserved/sso.amazonaws.com/us-east-2/AWSReservedSSO_ViewOnlyAccess_05a3861234567890
如果您將完整 ARN 新增至 aws-auth ConfigMap,則您的 SSO 使用者不會進行身分驗證。您無法使用 SSO 使用者存取叢集。請確認在不包含路徑的情況下建置此 ARN 的版本。下一個步驟必須使用此版本
範例:
arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
您也可以執行下列命令來取得沒有路徑的 IAM 角色:
ssorole=$(aws sts get-caller-identity --query Arn --output text --profile test-profile | cut -d/ -f2) account=$(aws sts get-caller-identity --query Account --output text --profile test-profile) echo "arn:aws:iam::$account:role/$ssorole" arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
將 ARN 新增至 aws-auth ConfigMap
若要讓您的 SSO 使用者存取 Amazon EKS 叢集,與您 SSO 使用者關聯的 IAM 角色必須映射至 Kubernetes RBAC 許可。若要這樣做,請在 aws-auth ConfigMap 中包含沒有路徑的 IAM 角色 ARN。接著,將其映射至 Kubernetes 使用者以及連結至 Kubernetes Role 和 RoleBinding (或 ClusterRole 和 ClusterRoleBinding) 的群組。根據您的使用案例,使用下列任一區段所提供的指示。
具有叢集範圍管理員權限的 SSO 使用者
根據預設,Kubernetes 群組 system:masters 會提供叢集範圍管理員權限。此群組會連結至 ClusterRole 叢集管理員和 ClusterRoleBinding 叢集管理員。因此,您不需要建立新的 ClusterRole 和 ClusterBindingRole 物件。您只需要將沒有路徑的 IAM 角色映射至 system:masters 群組。
若要這樣做,請編輯 aws-auth ConfigMap:
kubectl edit configmap aws-auth -n kube-system
接著,新增以下內容:
- groups: - system:masters rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 username: cluster-admin
具有命名空間繫結讀取許可的 SSO 使用者
在這種情況下,您必須在特定命名空間內建立具有讀取許可的 Role 和 RoleBinding。然後,使用 aws-auth ConfigMap 中的自訂使用者名稱或群組名稱,將這些物件連結至 IAM 角色。
1. 建立 Kubernetes Role 物件,此物件在您所需的命名空間中僅允許讀取許可:
cat << EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: $MY-NAMESPACE name: reader-role rules: - apiGroups: [""] # "" indicates the core API group resources: ["*"] verbs: ["get", "watch", "list"] EOF
注意:
- 將 $MY-NAMESPACE 替換為您命名空間的名稱。
- 將 reader-role 替換為您的自訂使用者名稱。
2. 建立 Kubernetes RoleBinding 物件,此物件將 Kubernetes 角色權限連結至群組 read-only-group:
cat <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: reader-binding namespace: MY-NAMESPACE subjects: - kind: Group name: read-only-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: reader-role apiGroup: rbac.authorization.k8s.io EOF
3. 將沒有路徑的 IAM 角色 ARN 映射至 aws-auth ConfigMap 中的群組 read-only-group。
您可以透過執行下列命令以自動映射 IAM 角色:
eksctl create iamidentitymapping \ --cluster $CLUSTER-NAME \ --region $REGION \ --arn arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 \ --group read-only-group \ --no-duplicate-arns \ --username read-only-user1
注意:將 $CLUSTER-NAME 和 $REGION 分別替換為您叢集和區域的名稱。 或者,您可以手動映射 IAM 角色。若要這樣做,請編輯 aws-auth ConfigMap:
kubectl edit configmap aws-auth -n kube-system
然後,在 mapRoles 區段下方新增以下內容:
- groups: - read-only-group rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 username: read-only-user1
**重要事項:**IAM 角色在 aws-auth ConfigMap 中必須僅出現一次。因此,請確認只有一個區段包含 IAM 角色。
您現在可以使用 SSO 使用者來存取叢集:
$ kubectl get pod NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 24h
相關資訊
相關內容
- 已提問 3 個月前lg...
- 已提問 3 個月前lg...
- 已提問 2 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前