Aller au contenu principal

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​

  1. Introduction
  2. La convention des UID sous Linux
  3. Utilisateurs système (service accounts)
  4. Utilisateurs normaux (comptes humains)
  5. Créer un utilisateur système avec useradd -r
  6. Différence entre -r et -s dans useradd
  7. Exemples concrets de comptes système
  8. Lien avec le Module 14 – Les comptes wikijs_*
  9. Commandes pour lister et identifier les utilisateurs
  10. Bonnes pratiques en production
  11. Schéma récapitulatif
  12. Exercices pratiques

Introduction​

Sous Linux, tous les comptes utilisateurs ne se valent pas. On distingue deux grandes catégories :

CatégorieUID typiqueRôleExemple
Utilisateur système (service account)< 1000Exécuter des services/démonswww-data, mysql, nobody
Utilisateur normal (compte humain)≥ 1000Personne physique qui se connectealice, bob, etudiant
Attention

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éristiqueValeur typique
UID< 1000 (souvent entre 1 et 999)
Shell/usr/sbin/nologin ou /bin/false
HomePas de home, ou un répertoire technique (ex: /var/www)
Mot de passeDésactivé (verrouillé)
Connexion interactiveImpossible (ou non souhaitée)

Pourquoi des utilisateurs système ?​

  1. Principe du moindre privilège : chaque service tourne avec ses permissions limitées, pas en tant que root
  2. Isolation : si un service est compromis, l'attaquant n'a que les droits de ce compte
  3. Traçabilité : on sait quel service a effectué quelle action dans les logs
  4. 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
Note

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éristiqueValeur typique
UID≥ 1000
Shell/bin/bash ou /bin/sh
Home/home/<nom_utilisateur>
Mot de passeDéfini (actif)
Connexion interactiveOui

Comment les créer ?​

sudo useradd -m -s /bin/bash alice
id alice
Astuce

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 :

OptionRôleEffet
-rDéclare le compte comme systèmeUID dans la plage système
-sDéfinit le shell de connexionProgramme 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ésumé

-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)​

  1. Affichez les plages UID :
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
  1. 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
  1. 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