Maîtriser les permissions de fichiers Linux avec la commande 'chmod'

Apprenez chmod avec les modes symbolique et numérique, les valeurs par défaut sûres, les changements récursifs et les bits de permission spéciaux.

Maîtrise des permissions de fichiers Linux avec la commande 'chmod'

Les permissions de fichiers Linux déterminent qui peut lire, modifier ou exécuter un fichier. Lorsqu'un script ne s'exécute pas, qu'un serveur web ne peut pas lire un fichier, ou qu'une clé privée est rejetée car trop ouverte, chmod fait souvent partie de la solution.

La commande chmod modifie les bits de permission. Vous pouvez utiliser des modes symboliques lisibles comme u+x ou des modes numériques compacts comme 755.

Lire les chaînes de permission

Exécutez ls -l pour voir le type et les permissions d'un fichier :

ls -l deploy.sh

Exemple de sortie :

-rwxr-xr-- 1 app deploy 1200 May 23 10:00 deploy.sh

Le premier caractère indique le type de fichier. Un fichier régulier commence par -, un répertoire par d, et un lien symbolique par l.

Les neuf caractères suivants représentent trois groupes de permissions :

  • Utilisateur : le propriétaire du fichier.
  • Groupe : les membres du groupe du fichier.
  • Autres : tous les autres utilisateurs.

Chaque groupe peut avoir :

  • r : lire le contenu du fichier, ou lister les noms dans un répertoire.
  • w : modifier un fichier, ou créer/supprimer/renommer des entrées dans un répertoire.
  • x : exécuter un fichier, ou traverser un répertoire.

La permission d'exécution sur un répertoire est importante. Sans x sur un répertoire, vous ne pouvez pas y entrer ni accéder aux fichiers qu'il contient par leur nom, même si vous pouvez lister certaines métadonnées ailleurs.

Utiliser les modes symboliques pour de petits changements

La syntaxe symbolique ressemble à ceci :

chmod [qui][opérateur][permissions] chemin

qui peut être u pour utilisateur, g pour groupe, o pour autres, ou a pour tous. Les opérateurs sont + pour ajouter, - pour retirer, et = pour définir exactement.

Rendre un script exécutable pour le propriétaire :

chmod u+x deploy.sh

Permettre au groupe de modifier un fichier partagé :

chmod g+w shared_document.txt

Retirer l'accès en écriture au groupe et aux autres :

chmod go-w config.yml

Définir les autres en lecture seule, en remplaçant les permissions existantes pour les autres :

chmod o=r project_plan.txt

Les modes symboliques sont utiles car ils modifient uniquement les bits que vous nommez.

Utiliser les modes numériques pour des ensembles complets de permissions

Les modes numériques définissent les permissions de l'utilisateur, du groupe et des autres en une seule commande. Chaque permission a une valeur :

  • Lecture : 4
  • Écriture : 2
  • Exécution : 1

Additionnez les valeurs pour chaque groupe :

Mode Signification
7 rwx
6 rw-
5 r-x
4 r--
0 ---

Définir un fichier texte normal en lecture/écriture pour le propriétaire et lecture seule pour tous les autres :

chmod 644 important_file.txt

Définir un répertoire normal pour que le propriétaire puisse le gérer et que les autres puissent y entrer et le lire :

chmod 755 public_assets

Verrouiller une clé privée pour que seul le propriétaire puisse la lire et l'écrire :

chmod 600 private_key.pem

Évitez 777 sauf si vous êtes dans un environnement de test temporaire et comprenez le risque :

chmod 777 scratch

777 permet à tout utilisateur local de lire, écrire et exécuter ou traverser le chemin. Sur les systèmes partagés, cela est rarement acceptable.

Gérer les fichiers et répertoires différemment

Les fichiers et les répertoires nécessitent généralement des modes différents. Les fichiers utilisent souvent 644 ; les répertoires utilisent souvent 755. Si vous exécutez ceci aveuglément, vous rendez chaque fichier exécutable :

chmod -R 755 web_root/

Pour un répertoire web, un modèle plus sûr est :

find web_root -type d -exec chmod 755 {} +
find web_root -type f -exec chmod 644 {} +

Ajoutez ensuite la permission d'exécution uniquement aux scripts qui en ont réellement besoin :

chmod 755 web_root/scripts/deploy.sh

Utiliser les bits de permission spéciaux avec précaution

Les modes numériques peuvent inclure un quatrième chiffre en tête pour les bits spéciaux :

Valeur Nom Effet courant
4 SetUID Un exécutable s'exécute avec l'ID utilisateur effectif du propriétaire du fichier.
2 SetGID Un exécutable s'exécute avec l'ID de groupe effectif du groupe du fichier ; sur les répertoires, les nouvelles entrées héritent du groupe du répertoire.
1 Sticky bit Sur les répertoires, les utilisateurs ne peuvent supprimer que les fichiers qu'ils possèdent, que le propriétaire du répertoire possède, ou que root peut supprimer.

Définir le bit SetGID sur un répertoire de projet partagé pour que les nouveaux fichiers héritent du groupe du répertoire :

chmod 2770 shared_group_files

Définir le sticky bit sur un répertoire partagé accessible en écriture :

chmod 1777 /srv/shared-upload

L'exemple classique est /tmp, qui est accessible en écriture par tout le monde mais protégé par le sticky bit.

Soyez prudent avec SetUID et SetGID sur les exécutables. Ils peuvent créer un risque sérieux d'escalade de privilèges si le programme est accessible en écriture, mal conçu ou accepte des entrées non sécurisées. De nombreux systèmes de type Unix ignorent également SetUID sur les scripts pour des raisons de sécurité.

Vérifier le résultat

Après avoir modifié les permissions, vérifiez-les :

ls -ld web_root web_root/index.html

Utilisez stat lorsque vous voulez le mode numérique :

stat -c '%a %n' web_root/index.html

Sur macOS, le format de stat est différent :

stat -f '%Lp %N' web_root/index.html

À retenir

Utilisez chmod symbolique lorsque vous voulez ajouter ou retirer une permission. Utilisez chmod numérique lorsque vous voulez définir exactement le mode complet. Traitez les changements récursifs avec précaution, gardez les fichiers et répertoires séparés, et vérifiez avec ls -l ou stat avant de continuer.