如何配置 SSO 用户以访问我的 Amazon EKS 集群?

4 分钟阅读
0

我正在使用 AWS IAM Identity Center(AWS Single Sign-On 的后继者)。但是,我无法访问 Amazon Elastic Kubernetes Service(Amazon EKS)集群。我想配置 SSO 用户来访问我的集群。

解决方法

请确保满足以下先决条件:

**注意:**以下步骤使用 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

相关信息

开启 IAM 用户和角色对集群的访问权限

AWS 官方
AWS 官方已更新 2 年前