← Sommaire SkyLinux

Leçon 56 : chmod et chown — Permissions avancées

Introduction

Dans la leçon 3, nous avons vu les bases des permissions Linux. Ici, nous allons plus loin : les permissions spéciales (SUID, SGID, Sticky Bit), les ACL (Listes de Contrôle d'Accès), la gestion des fichiers setuid/setgid, et des techniques avancées pour administrer les droits sur un système.

Rappel : le système de permissions classique

Chaque fichier possède trois triplets de permissions :

PositionSignification
rwx (1-3)Propriétaire (User)
rwx (4-6)Groupe (Group)
rwx (7-9)Autres (Others)
# Voir les permissions d'un fichier
ls -l /etc/passwd
# -rw-r--r-- 1 root root 1234 /etc/passwd
# ^^ ^^^ ^^^
# | | |
# | | +-- Autres : lecture seule
# | +------ Groupe : lecture seule
# +---------- Propriétaire : lecture + écriture

chmod en notation octale avancée

Tu connais sûrement chmod 755 fichier. Mais il existe des combinaisons plus fines :

# Notation octale : 4=read, 2=write, 1=execute
# chmod UGO (User, Group, Other)
chmod 640 fichier # rw-r-----
chmod 664 fichier # rw-rw-r--
chmod 600 fichier # rw-------
chmod 700 repertoire/ # rwx------
chmod 2755 script # rwxr-sr-x (SGID positionné)
chmod 4755 script # rwsr-xr-x (SUID positionné)
chmod 1755 repertoire/ # rwxr-xr-t (Sticky Bit)

Modifier une seule catégorie

# Syntaxe : chmod [u|g|o|a][+|-|=][rwx] fichier
chmod u+x script.sh # Ajoute l'exécution pour le propriétaire
chmod g-w fichier.txt # Retire l'écriture au groupe
chmod o=r fichier.txt # Others : lecture seule
chmod a+rwx fichier # Tout le monde peut lire, écrire, exécuter
chmod go-rwx secrets # Retire tout au groupe ET aux autres

Appliquer récursivement

# Uniquement les fichiers
find /var/www -type f -exec chmod 644 {} \;
# Uniquement les répertoires
find /var/www -type d -exec chmod 755 {} \;
# Avec chmod -R (moins précis)
chmod -R 755 /var/www/

Les permissions spéciales

SUID — bit setuid (4)

Quand un fichier a le bit SUID, il s'exécute avec les droits de son propriétaire, pas de l'utilisateur qui le lance. Exemple classique : passwd.

# Le 's' au lieu de 'x' pour le propriétaire
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root 84872 /usr/bin/passwd

Quand tu changes ton mot de passe, tu modifies /etc/shadow — mais tu n'as pas le droit d'écrire dans ce fichier. Le programme passwd a le bit SUID root, donc il s'exécute avec les droits root.

# Poser le bit SUID sur un script
chmod 4755 /opt/mon_script.sh
# ou
chmod u+s /opt/mon_script.sh
# Retirer le bit SUID
chmod u-s /opt/mon_script.sh

⚠️ Sécurité : Le SUID est dangereux sur les scripts. Un programme SUID root mal sécurisé peut donner un shell root à un attaquant. Utilise-le avec parcimonie.

SGID — bit setgid (2)

Sur un fichier : même principe que SUID, mais avec les droits du groupe. Sur un répertoire : tous les fichiers créés héritent du groupe du répertoire.

# Sur un fichier : 's' au lieu de 'x' pour le groupe
chmod 2555 /usr/bin/mon_outil
# Sur un répertoire : pour partager des fichiers entre un groupe
mkdir /srv/projet
chgrp developpeurs /srv/projet
chmod 2775 /srv/projet # rwxrwsr-x
# Chaque fichier créé aura le groupe 'developpeurs'

Sticky Bit — bit restrictif (1)

Sur un répertoire partagé (comme /tmp), le Sticky Bit empêche quiconque de supprimer les fichiers des autres.

# Le 't' en dernière position
ls -ld /tmp
# drwxrwxrwt 20 root root 4096 /tmp
# Poser le sticky bit sur un répertoire
chmod 1777 /srv/partage
# ou
chmod +t /srv/partage

Tout le monde peut écrire dans /srv/partage, mais chacun ne peut supprimer que ses propres fichiers.

Tableau récapitulatif des permissions spéciales

BitNomSur fichierSur répertoireOctal
SUIDSet User IDExécute avec droits du propriétaireN/A4
SGIDSet Group IDExécute avec droits du groupeLes fichiers héritent du groupe2
StickyBit restrictifN/AOn ne peut supprimer que ses propres fichiers1
# Combiner les bits : 4755 = SUID + rwx r-x r-x
# Combiner : 2755 = SGID + rwx r-x r-x
# Combiner : 1777 = Sticky + rwx rwx rwx
# Triple : 5755 = SUID + SGID + rwx r-x r-x

chown et chgrp — Modifier propriétaire et groupe

# Changer le propriétaire
sudo chown david /srv/data
# Changer le groupe
sudo chgrp developpeurs /srv/data
# Changer les deux en même temps (syntaxe : proprietaire:groupe)
sudo chown david:developpeurs /srv/data
# Changer uniquement le groupe (comme chgrp)
sudo chown :admins /srv/data
# Héritage : le groupe des nouveaux fichiers = celui du répertoire (SGID)
sudo chgrp -R developpeurs /srv/projet
# Récursif
sudo chown -R www-data:www-data /var/www
# Ne changer que les répertoires (ou fichiers)
sudo chown -R --reference=/var/www /srv/mon_site
# Utilise les mêmes propriétaires que /var/www

Les ACL — Listes de Contrôle d'Accès

Les ACL permettent d'attribuer des permissions à plusieurs utilisateurs ou groupes sur un même fichier, au-delà du schéma classique propriétaire/groupe/autres.

Vérifier si les ACL sont actives

# Sur la plupart des distributions modernes, c'est actif par défaut
# Vérifie la présence de 'acl' dans /etc/fstab
mount | grep acl

Voir les ACL d'un fichier

getfacl /srv/partage/fichier.txt
# # owner: david
# # group: developpeurs
# user::rwx
# group::r-x
# other::---
# user:alice:rwx
# group:admins:rw-

Définir des permissions ACL

# Donner à un utilisateur spécifiques l'accès read+write
sudo setfacl -m u:alice:rw /srv/partage/fichier.txt
# Donner à un groupe l'accès read-only
sudo setfacl -m g:admins:rx /srv/partage/fichier.txt
# Appliquer par défaut à tout nouveau fichier dans un répertoire
sudo setfacl -m d:u:alice:rw /srv/partage/
# d: = default, s'applique aux fichiers créés après
# Retirer une règle ACL
sudo setfacl -x u:alice /srv/partage/fichier.txt
sudo setfacl -x g:admins /srv/partage/fichier.txt

Quand des ACL sont actives, un + apparaît dans ls -l :

ls -l /srv/partage/fichier.txt
# -rw-rw-r--+ 1 david developpeurs 1234 /srv/partage/fichier.txt

Masques et ACL effectives

Le mask ACL limite les permissions maximales accordées via ACL. Même si tu donnes rwx à alice, le mask peut les réduire.

# Voir le mask
getfacl /srv/partage/fichier.txt | grep mask
# Modifier le mask
sudo setfacl -m m::r-- /srv/partage/fichier.txt
# Résultat : alice ne pourra plus écrire même si son ACL dit rw

Cas concrets d'administration

Site web Apache/Nginx

# Le serveur web (www-data) doit lire les fichiers
# L'admin (david) doit pouvoir écrire
sudo chown -R david:www-data /var/www/monsite
sudo chmod -R 2755 /var/www/monsite
# Les fichiers appartiennent à david:www-data
# SGID : tout nouveau fichier appartient au groupe www-data
# www-data peut lire, david peut lire ET écrire

Répertoire partagé avec ACL

mkdir /srv/equipe
sudo chown :equipe /srv/equipe
sudo chmod 3770 /srv/equipe
# 3 = SGID (fichiers dans le groupe 'equipe')
# 7 = rwx pour le owner
# 7 = rwx pour le groupe
# 0 = rien pour les autres
# Ajouter alice avec ACL
sudo setfacl -m u:alice:rx /srv/equipe

Diagnostiquer les problèmes de permissions

# 1. Qui est le propriétaire et le groupe ?
ls -la /chemin/vers/fichier
# 2. Vérifier les ACL
getfacl /chemin/vers/fichier
# 3. En tant qu'utilisateur, quels droits réels ?
id
#groups
# 4. Lister les permissions SUID sur le système
sudo find / -perm -4000 -type f 2>/dev/null
# 5. Qui peut écrire dans un répertoire ?
sudo find /srv/partage -maxdepth 1 -type d -exec ls -ld {} \;

Résumé

CommandeUsage
chmod 755 fichierDéfinir permissions en octal
chmod u+x fichierAjouter exécution au propriétaire
chmod 4755 fichierPoser le bit SUID
chmod 2775 repertoirePoser le bit SGID sur répertoire
chmod +t /tmpPoser le sticky bit
chown user:group fichierChanger propriétaire et groupe
chgrp group fichierChanger le groupe
setfacl -m u:alice:rw fichierACL : donner droits à alice
getfacl fichierVoir toutes les ACL d'un fichier
setfacl -m d:u:alice:rw repACL par défaut sur répertoire