如何配置 SSO 用户以访问我的 Amazon EKS 集群?
上次更新时间:2023 年 2 月 8 日
我正在使用 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
或者,您也可以手动映射 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