Comment gérer des autorisations à travers des espaces de noms pour des utilisateurs IAM dans un cluster Amazon EKS ?

Date de la dernière mise à jour : 25/06/2021

Je souhaite gérer les autorisations utilisateur pour mes utilisateurs AWS Identity and Access Management (IAM) entre les espaces de noms de mon cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Pour gérer les autorisations utilisateur dans les espaces de noms d'un cluster Amazon EKS, vous devez :

  1. créer un rôle IAM qui peut être assumé par les membres de votre organisation ;
  2. créer un rôle de contrôle d'accès basé sur les rôles (RBAC) Kubernetes (Role) et une liaison de rôle (RoleBinding) (à partir du site web Kubernetes) pour votre cluster ;
  3. mapper les rôles IAM aux rôles et groupes RBAC à l'aide de ConfigMap aws-auth.

Remarque : lors de la création d'un cluster, seul l'Amazon Resource Name (ARN) de l'utilisateur ou du rôle IAM qui a créé le cluster est ajouté à ConfigMap aws-auth. De plus, c'est seulement cet ARN qui a des autorisations system:masters. Cela signifie que seul le créateur du cluster peut ajouter d'autres utilisateurs ou rôles à ConfigMap aws-auth.

Résolution

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

Créer un rôle IAM qui peut être assumé par les membres de votre organisation

Pour donner aux membres de votre organisation l'accès à un espace de noms, vous devez créer un rôle IAM qui peut être assumé par ces membres.

1.    Créez un rôle pour la délégation d'autorisations à un utilisateur IAM

2.    Pour vérifier qu'un utilisateur est autorisé à assumer le rôle IAM à partir de l'étape 1, configurez l'AWS CLI. Ensuite, exécutez la commande suivante à partir de la station de travail de cet utilisateur :

$ 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"
    }
}

Remarque : remplacez yourAccessKeyId, yourSecretAccessKey, yourSessionToken, yourAssumedRoleId, yourAccountID, et yourIAMRoleName par vos valeurs.

3.    Pour configurer le kubectl de l'utilisateur IAM afin qu'il utilise toujours le rôle lors de l'accès à l'API Kubernetes, exécutez la commande suivante pour mettre à jour le fichier kubeconfig :

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

Remarque : remplacez yourClusterName, yourAccountID et yourIAMRoleName par vos valeurs.

Créer un rôle RBAC Kubernetes et une liaison de rôle pour votre cluster

Important : les étapes suivantes doivent être effectuées à partir d'un poste de travail configuré pour accéder à Kubernetes. L'utilisateur doit être un créateur de cluster ou une entité IAM qui a déjà un accès via le ConfigMap aws-auth. Le rôle IAM créé dans les étapes précédentes n'a pas encore reçu l'accès au cluster.

Vous pouvez lier un rôle de cluster (ClusterRole) à une liaison de rôle. Cela est possible, car un rôle RBAC et une liaison de rôle sont des ressources dans un espace de noms Kubernetes. Cependant, vous ne pouvez pas lier un rôle à une liaison de rôle de cluster (ClusterRoleBinding).

1.    Pour répertorier tous les rôles de cluster intégrés et lier l'administrateur du rôle de cluster à une liaison de rôle pour cet espace de noms, exécutez la commande suivante :

$ kubectl get clusterrole

2.    Pour afficher les autorisations associées à l'administrateur du rôle de cluster, exécutez la commande suivante :

$ kubectl describe clusterrole admin

Important : pour utiliser un espace de noms existant, vous pouvez ignorer l'étape 3 suivante. Si vous choisissez un nom différent pour l'espace de noms test, remplacez les valeurs du paramètre namespace dans les étapes 4 et 6 suivantes.

3.    Pour créer l'espace de noms test qui accorde l'accès aux utilisateurs IAM dans le cadre du groupe IAM, exécutez la commande suivante :

$ kubectl create namespace test

4.    Pour créer un rôle RBAC Kubernetes, copiez le code suivant dans un nouveau fichier YAML (par exemple, 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"

Remarque : le rôle précédent permet aux utilisateurs d'effectuer toutes les actions de la section verbs.

5.    Pour créer le rôle RBAC, exécutez la commande suivante :

$ kubectl apply -f role.yaml

6.    Pour créer une liaison de rôle Kubernetes, copiez le code suivant dans un nouveau fichier YAML (par exemple, rolebinding.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

Remarque : la liaison de rôle est une ressource avec un espace de noms qui lie le rôle RBAC dans la section roleRef à l'utilisateur dans la section subjects. Vous n'avez pas besoin de créer l'utilisateur k8s-test-user, car Kubernetes n'a pas de type de ressource user.

7.    Pour créer la liaison de rôle RBAC, exécutez la commande suivante :

$ kubectl apply -f rolebinding.yaml

Mapper le rôle IAM au rôle et groupe RBAC à l'aide de ConfigMAP aws-auth 

1.    Pour associer le rôle IAM yourIAMRoleName à l'utilisateur Kubernetes k8s-test-user, exécutez la commande suivante :

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

Remarque : remplacez yourClusterName, yourAccountID et yourIAMRoleName par vos valeurs.

Tester l'accès à l'espace de noms

1.    Pour tester l'accès à l'espace de noms test, assumez le rôle IAM yourIAMRoleName pour un utilisateur que vous avez créé, puis exécutez la commande suivante :

$ kubectl create job hello -n test --image=busybox -- echo "Hello World"

Remarque : la commande précédente crée une tâche à l'aide du rôle RBAC k8s-test-role que vous avez créé précédemment.

2.    Pour vérifier le pod et la tâche dans l'espace de noms test, exécutez les commandes suivantes :

$ kubectl get job -n test
NAME    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

Les utilisateurs IAM qui font partie du groupe IAM peuvent désormais utiliser cet espace de noms et déployer leurs applications.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?