AWS-EKS-10--EKS权限管理(上)向其他 IAM 用户授予权限

摘要

EKS权限管理

  • 创建EKS集群后,默认只有创建集群的 IAM 主体可以访问并管理EKS集群,实际业务中,我们需要将EKS的全部或部分权限分配给指定的用户,就需要对该用户进行授权。

  • 对于 AWS EKS 的权限管理,主要有以下三个方面内容

    • IAM 用户、Role 或者 Account 访问 EKS 相关资源。这里的资源是指 EKS 集群本身的 AWS 资源。比如,EKS 集群信息配置,EC2 节点等等,这里不包括 K8s 中的资源。这部分直接在AWS IAM中进行授权即可。
    • IAM 用户、Role 或者 Account 访问 EKS K8s 资源,这里的资源是指 K8s 内部的资源,比如,K8s 内部的 service account、deployment、service 等等。本章重点讲这部分内容。
    • K8s 内部 Pod 调用 AWS 的资源。比如,通过创建 Ingress 来创建 AWS ALB。这部分在EKS权限管理(下)Pod 是如何调用 AWS 资源的中介绍。
  • 与IAM用户授权相关的是头两条,即要使 IAM 用户能够访问 EKS 集群本身的 AWS 资源,又要能够访问 K8s 内部的资源。

创建 IAM 用户并授权其访问EKS资源

  • 关于如何在IAM中创建用户并授予相应的策略属于AWS IAM权限管理的范畴,不是本文的重点,作者默认读者已掌握这些内容,重点理解用户、组、角色和策略之间的关系。读者也可以参考一文搞懂 AWS IAM 权限 基础篇上 理论

  • 在AWS控制台中创建一个用户ekstest,为了保证最小权限原则,这里只为其分配一个内联策略(只针对关联用户),同时为其创建访问密钥。注意必须为用户至少分配如下策略,以保证IAM用户有权限查看 EKS 集群,否则使用密钥无法通过命令行连通EKS。

1
2
3
4
5
6
7
8
9
10
11
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "eks:DescribeCluster",
"Resource": "arn:aws:eks:us-west-2:743263909655:cluster/eks-lexing"
}
]
}

向 IAM 用户授予访问K8s资源的权限

  • 创建集群的 IAM 主体是唯一可以访问集群的主体。向其他 IAM 主体授予权限,以便它们可以访问您的集群。

  • ConfigMap aws-auth 在我们向 EKS 添加 node 时就自动创建了,它的作用是允许 node 加入集群。

  • aws-auth 的另一个作用是控制 AWS 用户或者 role 访问 K8s 内部的资源(准确的说是把外部 IAM 用户与 K8s 内部用户做映射)。

  • 现在 aws-auth 中只有一个 mapRoles,这里的 rolearn 就是我们之前创建EKS时自动创建的,为 EC2 提供权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 通过eksctl查看 ConfigMap 中的aws-auth映射
$ eksctl get iamidentitymapping --cluster eks-lexing --profile eks-us-west-2
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::743263909655:role/eksctl-eks-lexing-nodegroup-ng-4d-NodeInstanceRole-Y55EPJO9XYDG system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes

# 也可以通过kubectl查看configmap aws-auth
$ kubectl describe configmap -n kube-system aws-auth
Name: aws-auth
Namespace: kube-system
Labels: <none>
Annotations: <none>

Data
====
mapRoles:
----
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::743263909655:role/eksctl-eks-lexing-nodegroup-ng-4d-NodeInstanceRole-Y55EPJO9XYDG
username: system:node:{{EC2PrivateDNSName}}

mapUsers:
----
[]


BinaryData
====

Events: <none>
  • 授权–1.角色与组绑定

1
2
3
4
5
6
7
8
9
10
# 所有命名空间中的 Kubernetes 资源,文件中的组名称为 eks-console-dashboard-full-access-group
$ curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml

# 特定命名空间中的 Kubernetes 资源 - 此文件中的命名空间为 default,请依据需要修改命名空间名称。文件中的组名为 eks-console-dashboard-restricted-access-group
$ curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-restricted-access.yaml

