Créer un utilisateur DevOps - Sécurité, automatisation et bonnes pratiques

Étienne Lambert .

16 mars 2026

Diagramme DevSecOps en forme de 8, illustrant le cycle de vie du développement logiciel sécurisé. Il montre les étapes clés comme la planification, le développement, la compilation, le déploiement, les opérations et la surveillance, avec des éléments d...

Créer un utilisateur en DevOps ne se résume pas à ouvrir une session de plus. Je pars toujours d’une règle simple : un compte doit correspondre à une tâche précise, avec le minimum de droits nécessaire pour la remplir. La logique derrière create user en DevOps est donc surtout une question de sécurité, d’automatisation et de maintenance, que ce soit sur un serveur Linux, dans un conteneur ou dans un pipeline d’infrastructure.

L’essentiel pour créer un compte propre et exploitable

  • Je distingue toujours compte humain, compte de service, identité cloud et utilisateur de conteneur avant de toucher à la machine.
  • Sur Linux, `adduser` est pratique pour une création interactive, tandis que `useradd` reste plus explicite pour les scripts.
  • Les droits doivent passer par des groupes ou par `sudo`, pas par un accès trop large “pour aller vite”.
  • `usermod -aG` ajoute à un groupe sans écraser les autres appartenances, ce qui évite des incidents bêtes mais fréquents.
  • Pour les environnements répétés, Ansible rend la création reproductible et facile à relire.

Définir le bon type de compte avant de le créer

Avant de créer quoi que ce soit, je regarde le rôle réel du compte. Un compte humain sert à se connecter, intervenir manuellement et laisser une trace claire. Un compte de service, lui, doit surtout exécuter une tâche répétable. Dans Kubernetes, un ServiceAccount donne une identité à un pod, pas à une personne, et cette nuance change complètement la manière de le sécuriser.

Pour un compte humain, j’ajoute presque toujours une authentification multifacteur, c’est-à-dire un second facteur en plus du mot de passe. Pour un compte de service, je coupe toute connexion interactive si elle n’a aucun sens. Pour un utilisateur de conteneur, je limite les droits au strict nécessaire dans l’image. Pour une identité cloud, je préfère souvent un rôle temporaire à un utilisateur permanent.

Type de compte Quand je l’utilise Point de vigilance
Compte humain Connexion SSH, administration, support Authentification multifacteur, accès limité, traçabilité
Compte de service Déploiement, backup, worker, API Pas de login interactif, secrets séparés, droits minimaux
Utilisateur de conteneur Exécuter un processus dans une image Droits système réduits au strict nécessaire
Identité cloud Accès à une API ou à une ressource SaaS/IaaS Préférer les rôles temporaires aux comptes permanents
Je note aussi une règle simple : si le compte n’a pas vocation à ouvrir une session, je le traite comme un compte technique, pas comme un humain. Une fois ce cadrage posé, la commande locale devient beaucoup plus simple à choisir.

Diagramme DevSecOps en forme de 8, illustrant le cycle de vie du développement logiciel sécurisé, de la planification à la surveillance, pour créer un utilisateur protégé.

Créer un utilisateur local sous Linux pas à pas

Sur Linux, la différence entre adduser et useradd tient surtout à l’ergonomie et au niveau de contrôle. adduser guide davantage la création, alors que useradd est plus bas niveau et plus adapté aux scripts. Dans un parc hétérogène, je choisis la commande native de la distribution et je garde la logique explicite.

Commande Ce qu’elle fait Quand je la choisis
adduser Assistant plus convivial, création guidée Sur Debian et Ubuntu quand je veux aller vite sans perdre en lisibilité
useradd Outil bas niveau, plus explicite et plus scriptable Dans les scripts, sur les serveurs minimalistes ou quand je veux tout paramétrer

Pour un utilisateur humain, je veux généralement un répertoire personnel, un shell de connexion et un groupe d’administration adapté à la distribution. Pour un compte technique, je fais l’inverse : pas de shell interactif, un répertoire dédié seulement si nécessaire, et aucun privilège superflu.

# Debian / Ubuntu
sudo adduser alice
sudo usermod -aG sudo alice

# RHEL / Rocky / Fedora / CentOS
sudo useradd -m -s /bin/bash alice
sudo passwd alice
sudo usermod -aG wheel alice

Le point qui me semble le plus important ici, c’est l’option -a de usermod -aG : elle ajoute le groupe sans écraser les autres appartenances. Sans elle, on remplace souvent des groupes secondaires existants, et ce genre d’erreur est bête, discret et coûteux à corriger. Quand je crée un compte de service, je choisis aussi un shell de non-login adapté à la distribution, souvent /usr/sbin/nologin, pour empêcher les connexions interactives inutiles.

