如何解决 Amazon EKS 的 RBAC 问题?

4 分钟阅读
0

当我使用我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群时,我想解决访问被拒绝、未经授权和禁止等错误。

简短描述

AWS Identity and Access Management (IAM) 为集群提供身份验证,并依赖原生 Kubernetes 基于角色的访问控制 (RBAC) 进行授权。当 IAM 用户或角色创建 Amazon EKS 集群时,IAM 实体将添加到 Kubernetes RBAC 授权表中,并具有 system: masters 权限。

要将具有管理员访问权限的用户添加到 Amazon EKS 集群,请完成以下步骤:

  1. 为关联的 IAM 用户提供所需的 IAM 控制台权限,以便用户可以执行必要的集群操作。
  2. 更新 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 命令。


相关信息

默认角色和角色绑定 控制对 EKS 集群的访问权限

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