如何解决 Amazon EKS 的 RBAC 问题?
当我使用我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群时,我想解决访问被拒绝、未经授权和禁止等错误。
简短描述
AWS Identity and Access Management (IAM) 为集群提供身份验证,并依赖原生 Kubernetes 基于角色的访问控制 (RBAC) 进行授权。当 IAM 用户或角色创建 Amazon EKS 集群时,IAM 实体将添加到 Kubernetes RBAC 授权表中,并具有 system: masters 权限。
要将具有管理员访问权限的用户添加到 Amazon EKS 集群,请完成以下步骤:
- 为关联的 IAM 用户提供所需的 IAM 控制台权限,以便用户可以执行必要的集群操作。
- 更新 aws-auth ConfigMap,为其他 IAM 用户提供集群角色和角色绑定。有关更多信息,请参阅向您的 Amazon EKS 集群添加 IAM 用户或角色。
**注意:**aws-auth ConfigMap 不支持通配符。使用 eksctl 编辑 ConfigMap 是最佳做法。格式错误的条目可能会导致锁定。
运行以下 kubectl auth can-i 命令来验证 RBAC 权限设置是否正确:
kubectl auth can-i list secrets --namespace dev --as dave
运行 kubectl 命令时,身份验证机制完成以下主要步骤:
- Kubectl 从 ~/.kube/config 读取上下文配置。
- 按照 .kube/config 中的定义,运行 AWS 命令行界面(AWS CLI)命令 aws eks get-token 来获取凭证。
- k8s api 请求使用前面的令牌发送和签名。
**注意:**您不能修改通过 aws eks get-token 获得的令牌的 15 分钟到期时间。
解决方法
**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
身份验证问题
错误讯息:"The cluster is inaccessible due to the cluster creator IAM user being deleted"(由于集群创建者 IAM 用户被删除,集群无法访问)
如果您收到上述错误,则必须重新创建与集群同名的集群创建者 IAM 用户。为此,请查找有关集群管理员和集群创建者的信息。
如果您在过去 90 天内创建了集群,则可以在 AWS CloudTrail 中搜索 CreateCluster API 调用。集群创建者权限与 system:masters 权限相同。如果您还有其他拥有 system: masters 权限的用户,则您不依赖集群创建者。如果您之前使用 Amazon EKS 集群进行过身份验证,那么您可以在 Amazon CloudWatch 日志组中查看之前的身份验证者日志。使用以下 CloudWatch Logs Insights 查询来检查集群管理员用户和角色的详细信息:
fields @timestamp, @message | sort @timestamp desc | filter @logStream like /authenticator/ | filter @message like "system:masters"
要重新创建集群创建者 IAM 用户和角色,请运行以下命令:
重要提示:请务必检查所有的 AWS CLI 命令,并将示例字符串的所有实例替换为您所需的值。例如,将 EXAMPLE-USER 替换为您的用户名。
aws iam create-user --user-name <EXAMPLE-USER>
aws iam create-role --role-name <EXAMPLE-ROLE>
错误讯息:"Could not be assumed because it does not exist or the trusted entity is not correct or an error occurred when calling the AssumeRole operation"(因为它不存在,或者受信任的实体不正确,或者调用 AssumeRole 操作时出错)
如果您收到上述错误,请验证信任策略是否正确地向用户授予了假定权限。有关更多信息,请参阅IAM 教程:使用 IAM 角色委派跨 AWS 账户的访问权限。
要识别默认部署 Amazon EKS 集群的本地用户,请运行以下命令:
kubectl get clusterroles -l kubernetes.io/bootstrapping=rbac-defaults
关闭 API 操作的匿名访问权限。匿名用户的 subject(主题)已设置为 name: system:unauthenticated。要识别匿名用户,请运行以下命令:
kubectl get clusterrolebindings.rbac.authorization.k8s.io -o json | jq '.items[] | select(.subjects[]?.name=="system:unauthenticated")'
有关更多信息,请参阅 Amazon EKS 最佳实践指南。
授权问题
错误讯息:"Couldn't get current server API group list"(无法获取当前服务器 API 组列表)
要解决上述错误,请参阅未授权或访问被拒绝 (kubectl)。
错误讯息:"You must be logged in to the server (Unauthorized)"(您必须登录到服务器(未授权))
要解决上述错误,请参阅如何解决 “您必须登录到服务器(未授权)” 错误?
错误讯息:"You must be logged in to the server (the server has asked for the client to provide credentials)"(您必须登录到服务器(服务器已要求客户端提供凭证))
当您使用 IAM 实体进行 API 调用但未正确映射 IAM 实体时,就会发生上述错误。您必须将 IAM 实体映射到集群的 aws-auth ConfigMap 中的 Amazon EKS 角色。有关更多信息,请参阅启用 IAM 用户和角色对集群的访问。
错误讯息:"Can't describe cluster control plane: AccessDeniedException"(无法描述集群控制面板:accessDeniedException)
当您使用无权执行 eks:DescribeCluster 操作的用户和角色更新 kubeconfig 时,会出现上述错误。
错误讯息:"Current user or role does not have access to Kubernetes objects on this EKS cluster"(当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象)
有关上述错误的信息,请参阅解决 Amazon EKS 中的 Kubernetes 对象访问错误。
错误讯息:"Changing the cluster creator IAM to another user/role"(将集群创建者 IAM 更改为其他用户/角色)
创建集群后,您无法将集群创建者 IAM 更改为其他用户,因为您无法配置集群创建者 IAM。
网络问题
错误讯息:"Unable to connect to the server: dial tcp 172.xx.xx.xx.xx:443: i/o timeout"(无法连接到服务器:dial tcp 172.xx.xx.xx.xx:443: i/o 超时)
如果您收到此错误,请确认安全组允许来自发件人源 IP 地址的流量。
错误讯息:"Unable to connect to the server: x509: certificate is valid for *.example.com , example.com , not https://xxx.gr7.us-east-1.eks.amazonaws.com"(无法连接到服务器:x509:证书对 *.example.com、example.com 有效,不是 https://xxx.gr7.us-east-1.eks.amazonaws.com)
如果您收到此错误,请验证代理设置是否正确。
KUBECONFIG 问题
错误讯息:"The connection to the server localhost:8080 was refused"(与服务器本地主机: 8080 的连接被拒绝)
前面的错误发生在 kubeconfig 文件丢失时。kubeconfig 文件位于 ~/.kube/config 中,而 kubectl 需要这个文件。此文件包含连接到集群 API 服务器所需的集群凭证。如果 kubectl 找不到这个文件,那么它会尝试连接到默认地址 (localhost:8080)。
错误讯息:"Kubernetes configuration file is group-readable"(Kubernetes 配置文件是群组可读的)
当 kubeconfig 文件的权限不正确时,就会发生上述错误。要解决此问题,请运行以下命令:
chmod o-r ~/.kube/config chmod g-r ~/.kube/config
AWS IAM Identity Center(AWS 单点登录的继任者)配置问题
**重要提示:**从 rolearn URL 移除 /aws-reserved/sso.amazonaws.com/。如果不这样做,那么就无法以有效用户身份进行授权。
向 IAM 权限策略分配用户组
1. 打开 IAM Identity Center 控制台。
2. 选择 AWS Accounts(AWS 账户)选项卡,然后选择 AWS account(AWS 账户)以分配用户。
3. 选择 Assign Users(分配用户)。
4. 搜索用户组,然后选择 Next: Permission sets(下一步:权限设置)。
5. 选择 Create new permission set(新建权限设置),然后选择 Create a custom permission set(创建自定义权限设置)。
6. 为权限集命名,然后选中 Create a custom permissions policy(创建自定义权限策略)复选框。
7. 复制以下权限策略,然后将其粘贴到窗口中:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "*" } ] }
8. 选择 Create(创建)。
使用 Kubernetes RBAC 配置角色权限
要使用 Kubernetes RBAC 配置角色权限,请使用以下清单创建 RBAC 角色:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: <example name of the RBAC group> namespace: <example name of namespace> rules: - apiGroups: [""] resources: ["services", "endpoints", "pods", "deployments", "ingress"] verbs: ["get", "list", "watch"]
修改 IAM 身份验证器 ConfigMap
1. 运行以下命令以捕获包含所需用户数据的 IAM Identity Center 用户组的 IAM 角色:
aws iam list-roles | grep Arn
2. 运行以下 h 命令修改身份验证器 ConfigMap:
kubectl edit configmap aws-auth --namespace kube-system
3. 将以下属性添加到 mapRoles 下的 ConfigMap 中:
- rolearn: <example arn of the AWS SSO IAM role> username: <example preferred username> groups: - <example name of the RBAC group>
**重要提示:**从 rolearn URL 移除 /aws-reserved/sso.amazonaws.com/。如果不这样做,那么就无法以有效用户身份进行授权。
4. 通过运行以下命令更新您的 kubeconfig 文件:
aws eks update-kubeconfig —-name <example eks cluster> —-region <example region>
5. 使用 IAM 身份中心用户名登录,然后运行 kubectl 命令。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 个月前