Contrôle d'accès basé sur les rôles
Aperçu
L’authentification a été ajoutée à etcd 2.1. L’API v3 d’etcd a légèrement modifié l’API et l’interface utilisateur de la fonctionnalité d’authentification afin de mieux s’adapter au nouveau modèle de données. Ce guide vise à aider les utilisateurs à configurer une authentification basique et un contrôle d’accès basé sur les rôles dans etcd v3.
Utilisateurs et rôles spéciaux
Il existe un utilisateur spécial, root, et un rôle spécial, root.
Utilisateur root
L’utilisateur root, qui dispose d’un accès complet à etcd, doit être créé avant d’activer l’authentification. L’idée derrière l’utilisateur root est d’assurer des opérations administratives : gestion des rôles et des utilisateurs ordinaires. L’utilisateur root doit posséder le rôle root et est autorisé à modifier tout élément à l’intérieur d’etcd.
Rôle root
Le rôle root peut être attribué à tout utilisateur, en plus de l’utilisateur racine. Un utilisateur disposant du rôle root dispose à la fois d’un accès en lecture-écriture global et des autorisations pour mettre à jour la configuration d’authentification du cluster. En outre, le rôle root accorde les privilèges nécessaires à la maintenance générale du cluster, notamment la modification de la composition du cluster, la défragmentation du magasin et la prise d’instantanés.
Travail avec les utilisateurs
Le sous-commande user pour etcdctl gère toutes les opérations relatives aux comptes utilisateurs.
Une liste des utilisateurs peut être obtenue avec :
Créer un utilisateur est aussi simple que
La création d’un nouvel utilisateur demande de saisir un nouveau mot de passe. Le mot de passe peut être fourni depuis l’entrée standard lorsque l’option --interactive=false est utilisée. --new-user-password peut également être utilisé pour fournir le mot de passe.
La création d’un utilisateur qui ne peut pas être authentifié avec un mot de passe est également possible, comme indiqué ci-dessous :
Un tel utilisateur ne peut être authentifié que par TLS Common Name .
etcd ne prend pas en charge l’authentification avec un mot de passe vide via --user username:. Par exemple, un utilisateur créé avec un mot de passe vide, tel que etcdctl user add anonymous:'', ne peut pas s’authentifier par des requêtes username/password et les requêtes telles que etcdctl --user anonymous: get foo échouent avec user name is empty.
Les rôles peuvent être attribués ou retirés à un utilisateur avec :
Les paramètres de l’utilisateur peuvent être inspectés à l’aide de :
Et le mot de passe d’un utilisateur peut être modifié avec
Changer le mot de passe provoquera une nouvelle demande de mot de passe. Le mot de passe peut être fourni depuis l’entrée standard lorsque l’option --interactive=false est utilisée.
Supprimez un compte avec :
Travail avec les rôles
Le sous-commande role pour etcdctl gère toutes les opérations relatives aux contrôles d’accès pour des rôles spécifiques, tels qu’ils ont été attribués à des utilisateurs individuels.
Lister les rôles avec :
Créez un nouveau rôle avec :
Un rôle n’a pas de mot de passe ; il définit simplement un nouvel ensemble de droits d’accès.
Les rôles ont accès à une clé unique ou à une plage de clés.
La plage peut être spécifiée sous la forme d’un intervalle [clé_de_depart, clé_de_fin) où la clé_de_depart doit être strictement inférieure à la clé_de_fin selon un ordre alphabétique.
L’accès peut être accordé en lecture, écriture ou les deux, comme dans les exemples suivants :
Pour voir ce qui est accordé, nous pouvons consulter le rôle à tout moment :
La révocation des autorisations s’effectue de la même manière logique :
Comme pour supprimer un rôle entièrement :
Activer l’authentification
Les étapes minimales pour activer l’authentification sont les suivantes. L’administrateur peut configurer les utilisateurs et les rôles avant ou après l’activation de l’authentification, selon son choix.
Assurez-vous que l’utilisateur racine est créé :
Activer l’authentification :
Après cela, etcd fonctionne avec l’authentification activée. Pour la désactiver pour une raison quelconque, utilisez la commande inverse :
Portée de sécurité de l’authentification
Lorsque l’authentification est activée avec etcdctl auth enable, elle protège les opérations de l’API gRPC V3 (get, put, delete, surveillance, etc.).
Les points de terminaison HTTP /metrics et /health fonctionnent sur un gestionnaire distinct et ne sont pas protégés par l’authentification RBAC V3. Ce design permet à Prometheus et aux équilibreurs de charge de récupérer les métriques sans nécessiter d’authentification gRPC, tout en maintenant la protection des données clé-valeur.
Pour sécuriser ces points de visualisation :
- Activez le mTLS avec
--cert-file,--key-fileet--client-cert-auth - Ou liez les métriques à une interface privée en utilisant
--listen-metrics-urls - Ou utilisez des règles de réseau policies/firewall pour restreindre l’accès
Utilisation de etcdctl pour l’authentification
etcdctl prend en charge un indicateur similaire à curl pour l’authentification.
Le mot de passe peut être fourni à partir d’une invite :
Le mot de passe peut également être fourni via une option de ligne de commande --password :
Sinon, toutes les commandes etcdctl restent identiques. Les utilisateurs et rôles peuvent toujours être créés et modifiés, mais nécessitent une authentification par un utilisateur disposant du rôle root.
Utilisation du nom commun TLS
À compter de la version v3.2, si un serveur etcd est lancé avec l’option --client-cert-auth=true, le champ Common Name (CN) du certificat TLS du client sera utilisé comme utilisateur etcd. Dans ce cas, le nom commun sert à authentifier l’utilisateur, et le client n’a pas besoin de mot de passe. Notez que si les deux conditions suivantes sont remplies : 1. --client-cert-auth=true est fourni et le CN est fourni par le client, et 2. le nom d’utilisateur et le mot de passe sont fournis par le client, l’authentification basée sur le nom d’utilisateur et le mot de passe est prioritaire. Notez que cette fonctionnalité ne peut pas être utilisée avec gRPC-proxy ni avec gRPC-gateway. Cela est dû au fait que gRPC-proxy termine la connexion TLS provenant de son client, si bien que tous les clients partagent un certificat du proxy. gRPC-gateway utilise une connexion TLS interne pour transformer une requête HTTP en requête gRPC, ce qui entraîne la même limitation. Par conséquent, les clients ne peuvent pas transmettre correctement leur CN au serveur. gRPC-proxy provoquera une erreur et s’arrêtera si le certificat fourni a un CN non vide. gRPC-proxy renvoie une erreur indiquant que le client possède un CN non vide dans son certificat.
Remarques sur la force du mot de passe
Les API etcdctl et etcd n’imposent aucune longueur de mot de passe particulière lors de la création d’un utilisateur ou de la mise à jour de son mot de passe. Il incombe à l’administrateur d’appliquer ces exigences. Pour réduire les risques liés aux mots de passe faibles, utilisez l’authentification fondée sur le nom commun TLS
ainsi que des utilisateurs créés avec l’option --no-password.