如何配置 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 访问后,您可以以 IAM Identity Center 用户身份登录,就可以在 Amazon EKS 控制台中查看集群资源。
**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确认您正在运行最新版本的 AWS CLI。
将 AWS CLI 配置为使用您的 SSO 用户
创建在运行 AWS CLI 命令时使用 SSO 身份验证的 AWS 命令行界面(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 身份验证。
- 假设 AWS Identity and Management(IAM)角色是通过 IAM Identity Center 创建的。
示例:
$ 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 资源名称(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 用户
在这种情况下,您必须在特定命名空间内创建具有读取权限的角色和角色绑定。然后,在 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
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前