Habilitación del acceso principal de IAM al clúster - Amazon EKS

Habilitación del acceso principal de IAM al clúster

El acceso al clúster mediante las entidades principales de IAM está habilitado por el AWSAutenticador de IAM deKubernetes, que se ejecuta en el plano de control de Amazon EKS. El autenticador obtiene la información de la configuración del ConfigMap de aws-auth. Para todos las configuraciones del ConfigMap de aws-auth, consulte el formato de configuración completa en GitHub.

Agregar las entidades principales de IAM al clúster de Amazon EKS

Cuando se crea un clúster de Amazon EKS, la entidad de IAM que crea el clúster recibe permisos de system:masters de forma automática en la configuración del role-based access control (RBAC, control de acceso basado en roles) del clúster en el plano de control de Amazon EKS. Esta entidad principal no aparece en ninguna configuración visible, así que asegúrese de realizar un seguimiento de la entidad principal que creó el clúster originalmente. Para conceder a entidades principales de IAM la capacidad de interactuar con el clúster, edite el ConfigMap de aws-auth dentro de Kubernetes y cree un rolebinding de Kubernetes o clusterrolebinding con el nombre de un group que especifique en el ConfigMap deaws-auth.

nota

Para obtener más información sobre la configuración del control de acceso basado en roles (RBAC) de Kubernetes, consulte Uso de la autorización de RBAC en la documentación de Kubernetes.

