Aller au contenu

Linux : utilisateurs et droits

Linux est un système multi-utilisateur : chaque fichier a un propriétaire, un groupe et des droits ; chaque programme s’exécute au nom d’un utilisateur. C’est le fondement de la sécurité du système. Pour les notions avancées (ACL, setuid, capabilities, AppArmor), voir Linux avancé : permissions et sécurité.

Fenêtre de terminal
whoami # nom de l'utilisateur
id # identifiant, groupe principal, groupes
id alice
groups
who # utilisateurs connectés
last -n 5 # dernières connexions
uid=1000(alice) gid=1000(alice) groupes=1000(alice),27(sudo),100(users)

Chaque utilisateur a un UID (numéro) ; les noms ne sont que des étiquettes. root est l’utilisateur d’UID 0, tout-puissant.

Fenêtre de terminal
ls -l
# -rwxr-xr-- 1 alice equipe 2048 janv. 15 10:30 script.sh
Portion Qui Ici
- Type (- fichier, d dossier, l lien) Fichier
rwx Propriétaire (user) alice : lire, écrire, exécuter
r-x Groupe equipe : lire, exécuter
r-- Autres (other) Tous les autres : lire seulement
Droit Sur un fichier Sur un dossier
r Lire Lister son contenu
w Modifier Créer, renommer, supprimer des éléments
x Exécuter (programme, script) Traverser (entrer dedans, accéder à ses éléments)

Pour supprimer un fichier, ce n’est pas le droit sur le fichier qui compte, mais le droit w sur le dossier qui le contient.

Chaque droit vaut un nombre : r = 4, w = 2, x = 1. On additionne par catégorie (propriétaire, groupe, autres) :

Octal Droits Usage courant
600 rw------- Fichier privé (clé SSH, secrets)
640 rw-r----- Lisible par le groupe
644 rw-r--r-- Fichier public en lecture (défaut)
700 rwx------ Dossier ou script privé
750 rwxr-x--- Dossier partagé avec un groupe
755 rwxr-xr-x Programme ou dossier public (défaut des dossiers)
Fenêtre de terminal
chmod 600 ~/.ssh/id_ed25519
chmod 755 script.sh
chmod -R 750 /srv/projet # récursif (à manier avec précaution)
Fenêtre de terminal
chmod u+x script.sh # ajouter l'exécution au propriétaire
chmod g+w,o-r fichier # groupe : écriture ; autres : retirer la lecture
chmod a+r fichier # tous : lecture (a = all)
chmod u=rwx,g=rx,o= dossier
chmod -R g+rX projet/ # X : exécution seulement pour les dossiers

Lettres : u (propriétaire), g (groupe), o (autres), a (tous) ; + ajoute, - retire, = fixe.

Fenêtre de terminal
sudo chown alice fichier
sudo chown alice:equipe fichier
sudo chown -R alice: /srv/projet # alice et son groupe principal, récursif
sudo chgrp equipe fichier

Seul root peut changer le propriétaire d’un fichier ; le propriétaire peut changer son groupe vers un groupe dont il est membre.

Fenêtre de terminal
sudo apt update # commande avec les droits de root
sudo -i # shell root interactif (à éviter, utiliser sudo ponctuellement)
sudo -u postgres psql # commande en tant qu'un autre utilisateur
sudo -l # ce qu'on a le droit de faire
sudo !! # relancer la commande précédente avec sudo

sudo demande le mot de passe de l’utilisateur (pas celui de root) et enregistre chaque usage dans le journal (/var/log/auth.log). Il appartient au groupe sudo sous Ubuntu : un utilisateur de ce groupe est administrateur.

Habitudes :

  • Utiliser sudo pour une commande précise, pas pour toute une session.
  • Relire une commande avant de la précéder de sudo : elle s’exécutera sans aucune protection.
  • Une redirection n’hérite pas de sudo : sudo echo x > /etc/fichier échoue ; utiliser echo x | sudo tee /etc/fichier.
Fenêtre de terminal
sudo adduser alice # crée le compte, son dossier personnel, demande un mot de passe
sudo adduser alice sudo # la rend administratrice
sudo adduser alice equipe # l'ajoute au groupe « equipe »
sudo usermod -aG equipe,docker alice # ajouter à des groupes (-a : sans retirer les autres)
sudo passwd alice # changer son mot de passe
sudo passwd -l alice # verrouiller le compte
sudo deluser alice # supprimer le compte (garde le dossier personnel)
sudo deluser --remove-home alice # supprimer aussi le dossier personnel
sudo addgroup equipe
getent group equipe
getent passwd alice
Commande Usage
adduser Interactive, recommandée (spécifique à Debian et Ubuntu)
useradd Bas niveau, aucune configuration par défaut : pour les scripts
usermod -aG Ajouter à un groupe : toujours avec -a, sinon les autres groupes sont retirés
adduser --system Compte de service (sans mot de passe, sans connexion)

Un utilisateur ajouté à un groupe doit se reconnecter pour que ce changement prenne effet (newgrp ou nouvelle session).

Scénario : le dossier /srv/projet doit être modifiable par le groupe equipe.

Fenêtre de terminal
sudo addgroup equipe
sudo adduser alice equipe
sudo adduser bob equipe
sudo mkdir -p /srv/projet
sudo chown -R root:equipe /srv/projet
sudo chmod -R 2775 /srv/projet # setgid (2) : les nouveaux fichiers héritent du groupe « equipe »

Le bit setgid (le 2 de 2775) fait que les fichiers créés dans le dossier appartiennent au groupe equipe, quel que soit leur créateur. Les membres doivent avoir un umask de 002 (ou 0007 selon la politique) pour que leurs fichiers soient modifiables par le groupe. Pour des besoins plus fins, les ACL (Linux avancé : permissions et sécurité).

Fenêtre de terminal
passwd # changer son propre mot de passe
sudo chage -l alice # politique et dates d'expiration
sudo chage -d 0 alice # forcer le changement à la prochaine connexion

Pour les connexions distantes, préférer les clés SSH aux mots de passe (SSH : clés et SSH : durcissement du serveur). Un mot de passe long (phrase) vaut mieux qu’un mot de passe court et compliqué ; ne pas le réutiliser.

Fichier Contenu
/etc/passwd Liste des comptes (nom, UID, groupe, dossier, shell) : lisible par tous
/etc/shadow Empreintes des mots de passe : lisible par root seulement
/etc/group Groupes et leurs membres
/etc/sudoers, /etc/sudoers.d/ Règles de sudo (édition par visudo seulement)
Fenêtre de terminal
getent passwd alice
cat /etc/group | grep equipe

N’éditer ces fichiers qu’avec les commandes prévues (adduser, usermod, visudo), jamais à la main : une erreur peut bloquer toute connexion.

Un programme (serveur web, base de données) s’exécute sous un compte dédié sans droits superflus :

Fenêtre de terminal
sudo adduser --system --group --no-create-home --shell /usr/sbin/nologin monapp
ps -o user,cmd -C nginx

Voir systemd : durcissement d’un service. Ne jamais exécuter un service exposé à Internet en root.

Message Cause probable
Permission denied à la lecture Pas de droit r sur le fichier, ou pas de x sur un dossier parent
Permission denied à la suppression Pas de droit w sur le dossier
Permission denied en lançant ./script.sh Droit x absent : chmod +x script.sh
bash: ./script.sh: cannot execute: required file not found Fins de ligne Windows (CRLF) ou interpréteur absent
Operation not permitted Action réservée à root, ou attribut immuable (lsattr)
sudo: a password is required Connexion non interactive, ou règle sudoers manquante
Permissions 0644 for 'id_ed25519' are too open Clé privée SSH : chmod 600
<utilisateur> is not in the sudoers file Compte absent du groupe sudo : sudo adduser <utilisateur> sudo depuis un compte administrateur

Trouver quel droit manque :

Fenêtre de terminal
namei -l /srv/projet/fichier.txt # droits de chaque niveau du chemin
id # mes groupes
ls -ld /srv /srv/projet # droits des dossiers parents
Symptôme Piste
Je viens d’être ajouté à un groupe, rien ne change Se déconnecter et se reconnecter
Un service ne peut pas lire ses fichiers Propriétaire et droits adaptés à l’utilisateur du service (ps -o user,cmd), namei -l
Les fichiers copiés par sudo appartiennent à root sudo chown -R alice: dossier/
usermod: user 'x' does not exist Vérifier avec getent passwd x
Verrouillé hors de sudo après une erreur dans sudoers Garder une session root ouverte pendant la modification (visudo) ; voir Linux avancé : permissions et sécurité

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

Sur Ubuntu 26.04, sudo est fourni par sudo-rs : les usages courants (sudo commande, sudo -u, sudo -i, sudo -l) sont identiques ; les règles très spécifiques de sudoers demandent un test (visudo -c).