如何管理 Amazon EKS 集群中 IAM 用户的跨命名空间权限?

3 分钟阅读
0

我想管理 Amazon Elastic Kubernetes Service(Amazon EKS)集群中 AWS Identity and Access Management(IAM)用户的跨命名空间用户权限。

简短描述

要管理 Amazon EKS 集群中跨命名空间的用户权限,请完成以下步骤:

  1. 创建 IAM 角色供组织成员代入。
  2. 为集群创建 Kubernetes 基于角色的访问控制(RBAC)角色(Role)和角色绑定(RoleBinding)。有关详细信息,请参阅 Kubernetes 网站上的 Using RBAC authorization
  3. 使用 aws-auth ConfigMap 将 IAM 角色映射到 RBAC 角色和群组。

**注意:**当 IAM 用户或角色创建集群时,只有此 IAM 身份的 ARN 会被添加到 aws-auth ConfigMap 中,且具有 system:masters 权限。这意味着只有集群创建者才能向 aws-auth ConfigMap 添加更多用户或角色。

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI

创建组织成员可以代入的 IAM 角色

要向组织成员授予对命名空间的访问权限,请创建 IAM 角色:

  1. 创建角色以向 IAM 用户授予权限

  2. 要验证用户是否有权代入 IAM 角色,请配置 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"
        }
    }

    **注意:**请将 yourAccessKeyIdyourSecretAccessKeyyourSessionTokenyourAssumedRoleIdyourAccountIDyourIAMRoleName 替换为您的值。

  3. 更新 kubeconfig 文件,将 IAM 用户的 kubectl 配置为访问 Kubernetes API 时始终使用该角色:

    $ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName

    **注意:**请将 yourClusterNameyourAccountIDyourIAMRoleName 替换为您的值。

为集群创建 Kubernetes RBAC 角色和角色绑定

**重要事项:**必须从被配置为访问 Kubernetes 的工作站上完成以下步骤。用户必须是集群创建者或已通过 aws-auth ConfigMap 获得访问权限的 IAM 主体。IAM 角色尚无权访问集群。

将集群角色(ClusterRole)绑定到某个角色绑定。RBAC 角色和角色绑定是 Kubernetes 命名空间资源。但是,您无法将角色绑定到集群角色绑定(ClusterRoleBinding)。

  1. 运行以下命令,以列出所有内置群集角色,并将群集角色管理员绑定到命名空间的角色绑定:

    $ kubectl get clusterrole
  2. 运行以下命令,以查看与集群角色管理员关联的权限:

    $ kubectl describe clusterrole admin
  3. 创建一个名为 test 的命名空间,向属于 IAM 组的 IAM 用户授予访问权限:
    **注意:**如果选择其他名称,请将 namespace 参数的值替换为使用现有命名空间,然后继续执行步骤 4。

    $ kubectl create namespace test
  4. 要创建 Kubernetes RBAC 角色,请将以下代码复制到新的 YAML 文件(例如 role.yaml)中:

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    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"

    **注意:**Kubernetes RBAC 角色允许用户执行 verbs 部分中的所有操作。

  5. 运行以下命令创建 RBAC 角色:

    $ kubectl apply -f role.yaml
  6. 创建 Kubernetes 角色绑定。将以下代码复制到新的 YAML 文件(例如 rolebinding.yaml)中:

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    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

使用 aws-auth ConfigMAP 将 IAM 角色映射到 RBAC 角色和群组

运行以下命令将 yourIAMRoleName IAM 角色与 k8s-test-user Kubernetes 用户关联:

$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user

**注意:**请将 yourClusterNameyourAccountIDyourIAMRoleName 替换为您的值。

测试对命名空间的访问

  1. 运行以下命令来测试对 test 命名空间的访问:
    $ kubectl create job hello -n test --image=busybox -- echo "Hello World"
    **注意:**上述命令会创建一个使用 k8s-test-role RBAC 角色的作业。
  2. 运行以下命令检查 test 命名空间中的容器组(pod)和作业:
    $ kubectl get job -n testNAME    COMPLETIONS   DURATION   AGE
    hello   1/1           4s         15s
    
    $ kubectl get pods -n test
    NAME          READY   STATUS      RESTARTS   AGE
    hello-tpjmf   0/1     Completed   0          2m34s
AWS 官方
AWS 官方已更新 3 个月前