Une grille, quatre notations
La grille de cases, l'octal à trois chiffres, l'octal à quatre chiffres, la chaîne symbolique et la ligne ls -l sont toutes des vues des neuf mêmes bits, et chacune se redessine à chaque frappe.
Transformez les cases lecture, écriture et exécution en un mode octal, une chaîne symbolique et une commande chmod, ou collez un mode que vous avez déjà pour voir, en termes simples, exactement qui il laisse entrer.
Mode 755, symbolique rwxr-xr-x, sur un fichier. chmod 755 script.sh. Aucun avertissement.
Chaque classe a son propre chiffre octal, et chaque chiffre n'est que la somme des cases cochées.
| Classe | Lecturer · 4 | Écriturew · 2 | Exécutionx · 1 | Chiffre |
|---|---|---|---|---|
| Propriétaireu · utilisateur | 4 + 2 + 17 | |||
| Groupeg · groupe | 4 + 15 | |||
| Autreso · autres | 4 + 15 |
Ouvrir le fichier et lire ses octets, ou le copier ailleurs.
Modifier ou tronquer le contenu. La suppression du fichier dépend en revanche de son répertoire.
Le lancer comme programme. Un script a aussi besoin de la lecture, car l'interpréteur doit l'ouvrir.
Ces trois bits se placent devant le mode, dans un chiffre que la plupart des gens n'écrivent jamais. Chacun change l'identité que prend un processus ou ce qu'autorise un répertoire ; lisez la note avant d'en activer un.
Le propriétaire peut lire le fichier, modifier le fichier et le lancer comme programme.
Un seul compte : l'identifiant utilisateur enregistré dans l'inode, et le premier des deux noms d'une ligne ls -l. Root contourne presque entièrement ces vérifications, si bien qu'un mode ne contraint jamais que les utilisateurs ordinaires.
Les membres du groupe peuvent lire le fichier et le lancer comme programme.
Tous les comptes du groupe du fichier, qui est le second nom d'une ligne ls -l. C'est l'appartenance au groupe qui permet à une équipe de partager l'accès en écriture sans l'ouvrir à toute la machine.
Tous les autres peuvent lire le fichier et le lancer comme programme.
Tous ceux que les deux premières classes n'ont pas couverts : les autres sessions, et tous les comptes de démons comme www-data ou nobody. C'est dans cette classe qu'atterrissent les attaquants.
Aucun bit d'écriture pour tous, aucun bit spécial inopérant. Cela ne veut pas dire que le mode est correct : il doit encore correspondre à l'usage de ce fichier.
Un seul chmod récursif donne le même mode aux répertoires et aux documents : soit les fichiers deviennent exécutables, soit on ne peut plus entrer dans les répertoires. Séparez l'opération en deux et chaque type obtient ce dont il a besoin.
find script.sh -type d -exec chmod 755 {} +find script.sh -type f -exec chmod 644 {} +Un umask soustrait. Le noyau propose 666 à un nouveau fichier et 777 à un nouveau répertoire, puis efface chaque bit désigné par le masque.
Avec le 022 habituel, c'est pour cela qu'un fichier que vous venez de créer arrive en 644 et non en 666 : le masque a retiré les bits d'écriture du groupe et des autres avant même que vous le voyiez. Rien ici ne modifie votre shell ; c'est un calcul sur la valeur saisie.
Générez les identifiants qui ont leur place dans un fichier 600, avec une entropie que vous pouvez vraiment justifier.
Vérifiez un binaire téléchargé avec sa somme de contrôle publiée avant de lui donner un bit d'exécution.
Lisez les horodatages epoch des lignes de journal et des métadonnées de fichier qui accompagnent ces modes.
Unix enregistre les permissions sous forme de neuf bits : lecture, écriture et exécution, répétés pour le propriétaire, le groupe et tous les autres. Regroupez ces bits par trois et chaque triplet tient dans un seul chiffre octal de 0 à 7, ce qui est la seule raison pour laquelle chmod accepte des nombres comme 755 plutôt qu'une phrase. Le noyau vérifie les classes dans l'ordre (le propriétaire d'abord, puis le groupe, puis les autres) et s'arrête à la première qui vous correspond : un mode généreux envers les autres ne peut donc pas sauver un propriétaire à qui l'accès a été refusé.
Les trois mêmes bits n'ont pas le même sens dans les deux cas. Basculez d'abord l'interrupteur et toutes les explications de la page suivent : exécuter ne signifie plus lancer, mais entrer.
Activez lecture, écriture et exécution pour le propriétaire, le groupe et les autres. Vous avez déjà un mode sous les yeux ? Collez 0644 ou les dix caractères d'un listage ls -l dans le champ inverse et la grille se remplit toute seule.
Indiquez la vraie cible, puis copiez la commande octale, la forme par affectation pour les scripts, ou la paire de commandes find qui donne des modes différents aux répertoires et aux documents en une seule passe.
La grille de cases, l'octal à trois chiffres, l'octal à quatre chiffres, la chaîne symbolique et la ligne ls -l sont toutes des vues des neuf mêmes bits, et chacune se redessine à chaque frappe.
Collez 700, 0755, rwxrwxr-x ou drwxr-xr-x. La forme de listage à dix caractères règle même l'interrupteur fichier ou répertoire d'après sa première lettre, et toute saisie illisible est signalée au lieu d'être ignorée en silence.
La lecture liste les noms, l'écriture ajoute et supprime des entrées, l'exécution laisse passer une recherche de chemin. Ces phrases sont générées à partir de votre mode, pas tirées d'un tableau figé.
setuid, setgid et sticky ont chacun leur propre bouton et leur propre explication, y compris les cas que le noyau ignore complètement : setuid sur un script shell, sticky sur un fichier ordinaire.
Écriture pour tous, un bit setuid sur un fichier que personne ne peut exécuter, un script exécutable mais pas lisible : chaque cas est signalé dans sa propre couleur, avec la raison plutôt qu'un sermon.
L'octal, la forme par affectation u=rwx,g=rx,o=rx et les deux commandes find pour une arborescence mixte, avec le chemin cible que vous avez saisi déjà en place. Tout est généré dans votre navigateur.
Chaque chiffre correspond à une classe : le propriétaire, puis le groupe, puis les autres. Dans un chiffre, la lecture vaut 4, l'écriture 2 et l'exécution 1 : 7 vaut donc 4+2+1 (lecture, écriture, exécution), 5 vaut 4+1 (lecture et exécution) et 0 ne donne rien. 755 permet donc tout au propriétaire, tandis que le groupe et tous les autres peuvent lire et exécuter, mais pas modifier. C'est le mode habituel d'un programme et de presque tous les répertoires d'un système.
Uniquement le bit d'exécution. 644 donne au propriétaire la lecture et l'écriture, et la lecture à tous les autres ; 755 ajoute l'exécution pour les trois classes. Les fichiers de données veulent 644 ; un bit d'exécution sur un PDF ou une photo ne fait que semer la confusion. Les programmes, les scripts shell et tous les répertoires veulent 755, car on ne peut pas entrer dans un répertoire sans exécution, même si l'on peut le lister.
Il accorde l'écriture à tous les comptes de la machine, y compris les comptes de service qu'un attaquant atteint en premier. Un serveur web tournant sous www-data qui peut réécrire l'application qu'il sert transforme une petite faille d'import de fichiers en exécution de code arbitraire. Recourir à 777 signifie aussi que la vraie cause (généralement le mauvais propriétaire ou le mauvais groupe) n'est jamais trouvée, si bien que l'exposition demeure longtemps après que l'erreur d'origine a été oubliée. Corrigez la propriété avec chown et accordez le mode le plus restreint qui fonctionne.
Seulement pour définir setuid (4000), setgid (2000) ou le sticky bit (1000). Écrire 755 ou 0755 revient au même, car un chiffre initial absent vaut zéro. C'est en retirant ces bits que la surprise arrive : GNU chmod laisse volontairement intacts le setuid et le setgid d'un répertoire si vous ne les nommez pas, donc sous Linux ni chmod 755 ni chmod 0755 ne retirent le setgid d'un répertoire ; il faut chmod g-s, chmod =755 ou le chmod 00755 à cinq chiffres. Le chmod de BSD, macOS compris, les retire au contraire avec un simple mode à trois chiffres. Sur un fichier ordinaire, toutes les versions les retirent.
Cela signifie que le bit spécial est activé mais pas le bit d'exécution correspondant, si bien que le bit spécial ne peut pas agir. rwSr--r-- est un fichier setuid que le propriétaire ne peut pas exécuter ; drwxrwxrwT est un répertoire sticky sans exécution pour les autres. Un s ou un t minuscule signifie que les deux bits sont activés et que le comportement est effectif. Une majuscule signifie généralement que le bit d'exécution a été retiré après l'activation du bit spécial, ou qu'un mode à quatre chiffres a été saisi sans le x correspondant ; dans les deux cas, le mode ne fait pas ce qu'il semble faire.
Parce que supprimer n'est pas une opération sur le fichier, mais sur le répertoire qui contient le nom. L'écriture plus l'exécution sur le répertoire suffisent pour délier n'importe quelle entrée qu'il contient, quoi qu'en dise le fichier lui-même. C'est précisément la brèche que referme le sticky bit : dans un répertoire 1777 comme /tmp, seul le propriétaire d'une entrée, le propriétaire du répertoire ou root peut la supprimer.
Il accorde la traversée : le droit de résoudre un nom à l'intérieur et d'atteindre tout ce qui se trouve plus bas. La lecture et l'exécution sont indépendantes : la lecture sans l'exécution vous permet de lister les noms sans pouvoir les utiliser, donc ls fonctionne mais l'ouverture de n'importe quel résultat échoue. L'exécution sans la lecture est l'inverse, et c'est une vraie technique : le mode 711 sur un répertoire personnel permet à un serveur web d'atteindre public_html sans laisser quiconque lister le reste de son contenu. Chaque répertoire d'un chemin a besoin de l'exécution, sinon la recherche échoue à ce niveau.
chmod définit un mode directement ; umask ne fait que retirer des bits, et seulement au moment où quelque chose est créé. Le noyau propose 666 pour un nouveau fichier et 777 pour un nouveau répertoire, puis efface chaque bit désigné par le masque : c'est pourquoi le umask courant de 022 produit des fichiers 644 et des répertoires 755, et pourquoi les nouveaux fichiers ne sont jamais exécutables. C'est un réglage propre à chaque processus : le modifier dans un shell affecte ce shell et ses processus enfants, et rien de ce qui existe déjà.
Découvrez une collection grandissante pour les calculs, les documents, la rédaction et le travail de tous les jours.