Le compte existe maintenant, mais sans politique de droits claire, on n’a rien gagné. Le vrai sujet devient alors la manière d’ouvrir les portes sans trop les élargir.

Donner les droits sans ouvrir trop large

Je préfère toujours une logique de moindre privilège. En pratique, cela veut dire trois choses : des groupes d’administration clairement nommés, des règles sudo limitées, et des modifications faites avec un outil qui vérifie la syntaxe avant d’écrire. Le cache d’authentification de sudo peut être pratique, mais il ne remplace jamais une vraie séparation des rôles.

Pratique Pourquoi je l’utilise Erreur à éviter
visudo Valide la syntaxe avant d’enregistrer le fichier sudoers Modifier directement /etc/sudoers avec un éditeur classique
Groupe dédié Révocation plus simple et historique plus lisible Accorder des droits au cas par cas sans convention
docker group Pratique pour faire tourner Docker localement Le traiter comme un simple groupe d’usage alors qu’il donne souvent un contrôle proche de root
Rootless mode Réduit la surface d’attaque en évitant le root côté démon Penser qu’il corrige tout sans vérifier les permissions de l’application

Le piège du groupe docker

Je le dis franchement : ajouter un utilisateur au groupe docker revient souvent à lui donner un niveau de contrôle très proche de root sur l’hôte. Si le besoin est seulement d’exécuter des conteneurs, le mode rootless est généralement plus propre. Il lance Docker sans privilèges root, ce qui réduit la surface d’attaque et évite de faire dépendre toute la sécurité d’un groupe trop large.

Gérer sudo avec visudo

Quand je dois autoriser une action d’administration, je passe par visudo ou par un fichier dédié dans /etc/sudoers.d/. L’intérêt est simple : je garde une trace claire, et la syntaxe est contrôlée avant installation. C’est une petite discipline, mais elle évite des blocages stupides au moment où il faut intervenir vite sur une machine de production.

Quand la règle est stable, l’automatisation peut prendre le relais sans dériver. C’est là qu’Ansible devient vraiment utile.

Automatiser la création avec Ansible

Si la création d’un compte doit survivre à un rebuild de serveur, elle ne doit pas dépendre d’un clic manuel. Le module ansible.builtin.user décrit l’état attendu, puis le rejoue sans surprise. Autrement dit, il est idempotent : relancer le playbook ne crée pas de doublon, il remet juste la machine dans l’état voulu.

- name: Préparer les comptes d’exploitation
  hosts: app_servers
  become: true
  tasks:
    - name: Créer le groupe deploy
      ansible.builtin.group:
        name: deploy
        state: present

    - name: Créer l’utilisateur deployer
      ansible.builtin.user:
        name: deployer
        group: deploy
        groups: sudo
        append: true
        create_home: true
        shell: /bin/bash
        state: present

J’aime bien créer aussi le groupe avec ansible.builtin.group pour rendre la structure plus lisible. Si je dois gérer plusieurs comptes, je boucle dessus plutôt que de dupliquer les tâches. Pour les familles RHEL, je remplace souvent sudo par wheel, et je garde become: true parce que la création d’utilisateur reste une opération privilégiée.

- name: Créer plusieurs comptes
  ansible.builtin.user:
    name: "{{ item.name }}"
    groups: "{{ item.groups }}"
    append: true
    state: present
  loop:
    - { name: "alice", groups: "sudo" }
    - { name: "bob", groups: "deploy" }

Une fois ce socle automatisé, il reste les identités qui vivent au niveau des conteneurs et des plateformes, là où beaucoup d’équipes font encore des compromis un peu trop rapides.

Créer des identités techniques pour les conteneurs et le cloud

Tout ne vit pas sur un serveur classique. Une image Docker, un pod Kubernetes ou une intégration cloud a aussi besoin d’une identité propre. Quand une API backend, un worker ou une tâche qui pousse dans une base NoSQL accède à des ressources, je préfère un compte technique dédié plutôt qu’un compte humain détourné pour l’occasion.

Dans un Dockerfile

Dans une image, je crée un utilisateur dédié puis j’utilise USER pour que l’application ne tourne pas en root. Si le conteneur doit écrire quelque part, je prépare les permissions avant le passage au bon utilisateur. La syntaxe varie selon la base de l’image, mais l’idée reste la même : faire en sorte que le processus applicatif n’ait que les droits indispensables.

RUN useradd -r -m -s /usr/sbin/nologin appuser
USER appuser

Le mode rootless, c’est-à-dire l’exécution du démon Docker sans privilèges root, va dans le même sens. Quand l’environnement le permet, je le privilégie parce qu’il réduit la surface d’attaque et simplifie la logique de confiance.

Dans Kubernetes