Para agregar una entidad principal de IAM a un clúster de Amazon EKS, haga lo siguiente:
  1. Determine qué credenciales de kubectl utiliza para obtener acceso al clúster. En la computadora, puede ver qué credenciales de kubectl utiliza con el siguiente comando. Reemplace ~/.kube/config por la ruta al archivo kubeconfig si no utiliza la ruta predeterminada.

    cat ~/.kube/config

    Un ejemplo de salida sería el siguiente.

    [...] contexts: - context: cluster: my-cluster.region-code.eksctl.io user: admin@my-cluster.region-code.eksctl.io name: admin@my-cluster.region-code.eksctl.io current-context: admin@my-cluster.region-code.eksctl.io [...]

    En el salida de ejemplo anterior, se configuran las credenciales de un usuario denominado admin para un clúster denominado my-cluster. Si este es el usuario que creó el clúster, entonces ya tiene acceso a él. Si no es el usuario el que creó el clúster, deberá completar los pasos restantes para habilitar el acceso al clúster para otras entidades principales de IAM. Según las prácticas recomendadas de IAM, se recomienda conceder permisos a los roles en lugar de a los usuarios. Puede ver qué otras entidades principales tienen acceso actualmente al clúster con el siguiente comando:

    kubectl describe -n kube-system configmap/aws-auth

    Un ejemplo de salida sería el siguiente.

    Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-node-role username: system:node:{{EC2PrivateDNSName}} BinaryData ==== Events: <none>

    El ejemplo anterior es un valor predeterminado aws-auth ConfigMap. Solo el rol de la instancia de nodos tiene acceso al clúster.

  2. Asegúrese de tener roles y rolebindings o clusterroles y clusterrolebindings existentes de Kubernetes a los que pueda asignar entidades principales de IAM. Para obtener más información sobre estos recursos, consulte Utilización de la autorización de RBAC en la documentación de Kubernetes.

    1. Vea sus roles o clusterroles existentes de Kubernetes. Los Roles están asignados a un namespace, pero los clusterroles se ajustan al clúster.

      kubectl get roles -A
      kubectl get clusterroles
    2. Consulte los detalles de cualquier role o clusterrole devuelto en la salida anterior y confirme que tiene los permisos (rules) que desea que las entidades principales de IAM tengan en el clúster.

      Reemplace role-name con un nombre de role devuelto en el resultado del comando anterior. Reemplace kube-system con el espacio de nombres del role.

      kubectl describe role role-name -n kube-system

      Reemplace cluster-role-name con un nombre de clusterrole devuelto en el resultado del comando anterior.

      kubectl describe clusterrole cluster-role-name
    3. Vea sus rolebindings o clusterrolebindings existentes de Kubernetes. Los Rolebindings están asignados a un namespace, pero los clusterrolebindings se ajustan al clúster.

      kubectl get rolebindings -A
      kubectl get clusterrolebindings
    4. Vea los detalles de cualquier rolebinding o clusterrolebinding y confirme que tiene un role o clusterrole del paso anterior enumerado como roleRef y un nombre de grupo enumerado para subjects.

      Reemplace role-binding-name con un nombre de rolebinding devuelto en el resultado del comando anterior. Reemplace kube-system con el namespace de la rolebinding.

      kubectl describe rolebinding role-binding-name -n kube-system

      Un ejemplo de salida sería el siguiente.

      apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: eks-console-dashboard-restricted-access-role-binding namespace: default subjects: - kind: Group name: eks-console-dashboard-restricted-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eks-console-dashboard-restricted-access-role apiGroup: rbac.authorization.k8s.io

      Reemplace cluster-role-binding-name con un nombre de clusterrolebinding devuelto en el resultado del comando anterior.

      kubectl describe clusterrolebinding cluster-role-binding-name

      Un ejemplo de salida sería el siguiente.

      apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks-console-dashboard-full-access-binding subjects: - kind: Group name: eks-console-dashboard-full-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: eks-console-dashboard-full-access-clusterrole apiGroup: rbac.authorization.k8s.io
  3. Edite el ConfigMap de aws-auth. Puede utilizar una herramienta como eksctl para actualizar el ConfigMap o puede actualizarlo manualmente editándolo.

    importante

    Recomendamos utilizar eksctl, u otra herramienta, para editar el ConfigMap. Para obtener información acerca de otras herramientas que puede utilizar, consulte Utilice herramientas para realizar cambios en el aws-authConfigMap en las guías de prácticas recomendadas de Amazon EKS. Un formato incorrecto de aws-auth ConfigMap puede provocar que pierda el acceso a su clúster.

    eksctl
    Requisito previo

    La versión 0.172.0 o posterior de la herramienta de línea de comandos eksctl instalada en su dispositivo o AWS CloudShell. Para instalar o actualizar eksctl, consulte la sección de Instalación en la documentación de eksctl.

    1. Vea las asignaciones actuales en la ConfigMap. Reemplace my-cluster por el nombre del clúster. Reemplace region-code por la Región de AWS en la que se encuentra el clúster.

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      Un ejemplo de salida sería el siguiente.

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
    2. Agregue una asignación para un rol. Reemplace my-role por el nombre de su rol. Reemplace eks-console-dashboard-full-access-group con el nombre del grupo especificado en su objeto Kubernetes RoleBinding o ClusterRoleBinding. Reemplace 111122223333 por su ID de cuenta. Puede reemplazar admin (administrador) con cualquier nombre que elija.

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:role/my-role --username admin --group eks-console-dashboard-full-access-group \ --no-duplicate-arns
      importante

      El ARN de rol no puede incluir una ruta como role/my-team/developers/my-role. El formato del ARN debe ser arn:aws:iam::111122223333:role/my-role. En este ejemplo, se necesita eliminar my-team/developers/.

      Un ejemplo de salida sería el siguiente.

      [...]
      2022-05-09 14:51:20 [ℹ]  adding identity "arn:aws:iam::111122223333:role/my-role" to auth ConfigMap
    3. Agregue una asignación para un usuario. Según las prácticas recomendadas de IAM, se recomienda conceder permisos a los roles en lugar de a los usuarios. Reemplace my-user por el nombre de usuario. Reemplace eks-console-dashboard-restricted-access-group con el nombre del grupo especificado en su objeto Kubernetes RoleBinding o ClusterRoleBinding. Reemplace 111122223333 por su ID de cuenta. Puede reemplazar my-user (mi usuario) con cualquier nombre que elija.

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user --username my-user --group eks-console-dashboard-restricted-access-group \ --no-duplicate-arns

      Un ejemplo de salida sería el siguiente.

      [...]
      2022-05-09 14:53:48 [ℹ]  adding identity "arn:aws:iam::111122223333:user/my-user" to auth ConfigMap
    4. Vea las asignaciones en el ConfigMap de nuevo.

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      Un ejemplo de salida sería el siguiente.

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes arn:aws:iam::111122223333:role/admin my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-user my-user eks-console-dashboard-restricted-access-group
    Edit ConfigMap manually
    1. Abra el ícono ConfigMap para editar.

      kubectl edit -n kube-system configmap/aws-auth
      nota

      Si recibe un error que indica “Error from server (NotFound): configmaps "aws-auth" not found”, entonces utilice el procedimiento en Aplique el ConfigMap de aws-auth en su clúster para aplicar el ConfigMap de stock.

    2. Agregue las entidades principales de IAM al ConfigMap. Un grupo de IAM no es una entidad principal de IAM, por lo que no se puede agregar al ConfigMap.

      • A fin de agregar un rol de IAM (por ejemplo, para usuarios federados): agregue los detalles del rol a la sección mapRoles del ConfigMap, en data. Agregue esta sección si no existe todavía en el archivo. Cada entrada admite los siguientes parámetros:

        • rolearn: ARN del rol de IAM que se va a agregar. Este valor no puede incluir una ruta. Por ejemplo, no puede especificar un ARN como arn:aws:iam::111122223333:role/my-team/developers/role-name. El ARN se debe arn:aws:iam::111122223333:role/role-name en su lugar.

        • username (nombre de usuario): nombre del usuario de Kubernetes al que se mapea el rol de IAM.

        • groups (grupos): el grupo o la lista de grupos de Kubernetes a los que asignar el rol. El grupo puede ser un grupo predeterminado o un grupo especificado en un clusterrolebinding o rolebinding. Para obtener más información, consulte Roles predeterminados y enlaces de roles en la documentación de Kubernetes.

      • Para agregar un usuario de IAM: Según las prácticas recomendadas de IAM, se recomienda conceder permisos a los roles en lugar de a los usuarios. Agregue los detalles del usuario a la sección mapUsers del ConfigMap, en data. Agregue esta sección si no existe todavía en el archivo. Cada entrada admite los siguientes parámetros:

        • userarn: ARN del usuario de IAM que se va a agregar.

        • username (nombre de usuario): el nombre de usuario dentro de Kubernetes al que se mapea el usuario de IAM.

        • groups (grupos): el grupo o la lista de grupos de Kubernetes a los que asignar el usuario. El grupo puede ser un grupo predeterminado o un grupo especificado en un clusterrolebinding o rolebinding. Para obtener más información, consulte Roles predeterminados y enlaces de roles en la documentación de Kubernetes.

      Por ejemplo, el siguiente bloque YAML contiene:

      • Una sección de mapRoles que asigna la instancia de nodos de IAM a grupos de Kubernetes para que los nodos puedan registrarse en el clúster y el rol de IAM my-console-viewer-role que se asigna a un grupo de Kubernetes que puede ver todos los recursos de Kubernetes para todos los clústeres. Para obtener una lista de los permisos de grupo de IAM y Kubernetes necesarios para el rol de IAM de my-console-viewer-role, consulte Permisos necesarios.

      • Una sección de mapUsers que asigna el usuario de IAM admin desde la cuenta de valor predeterminado de AWS al grupo de Kubernetes system:masters y el usuario my-user de otra cuenta AWS asignada a un grupo de Kubernetes que puede ver los recursos de Kubernetes para un espacio de nombres específico. Para obtener una lista de los permisos de grupo de IAM y Kubernetes necesarios para el usuario de IAM de my-user, consulte Permisos necesarios.

      Agregue o quite líneas según sea necesario y sustituya todos los example values con sus propios valores.

      # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-role username: system:node:{{EC2PrivateDNSName}} - groups: - eks-console-dashboard-full-access-group rolearn: arn:aws:iam::111122223333:role/my-console-viewer-role username: my-console-viewer-role mapUsers: | - groups: - system:masters userarn: arn:aws:iam::111122223333:user/admin username: admin - groups: - eks-console-dashboard-restricted-access-group userarn: arn:aws:iam::444455556666:user/my-user username: my-user
    3. Guarde el archivo y salga del editor de texto.

