Lorsque les ClusterRoles prédéfinis disponibles dans la console Container Service for Kubernetes (ACK) ne répondent pas à vos besoins, créez des Roles et des ClusterRoles personnalisés pour mettre en œuvre un contrôle d’accès basé sur les rôles (RBAC) granulaire.
Politiques RBAC personnalisées
Créez des manifestes YAML personnalisés pour les objets Role et ClusterRole afin de mettre en œuvre un contrôle d'accès granulaire aux ressources de votre cluster ACK. Utilisez les exemples suivants comme référence.
Mécanisme RBAC de Kubernetes
Role (limité à un namespace)
Un objet Role définit un ensemble d'autorisations limité à un seul namespace. Un objet RoleBinding associe ensuite le Role à des sujets, de sorte que les autorisations ne s'appliquent qu'à ce namespace. L'exemple YAML suivant définit un Role nommé my-role qui accorde un accès en lecture aux ressources Pod dans le namespace default.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules: # A list of permission rules.
- apiGroups: [""] # The API group of the resource. An empty string "" indicates the core API group.
resources: ["pods"] # The resource type that the rule applies to.
verbs: ["get", "list"] # The actions that are allowed on the resource.
ClusterRole (limité au cluster)
Un objet ClusterRole définit un ensemble d'autorisations limité à l'ensemble du cluster. Un objet ClusterRoleBinding associe ensuite le ClusterRole à des sujets, de sorte que les autorisations s'appliquent à l'échelle du cluster. L'exemple YAML suivant définit un ClusterRole nommé my-clusterrole qui accorde un accès en lecture aux ressources Pod et Service dans le cluster.
Un objet ClusterRole est une ressource limitée au cluster. La spécification d'un namespace dans le fichier YAML n'a aucun effet.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default # A namespace is not required for a ClusterRole.
name: my-clusterrole
rules: # A list of permission rules.
- apiGroups: [""] # The API group of the resource.
resources: ["pods"] # The resource type.
verbs: ["get", "list"] # The allowed actions.
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
Politiques de ressources courantes
-
Autorisations en lecture
get: lire les détails d'une ressource spécifique.list: répertorier une collection de ressources.watch: surveiller les modifications apportées aux ressources et recevoir des mises à jour en temps réel.
-
Autorisations en écriture
create: créer une nouvelle instance de ressource.update: modifier une ressource existante.patch: appliquer une modification partielle à une ressource existante.delete: supprimer une ressource spécifiée.
|
Nom de la ressource |
Type de ressource (resources) |
Groupe API (apiGroups) |
Autorisations (verbs) |
|
Pod |
resources: ["pods"] |
|
|
|
Service |
resources: ["services"] |
apiGroups: [""] |
|
|
ConfigMap |
resources: ["configmaps"] |
apiGroups: [""] |
|
|
Secret |
resources: ["secrets"] |
apiGroups: [""] |
|
|
PersistentVolume |
resources: ["persistentvolumes"] |
apiGroups: [""] |
|
|
PersistentVolumeClaim |
resources: ["persistentvolumeclaims"] |
apiGroups: [""] |
|
|
Namespace |
resources: ["namespaces"] |
apiGroups: [""] |
|
|
Deployment |
resources: ["deployments"] |
apiGroups: ["apps"] |
|
|
DaemonSet |
resources: ["daemonsets"] |
apiGroups: ["apps"] |
|
|
StatefulSet |
resources: ["statefulsets"] |
apiGroups: ["apps"] |
|
|
Ingress |
resources: ["ingresses"] |
apiGroups: ["networking.k8s.io"] |
|
|
NetworkPolicy |
resources: ["networkpolicies"] |
apiGroups: ["networking.k8s.io"] |
|
|
Job |
resources: ["jobs"] |
apiGroups: ["batch"] |
|
|
CronJob |
resources: ["cronjobs"] |
apiGroups: ["batch"] |
|
|
StorageClass |
resources: ["storageclasses"] |
apiGroups: ["storage.k8s.io"] |
|
|
HorizontalPodAutoscaler |
resources: ["horizontalpodautoscalers"] |
apiGroups: ["autoscaling"] |
|
Procédure
Vous pouvez appliquer des autorisations RBAC personnalisées via la console ACK ou à l'aide de kubectl.
La console Container Service for Kubernetes (ACK) permet uniquement de lier des ClusterRoles personnalisés. Pour lier un Role personnalisé, utilisez l'outil de ligne de commande kubectl.
Console
Étape 1 : Créer un ClusterRole personnalisé
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
Sur la page Role, cliquez sur l'onglet Cluster Role. Cliquez ensuite sur Create.
-
Dans le panneau Create YAML, saisissez le manifeste YAML de votre politique personnalisée, puis cliquez sur OK pour créer le ClusterRole.
Cette étape utilise le YAML d'un ClusterRole (étendue au cluster) à titre d'exemple. Une fois le ClusterRole créé, vous pouvez consulter le ClusterRole personnalisé my-clusterrole dans l'onglet Cluster Role.
Étape 2 : Attribuer le ClusterRole personnalisé
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Authorizations.
-
Sur la page Authorizations, configurez les autorisations de gestion.
Pour autoriser un utilisateur RAM : Cliquez sur l'onglet RAM Users, recherchez l'utilisateur RAM cible et cliquez sur Modify Permissions dans la colonne Actions pour accéder à la page Permissions.
Pour autoriser un rôle RAM : Cliquez sur l'onglet RAM Role, sélectionnez le rôle RAM cible et cliquez sur Modify Permissions pour accéder à la page Permissions.
Cliquez sur +Add Permissions. Dans la boîte de dialogue, sélectionnez le Cluster dans lequel vous avez créé le ClusterRole ainsi que le Namespace que vous souhaitez autoriser. Dans la section Permissions, sélectionnez Custom. Dans la liste déroulante qui s'affiche, sélectionnez my-clusterrole, puis cliquez sur Submit.
kubectl
Étape 1 : Créer un ClusterRole personnalisé
-
Créez un fichier nommé my-clusterrole.yaml contenant le manifeste YAML suivant.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"] -
Exécutez la commande suivante pour déployer le ClusterRole :
kubectl apply -f my-clusterrole.yaml
Étape 2 : Obtenir l'ID du sujet
Pour accorder des autorisations à un utilisateur RAM, vous devez obtenir son ID utilisateur. Pour plus d'informations, consultez la rubrique Afficher les détails d'un utilisateur RAM.
Pour accorder des autorisations à un rôle RAM, vous devez obtenir son ID de rôle. Pour plus d'informations, consultez la rubrique Afficher les informations d'un rôle RAM.
Étape 3 : Attribuer le ClusterRole personnalisé
-
Créez un fichier nommé my-clusterrole-binding.yaml contenant le manifeste YAML suivant.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-clusterrole-binding subjects: - kind: User name: "20811XXXXXXXXX2288" # The user ID or role ID of the subject obtained in Step 2. apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: my-clusterrole apiGroup: rbac.authorization.k8s.io -
Exécutez la commande suivante pour déployer le ClusterRoleBinding :
kubectl apply -f my-clusterrole-binding.yaml
Une fois les autorisations personnalisées accordées à l'utilisateur RAM ou au rôle RAM cible, obtenez le fichier kubeconfig du cluster et utilisez kubectl pour vous y connecter afin de vérifier les autorisations. ## FAQ ### Comment accorder l'accès au terminal de la console ? Par défaut, un utilisateur RAM ou un rôle RAM ne peut pas accéder au terminal d'un conteneur depuis la console ACK, même s'il dispose des autorisations en lecture seule get et list pour les pods. Cette action nécessite les autorisations get et create sur la sous-ressource Pod pods/exec.
Vous devez donc accorder les autorisations get et create sur la ressource pods/exec dans les règles rules d'un rôle ou d'un ClusterRole, puis lier ce rôle à l'utilisateur ou au groupe d'utilisateurs cible. Voici un exemple.
Pour accéder au terminal : connectez-vous à la console ACK . Sur la page Clusters , cliquez sur le nom du cluster cible. Dans le volet de navigation de gauche, choisissez . Dans la colonne Actions , cliquez sur Terminal .
Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: ns-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# Grant permissions on pods/exec in the namespace.
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]
ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
# Grant permissions on pods/exec in the cluster.
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]