Dans Kubernetes, je crée un ServiceAccount, puis j’attache les permissions avec RBAC, le contrôle d’accès fondé sur les rôles. Un pod de traitement ne doit obtenir que les verbes nécessaires sur les bonnes ressources. Pour un simple job de lecture, je limite aux opérations de lecture, point final. Une création rapide ressemble souvent à kubectl create serviceaccount api-reader, puis à une liaison de rôle adaptée au namespace.

Lire aussi : Installer Docker proprement - Le guide complet pour chaque OS

Dans le cloud

Dans le cloud, je réserve les identités permanentes aux cas qui l’exigent vraiment. Sur AWS, par exemple, les bonnes pratiques actuelles poussent plutôt vers des identités fédérées et des rôles temporaires pour les humains. Un utilisateur IAM permanent reste utile dans certains scénarios précis, mais je le traite comme une exception, pas comme la règle. C’est plus propre à révoquer, plus simple à auditer et plus difficile à oublier.

Ces identités techniques sont souvent celles qui posent le plus de problèmes quand on les laisse vivre trop longtemps sans règle claire. Le dernier réflexe que je garde me sert surtout à éviter ça.

Les détails qui gardent un compte propre sur la durée

Si je devais résumer ma manière de faire, je dirais ceci : je donne un nom clair au compte, je définis un propriétaire, je limite les droits et je planifie sa fin de vie dès le départ. Pour un accès temporaire, je pose souvent une revue à J+30 plutôt que de laisser le compte flotter sans contrôle.

  • Je sépare toujours compte humain et compte technique.
  • Je documente le groupe principal, le shell, le répertoire et la méthode d’authentification.
  • Je vérifie les appartenances après chaque changement pour m’assurer que usermod -aG n’a rien écrasé.
  • Je retire les clés, les jetons et les accès associés dès que le besoin disparaît.
  • Je supprime les comptes orphelins dès qu’un service n’existe plus.

Je préfère un compte simple à expliquer, facile à révoquer et impossible à confondre avec un autre rôle. C’est cette discipline qui rend la création d’utilisateur vraiment utile à long terme, pas seulement correcte le jour où on la tape.

Questions fréquentes

adduser est un script convivial qui guide l'utilisateur, idéal pour les créations interactives. useradd est une commande de bas niveau, plus adaptée aux scripts et aux environnements où un contrôle précis est nécessaire, notamment sur les serveurs minimalistes ou pour automatiser des tâches.
Définir le type de compte (humain, service, conteneur, cloud) permet d'appliquer le principe du moindre privilège. Cela assure une sécurité optimale en limitant les droits d'accès au strict nécessaire, évitant ainsi les risques liés à des permissions excessives et facilitant la traçabilité des actions.
Ajouter un utilisateur au groupe docker lui confère souvent un niveau de contrôle proche de celui de l'utilisateur root sur l'hôte. Cela peut créer une faille de sécurité majeure. Il est préférable d'utiliser le mode rootless de Docker pour réduire la surface d'attaque et limiter les privilèges.
Ansible, via le module ansible.builtin.user, permet d'automatiser et de rendre la création d'utilisateurs idempotente. Cela garantit que les comptes sont créés de manière reproductible et cohérente sur plusieurs serveurs, sans créer de doublons, et en assurant l'état désiré du système.
Dans les conteneurs, utilisez useradd -r et la commande USER dans le Dockerfile pour exécuter les processus avec des privilèges réduits. Dans Kubernetes, utilisez des ServiceAccount avec RBAC pour des permissions granulaires. Dans le cloud, privilégiez les rôles temporaires et les identités fédérées aux utilisateurs IAM permanents.
Évaluer l'article

Moyenne: 0.0 / 5 · 0 évaluations

Tags

create user créer utilisateur linux devops gestion utilisateurs devops automatiser création utilisateur ansible
Autor Étienne Lambert
Étienne Lambert
Je m'appelle Étienne Lambert et j'ai six ans d'expérience dans le développement web, en particulier dans les domaines de JavaScript, du backend, du NoSQL et de la sécurité. Mon intérêt pour ces sujets a commencé dès mes études, lorsque j'ai réalisé à quel point une bonne architecture et une sécurité robuste sont essentielles pour créer des applications performantes et fiables. J'aime partager mes connaissances et aider les lecteurs à comprendre des concepts techniques complexes en les rendant accessibles. Au fil des années, j'ai eu l'occasion de travailler sur divers projets qui m'ont permis d'approfondir mes compétences et d'explorer les dernières tendances du secteur. Je m'efforce toujours de vérifier mes sources et de comparer les informations pour offrir un contenu précis et pertinent. Mon objectif est de simplifier les sujets difficiles et d'organiser mes idées de manière claire, afin que chacun puisse en tirer profit. Je suis engagé à fournir des informations utiles, compréhensibles et à jour, et j'espère que mes articles vous aideront dans votre parcours dans le monde du développement web.
Commentaires (0)
Ajouter un commentaire