Aplique el ConfigMap de aws-auth en su clúster

El ConfigMap de aws-auth se crea y aplica de forma automática al clúster cuando crea un grupo de nodos administrados o cuando crea un grupo de nodos mediante eksctl. En un principio, se crea para permitir que los nodos se unan al clúster, pero también se utiliza este ConfigMap para agregar acceso de control de acceso basado en roles (RBAC) a las entidades principales de IAM. Si ha lanzado nodos autoadministrados y aplicado el ConfigMap de aws-auth al clúster, puede hacerlo con el siguiente procedimiento.

Para aplicar aws-authConfigMap en su clúster
  1. Verifique si ya ha aplicado el ConfigMap de aws-auth.

    kubectl describe configmap -n kube-system aws-auth

    Si recibe un error con estado “Error from server (NotFound): configmaps "aws-auth" not found”, continúe con los siguientes pasos para aplicar el ConfigMap de stock.

  2. Descargue, edite y aplique el mapa de configuración del autenticador de AWS.

    1. Descargue el mapa de configuración.

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. En el archivo aws-auth-cm.yaml, establezca el rolearn para el Nombre de recurso de Amazon (ARN) o el rol de IAM asociado con sus nodos. Puede hacerlo con un editor de texto o al reemplazar my-node-instance-role y ejecutar el siguiente comando:

      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml

      No modifique ninguna otra línea de este archivo.

      importante

      El ARN de rol no puede incluir una ruta como role/my-team/developers/my-role. El formato del ARN debe ser arn:aws:iam::111122223333:role/my-role. En este ejemplo, se debe eliminar my-team/developers/.

      Puede inspeccionar las salidas de la pila de AWS CloudFormation para los grupos de nodos y buscar los siguientes valores:

      • InstanceRoleARN: para grupos de nodos que se crearon con eksctl

      • NodeInstanceRole: para grupos de nodos que se crearon con plantillas de Amazon EKS incluidas en AWS CloudFormation en la AWS Management Console

    3. Aplique la configuración. Este comando puede tardar varios minutos en finalizar.

      kubectl apply -f aws-auth-cm.yaml
      nota

      Si recibe cualquier error de tipo de recurso o autorización, consulte Acceso denegado o no autorizado (kubectl) en el tema de solución de problemas.

  3. Observe el estado de los nodos y espere a que aparezca el estado Ready.

    kubectl get nodes --watch

    Ingrese Ctrl+C para obtener un símbolo del intérprete de comandos.