Utilisateurs, groupes, droits et paquets

Première leçon du cours Linux pour le développeur, en accès libre : environ 18 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Créer des utilisateurs et des groupes et comprendre sudo
  • Attribuer propriétaire et groupe avec chown et maîtriser umask
  • Préparer un dossier partagé et installer des logiciels avec apt

Utilisateurs et groupessudo et rootPropriétaire, groupe, umask, setgidGestion des paquets apt

Sur un serveur Linux, la sécurité repose d’abord sur une idée simple : chaque processus s’exécute au nom d’un utilisateur, et chaque fichier appartient à un utilisateur et à un groupe. Le cours F2 vous a présenté chmod et la notation rwx. Ici, nous passons au point de vue de l’administrateur : qui doit pouvoir faire quoi sur la machine qui héberge votre application ?

Qui suis-je ?

whoami          # nom de l'utilisateur courant
id              # uid, gid et liste des groupes
# uid=1000(lea) gid=1000(lea) groups=1000(lea),27(sudo),33(www-data)
getent passwd lea    # la ligne de lea dans la base des comptes (/etc/passwd)
getent group www-data

Les comptes sont décrits dans /etc/passwd, les groupes dans /etc/group et les mots de passe chiffrés dans /etc/shadow, lisible par root seulement.

root, sudo et comptes de service

root (uid 0) a tous les droits : il peut lire, modifier ou supprimer n’importe quoi. On ne travaille donc jamais connecté en root. On utilise un compte normal membre du groupe sudo (Debian, Ubuntu) ou wheel (Fedora, RHEL), et on préfixe ponctuellement une commande :

sudo apt update          # une seule commande avec les droits root
sudo -l                  # que suis-je autorisé à faire avec sudo ?
sudo -u postgres psql    # exécuter en tant qu'un autre utilisateur

Les règles sudo se modifient avec sudo visudo ou dans un fichier de /etc/sudoers.d/ : visudo vérifie la syntaxe avant d’enregistrer, ce qui évite de se priver soi-même de sudo.

Une bonne pratique essentielle : chaque application tourne sous un compte de service dédié, sans mot de passe ni shell de connexion. Si l’application est compromise, l’attaquant n’obtient que les droits de ce compte.

sudo useradd --system --no-create-home --shell /usr/sbin/nologin notes

Créer des utilisateurs et des groupes

sudo groupadd equipe                          # nouveau groupe
sudo useradd -m -s /bin/bash -G equipe alice  # -m crée /home/alice, -G groupes secondaires
sudo passwd alice                             # définir un mot de passe
sudo usermod -aG www-data deploy              # AJOUTE un groupe (-a est indispensable)

Sans -a, usermod -G remplace la liste des groupes secondaires : l’utilisateur peut perdre son appartenance au groupe sudo. Un nouveau groupe n’est pris en compte qu’à la prochaine connexion (ou dans un shell ouvert avec newgrp www-data).

Propriétaire et groupe : chown

sudo chown deploy:www-data /srv/site/index.html   # propriétaire et groupe
sudo chown -R deploy:www-data /srv/site           # -R : récursif
sudo chgrp equipe rapport.pdf                     # seulement le groupe
stat -c '%a %U:%G' /srv/site/index.html
# 640 deploy:www-data

stat -c affiche exactement ce que l’on veut vérifier : %a les droits en octal, %U le propriétaire, %G le groupe. Exemple typique : les fichiers d’un site appartiennent à deploy (qui publie) avec le groupe www-data (le serveur web les lit), en 640 pour les fichiers et 750 pour les dossiers.

umask : les droits par défaut

Un fichier créé partirait de 666 (un dossier de 777) ; le umask retire des droits à ces valeurs.

umask Fichier créé Dossier créé
022 (courant) 644 rw-r--r-- 755 rwxr-xr-x
027 640 rw-r----- 750 rwxr-x---
077 600 rw------- 700 rwx------
umask          # affiche la valeur courante, par exemple 0022
umask 027      # valable pour le shell courant et ses enfants