# 这里以所有资源为例
$ kubectl apply -f eks-console-full-access.yaml
clusterrole.rbac.authorization.k8s.io/eks-console-dashboard-full-access-clusterrole created
clusterrolebinding.rbac.authorization.k8s.io/eks-console-dashboard-full-access-binding created
  • 查看上面的yaml文件,可以看到里面定义了ClusterRoleClusterRoleBinding以及RoleRoleBinding,这是K8s中的 RBAC(Role-based access control ) 授权模块中的4个对象:

    • Role:设置对 K8s 资源访问的具体权限,与某个 namesapce 相关联
    • ClusterRole:与 Role 类似,区别是不与某个 namepsace 相关联,针对整个 Cluster
    • RoleBinding:把User|Group|ServiceAccountRole 绑定,使其获得具体权限
    • ClusterRoleBinding:与 RoleBinding 类似,把User|Group|ServiceAccountClusterRole绑定,区别是不与某个 namepsace 相关联
1
2
3
4
5
6
7
# 查看集群角色及其绑定
k get ClusterRole
k get ClusterRoleBinding

# 查看角色及其绑定
k get Role -A
k get RoleBinding -A
  • 授权–2.用户与组绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 为用户添加映射,这里为用户 ekstest 添加权限策略
$ eksctl create iamidentitymapping \
--cluster eks-lexing --profile eks-us-west-2 \
--arn arn:aws:iam::743263909655:user/ekstest \
--group eks-console-dashboard-full-access-group \
--no-duplicate-arns
2023-07-05 16:28:51 [ℹ] checking arn arn:aws:iam::743263909655:user/ekstest against entries in the auth ConfigMap
2023-07-05 16:28:51 [ℹ] adding identity "arn:aws:iam::743263909655:user/ekstest" to auth ConfigMap

# 再次通过eksctl查看 ConfigMap 中的aws-auth映射
$ eksctl get iamidentitymapping --cluster eks-lexing --profile eks-us-west-2
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::743263909655:role/eksctl-eks-lexing-nodegroup-ng-4d-NodeInstanceRole-Y55EPJO9XYDG system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
arn:aws:iam::743263909655:user/ekstest eks-console-dashboard-full-access-group

# 也可以通过kubectl再次查看configmap aws-auth
# 实际上直接编辑也可以: kubectl edit configmap -n kube-system aws-auth
$ kubectl describe configmap -n kube-system aws-auth
Name: aws-auth
Namespace: kube-system
Labels: <none>
Annotations: <none>

Data
====
mapRoles:
----
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::743263909655:role/eksctl-eks-lexing-nodegroup-ng-4d-NodeInstanceRole-Y55EPJO9XYDG
username: system:node:{{EC2PrivateDNSName}}

mapUsers:
----
- groups:
- eks-console-dashboard-full-access-group
userarn: arn:aws:iam::743263909655:user/ekstest


BinaryData
====

Events: <none>
  • 此时使用 ekstest 的访问密钥就可以通过命令行访问eks了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置aws访问密钥
$ aws configure --profile ekstest
AWS Access Key ID [None]: AKIA22DP3
AWS Secret Access Key [None]: 9ajQeyy/AiaAC0n1
Default region name [None]: us-west-2
Default output format [None]: json

# 更新 ~/.kube/config
$ export AWS_PROFILE=ekstest
$ aws eks update-kubeconfig --name eks-lexing
Added new context arn:aws:eks:us-west-2:743263909655:cluster/eks-lexing to /Users/hanqf/.kube/config

# 测试命令
$ k get node
NAME STATUS ROLES AGE VERSION
ip-192-168-16-155.us-west-2.compute.internal Ready <none> 13d v1.26.4-eks-0a21954
ip-192-168-48-14.us-west-2.compute.internal Ready <none> 13d v1.26.4-eks-0a21954

  • 此时 ekstest 还不能通过aws控制台中访问eks资源,还需要为其在IAM中授予必要的EKS策略,下面的策略是授予IAM用户对EKS的完全访问权限。

1
2
3
4
5
6
7
8
9
10
11
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "eks:*",
"Resource": "*"
}
]
}

取消授权

1
2
3
4
5
6
7
8
$ eksctl delete iamidentitymapping \
--cluster eks-lexing --profile eks-us-west-2 \
--arn arn:aws:iam::743263909655:user/ekstest
2023-07-05 09:12:29 [ℹ] removing identity "arn:aws:iam::743263909655:user/ekstest" from auth ConfigMap (username = "", groups = ["eks-console-dashboard-full-access-group"])

$ eksctl get iamidentitymapping --cluster eks-lexing --profile eks-ty-old
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::743263909655:role/eksctl-eks-lexing-nodegroup-ng-4d-NodeInstanceRole-Y55EPJO9XYDG system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes