Module 15 – BONUS : Utilisateurs système vs utilisateurs normaux sous Linux
+==============================================================================+
| MODULE 15 (BONUS) : COMPTES SYSTÈME vs COMPTES HUMAINS |
| Durée estimée: 1-2 heures | Niveau: Intermédiaire |
+==============================================================================+
Table des matières
- Introduction
- La convention des UID sous Linux
- Utilisateurs système (service accounts)
- Utilisateurs normaux (comptes humains)
- Créer un utilisateur système avec
useradd -r - Différence entre
-ret-sdansuseradd - Exemples concrets de comptes système
- Lien avec le Module 14 – Les comptes
wikijs_* - Commandes pour lister et identifier les utilisateurs
- Bonnes pratiques en production
- Schéma récapitulatif
- Exercices pratiques
Introduction
Sous Linux, tous les comptes utilisateurs ne se valent pas. On distingue deux grandes catégories :
| Catégorie | UID typique | Rôle | Exemple |
|---|---|---|---|
| Utilisateur système (service account) | < 1000 | Exécuter des services/démons | www-data, mysql, nobody |
| Utilisateur normal (compte humain) | ≥ 1000 | Personne physique qui se connecte | alice, bob, etudiant |
Ce n'est pas une règle absolue : c'est une convention qui dépend de la distribution et de la configuration de /etc/login.defs.
Retour à la table des matières
La convention des UID sous Linux
Qu'est-ce qu'un UID ?
L'UID (User IDentifier) est un numéro unique attribué à chaque compte utilisateur. C'est ce numéro (et non le nom) que le noyau Linux utilise pour gérer les permissions.
Les plages d'UID
┌──────────────────────────────────────────────────────────────────┐
│ PLAGES D'UID SOUS LINUX │
├──────────┬───────────────────────────────────────────────────────┤
│ UID 0 │ root (super-utilisateur) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1-999 │ Comptes SYSTÈME / services / démons │
│ │ (www-data, mysql, sshd, daemon, nobody, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1000+ │ Comptes NORMAUX / humains │
│ │ (alice, bob, etudiant, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 65534 │ nobody (utilisateur sans privilèges) │
└──────────┴───────────────────────────────────────────────────────┘
Où sont définies ces plages ?
Le fichier /etc/login.defs définit les plages officielles sur votre système :
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
Résultat typique sur Ubuntu/Debian :
SYS_UID_MIN 201
SYS_UID_MAX 999
UID_MIN 1000
UID_MAX 60000
Interprétation :
- SYS_UID_MIN (201) → SYS_UID_MAX (999) : plage réservée aux comptes système
- UID_MIN (1000) → UID_MAX (60000) : plage pour les comptes humains
- UID 0 : toujours
root - UID 1-200 : souvent réservés à des comptes système critiques (selon la distribution)
Retour à la table des matières
Utilisateurs système (service accounts)
Définition
Un utilisateur système (ou service account) est un compte créé pour exécuter un service, un démon ou un composant du système. Il n'est pas destiné à un humain.
Caractéristiques typiques
| Caractéristique | Valeur typique |
|---|---|
| UID | < 1000 (souvent entre 1 et 999) |
| Shell | /usr/sbin/nologin ou /bin/false |
| Home | Pas de home, ou un répertoire technique (ex: /var/www) |
| Mot de passe | Désactivé (verrouillé) |
| Connexion interactive | Impossible (ou non souhaitée) |
Pourquoi des utilisateurs système ?
- Principe du moindre privilège : chaque service tourne avec ses permissions limitées, pas en tant que
root - Isolation : si un service est compromis, l'attaquant n'a que les droits de ce compte
- Traçabilité : on sait quel service a effectué quelle action dans les logs
- Sécurité : on évite la connexion interactive (shell
nologin)
Exemples courants
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
mysql:x:114:120:MySQL Server,,,:/nonexistent:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
root (UID 0) est un cas spécial : c'est un compte système avec un shell interactif et des privilèges totaux.
Retour à la table des matières
Utilisateurs normaux (comptes humains)
Définition
Un utilisateur normal est un compte créé pour une personne physique qui se connecte au système.
Caractéristiques typiques
| Caractéristique | Valeur typique |
|---|---|
| UID | ≥ 1000 |
| Shell | /bin/bash ou /bin/sh |
| Home | /home/<nom_utilisateur> |
| Mot de passe | Défini (actif) |
| Connexion interactive | Oui |
Comment les créer ?
sudo useradd -m -s /bin/bash alice
id alice
Le -m crée le répertoire home (/home/alice) et le -s /bin/bash donne un shell interactif.
Retour à la table des matières
Créer un utilisateur système avec useradd -r
Le drapeau -r (system account)
Le drapeau -r de useradd crée un compte système :
sudo useradd -r monservice
Ce que fait -r :
- Attribue un UID dans la plage système (selon
/etc/login.defs) - Par défaut, ne crée pas de répertoire home (sauf si on ajoute
-m)
Exemples
sudo useradd -r monservice
sudo useradd -r -m monservice
sudo useradd -r -m -s /usr/sbin/nologin monservice
sudo useradd -r -m -s /bin/bash monservice
Vérification
id monservice
getent passwd monservice
Retour à la table des matières
Différence entre -r et -s dans useradd
C'est une distinction fondamentale :
| Option | Rôle | Effet |
|---|---|---|
-r | Déclare le compte comme système | UID dans la plage système |
-s | Définit le shell de connexion | Programme lancé à la connexion |
-r ne touche pas le shell
sudo useradd -r svc_web
-s ne touche pas le type de compte
sudo useradd -s /usr/sbin/nologin alice
Combinaison recommandée pour un service
sudo useradd -r -m -s /usr/sbin/nologin svc_web
-r = type de compte (système) ; -s = shell (login / non-login). Les deux sont indépendants.
Retour à la table des matières
Exemples concrets de comptes système
Apache / Nginx
id www-data
getent passwd www-data
MySQL / MariaDB
id mysql
getent passwd mysql
SSHD
id sshd
Retour à la table des matières
Lien avec le Module 14 – Les comptes wikijs_*
Dans le TP du Module 14, on a créé :
sudo useradd -r -m -s /bin/bash wikijs_dev
sudo useradd -r -m -s /bin/bash wikijs_test
sudo useradd -r -m -s /bin/bash wikijs_prod
Ces comptes sont système car on a utilisé -r.
Vérification :
id wikijs_dev
id wikijs_test
id wikijs_prod
Lien avec systemd :
[Service]
User=wikijs_dev
Retour à la table des matières
Commandes pour lister et identifier les utilisateurs
1) Voir les plages UID
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
2) Lister les utilisateurs humains (UID ≥ UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
3) Lister les utilisateurs système (UID < UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
4) Lister les comptes non-login (services typiques)
awk -F: '($7 ~ /(nologin|false)$/) {print $1" -> "$7}' /etc/passwd
5) Lister les comptes humains probables (home + shell interactif)
awk -F: '($6 ~ /^\/home\//) && ($7 ~ /(bash|sh)$/) {print $1" home="$6" shell="$7}' /etc/passwd
Retour à la table des matières
Bonnes pratiques en production
1) Toujours utiliser -r pour les comptes de service
sudo useradd -r -m -s /usr/sbin/nologin mon_service
2) Éviter les shells interactifs pour les services
sudo usermod -s /usr/sbin/nologin wikijs_dev
3) Ne jamais faire tourner un service en root
[Service]
User=www-data
Retour à la table des matières
Schéma récapitulatif
Flux de décision : comment identifier un compte ?
Retour à la table des matières
Exercices pratiques
Exercice 1 : identifier les types de comptes (débutant)
- Affichez les plages UID :
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
- Listez les comptes système :
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
- Listez les comptes humains :
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
Exercice 2 : créer et comparer des comptes (intermédiaire)
sudo useradd -m -s /bin/bash test_humain
sudo useradd -r -m -s /usr/sbin/nologin test_service
id test_humain
id test_service
TP Bonus créé le : Février 2026