Dossier partagé : le bit setgid

Une équipe veut un dossier où chacun dépose des fichiers modifiables par tous ses membres. Le bit setgid sur un dossier (le 2 devant les droits) fait que tout fichier créé dedans reçoit le groupe du dossier, et non le groupe principal de son créateur.

sudo mkdir -p /srv/partage
sudo chown root:equipe /srv/partage
sudo chmod 2770 /srv/partage     # setgid + rwx pour propriétaire et groupe, rien pour les autres
ls -ld /srv/partage
# drwxrws--- 2 root equipe 4096 ... /srv/partage   (le s remplace le x du groupe)

Installer des logiciels : apt

Sur Debian et Ubuntu, les logiciels viennent de dépôts signés, gérés par apt :

sudo apt update                 # rafraîchit la liste des paquets disponibles
sudo apt install nginx curl     # installe (et ses dépendances)
apt show nginx                  # description, version, dépendances
apt list --installed | grep nginx
sudo apt upgrade                # met à jour les paquets installés
sudo apt remove nginx           # désinstalle (garde la configuration)

Lancez toujours apt update avant une installation : sinon apt cherche des versions qui ne sont plus sur le dépôt. Sur Fedora ou RHEL, l’équivalent est dnf.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. TâcheDifficulté 22 indices

    Dossier partagé d'équipe

    Dans le terminal (vous avez sudo), exécutez dans l’ordre :

    sudo groupadd equipe
    sudo useradd -m -s /bin/bash -G equipe alice
    sudo mkdir -p /srv/partage
    sudo chown root:equipe /srv/partage
    sudo chmod 2770 /srv/partage
    sudo -u alice touch /srv/partage/note.txt

    Puis vérifiez avec id alice, stat -c '%a %U:%G' /srv/partage et stat -c '%G' /srv/partage/note.txt.

    • `id alice` affiche `equipe` dans la liste des groupes
    • `stat -c '%a %U:%G' /srv/partage` affiche exactement `2770 root:equipe`
    • `stat -c '%G' /srv/partage/note.txt` affiche `equipe` (et non `alice`)
    • `ls -ld /srv/partage` montre `drwxrws---`
  2. TâcheDifficulté 11 indice

    Mesurer l'effet du umask

    Assurez-vous que /tmp/rapport.txt et /tmp/rapports n’existent pas, puis lancez dans un sous-shell :

    (umask 027; touch /tmp/rapport.txt; mkdir /tmp/rapports)
    stat -c '%n %a' /tmp/rapport.txt /tmp/rapports
    • Les parenthèses limitent le changement de umask au sous-shell
    • La sortie contient `/tmp/rapport.txt 640`
    • La sortie contient `/tmp/rapports 750`
    • `umask` dans le shell principal affiche toujours l'ancienne valeur (souvent 0022)
  3. QCMDifficulté 11 indice

    Ajouter un groupe sans dégâts

    L’utilisateur deploy est membre de sudo. Quelle commande l’ajoute au groupe www-data sans lui retirer sudo ?

    • sudo usermod -G www-data deploy
    • sudo usermod -aG www-data deploy
    • sudo chown deploy:www-data deploy
    • sudo groupadd www-data deploy

Quiz de fin de leçon

  1. Avec un umask de 022, quels droits a un fichier nouvellement créé ?

    • 600
    • 644
    • 755
  2. À quoi sert le bit setgid sur un dossier ?

    • À exécuter les fichiers en root
    • À donner le groupe du dossier aux fichiers créés dedans
    • À empêcher la suppression des fichiers
  3. Pourquoi faire tourner une application sous un compte de service dédié ?

    • Pour qu'elle démarre plus vite
    • Pour limiter les dégâts si elle est compromise
    • Parce que root ne peut pas lancer de programme

La suite du cours

  1. Processus, signaux et services systemd20 min
  2. Réseau, ports, pare-feu et SSH20 min
  3. Journaux et espace disque18 min
  4. Scripts d'administration et tâches planifiées20 min

Linux pour le développeur · Débutant · 1 h 36