如何管理 Amazon EKS 集群中 IAM 用户的跨命名空间权限?
上次更新时间:2020 年 8 月 20 日
我想管理 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中 AWS Identity and Access Management (IAM) 用户的跨命名空间用户权限。
简短描述
要管理 Amazon EKS 集群中用户的跨命名空间权限,您必须执行以下操作:
- 创建一个可以由您组织中的成员代入的 IAM 角色
- 为您的集群创建一个 Kubernetes 基于角色的访问控制 (RBAC) 角色 (Role) 和一个角色绑定 (RoleBinding)
- 使用 aws-auth ConfigMap 将 IAM 角色映射到 RBAC 角色和组
注意:集群创建时,仅创建该集群的 IAM 用户或角色的 Amazon 资源名称 (ARN) 会被添加到 aws-auth ConfigMap 并具有 system:masters 权限。这意味着只有集群的创建者可以将其他用户或角色添加到 aws-auth ConfigMap。
解决方法
创建一个可以由您组织中的成员代入的 IAM 角色
要让您组织中的成员访问命名空间,您必须创建一个可由这些成员代入的 IAM 角色。
2. 要验证用户是否有权代入第 1 步中的 IAM 角色,请首先配置 AWS 命令行界面 (AWS CLI),然后从该用户的工作站运行以下命令:
$ aws sts assume-role --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --role-session-name abcde
{
"Credentials": {
"AccessKeyId": "yourAccessKeyId",
"SecretAccessKey": "yourSecretAccessKey",
"SessionToken": "yourSessionToken",
"Expiration": "2020-01-30T01:57:17Z"
},
"AssumedRoleUser": {
"AssumedRoleId": "yourAssumedRoleId",
"Arn": "arn:aws:iam::yourAccountID:role/yourIAMRoleName"
}
}
注意:请将 yourAccessKeyId、yourSecretAccessKey、yourSessionToken、yourAssumedRoleId、yourAccountID 和 yourIAMRoleName 替换为您的值。
3. 要配置 IAM 用户的 kubectl 角色以确保在访问 Kubernetes API 时始终使用该角色,请运行以下命令来更新 kubeconfig 文件:
$ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName
注意:请将 yourClusterName、yourAccountID 和 yourIAMRoleName 替换为您的值。
为您的集群创建一个 Kubernetes RBAC 角色和角色绑定
重要提示:必须从配置为访问 Kubernetes 的工作站完成以下步骤。用户必须是集群的创建者或已经通过 aws-auth ConfigMap 获得访问权限的 IAM 实体。在上一步骤中创建的 IAM 角色尚未获得访问集群的权限。
您可以将某个集群角色 (ClusterRole) 绑定到某个角色绑定,这是因为 RBAC 角色和角色绑定都是 Kubernetes 命名空间资源。但您无法将某个角色绑定到某个集群角色绑定 (ClusterRoleBinding)。
1. 要列出所有内置集群角色,请将集群角色管理员绑定到该命名空间的某个角色绑定,然后运行以下命令:
$ kubectl get clusterrole
2. 要查看与集群角色管理员关联的权限,请运行以下命令:
$ kubectl describe clusterrole admin
重要提示:要使用现有的命名空间,可以跳过下面的第 3 步。如果您为命名空间 test 选择了不同的名称,则应替换下面第 4 步和第 6 步中 namespace 参数的值。
3. 要创建向属于 IAM 组成员的 IAM 用户授予访问权限的命名空间 test,请运行以下命令:
$ kubectl create namespace test
4. 要创建 Kubernetes RBAC 角色,请将下面的代码复制到新的 YAML 文件中(例如 role.yaml):
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: k8s-test-role
namespace: test
rules:
- apiGroups:
- ""
- "apps"
- "batch"
- "extensions"
resources:
- "configmaps"
- "cronjobs"
- "deployments"
- "events"
- "ingresses"
- "jobs"
- "pods"
- "pods/attach"
- "pods/exec"
- "pods/log"
- "pods/portforward"
- "secrets"
- "services"
verbs:
- "create"
- "delete"
- "describe"
- "get"
- "list"
- "patch"
- "update"
注意:上述角色允许用户执行 verbs 部分的所有操作。
5. 要创建 RBAC 角色,请运行以下命令:
$ kubectl apply -f role.yaml
6. 要创建 Kubernetes 角色绑定,请将以下代码复制到新的 YAML 文件中:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: k8s-test-rolebinding
namespace: test
subjects:
- kind: User
name: k8s-test-user
roleRef:
kind: Role
name: k8s-test-role
apiGroup: rbac.authorization.k8s.io
注意:角色绑定是一种命名空间资源,它将 roleRef 部分中的 RBAC 角色绑定到 subjects 部分中的用户。您无需创建用户 k8s-test-user,因为 Kubernetes 不存在资源类型 user。
7. 要创建 RBAC 角色绑定,请运行以下命令:
$ kubectl apply -f rolebinding.yaml
8. 要将 IAM 角色 yourIAMRoleName 与 Kubernetes 用户 k8s-test-user 绑定,请运行以下命令:
$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user
注意:请将 yourClusterName、yourAccountID 和 yourIAMRoleName 替换为您的值。
测试对命名空间的访问
要测试对命名空间 test 的访问,请代入您所创建用户的 IAM 角色 yourIAMRoleName,然后运行以下命令:
$ kubectl get role -n test
上述命令列出了您之前创建的 RBAC 角色 k8s-test-role。
属于该 IAM 组成员的 IAM 用户现在可以使用此命名空间并部署其应用程序。