Les droits d'accès aux fichiers (appelés encore modes ou permissions) sont un point essentiel du système Unix. Ils permettent de définir des droits différents sur un même fichier selon la catégorie d'utilisateurs.
Ainsi les manipulations de fichiers sont restreintes selon les droits alloués à chaque fichier. A chaque catégorie d'utilisateur correspond des droits spécifiques sur un fichier.
Affichage des droits
Pour afficher à l'écran les droits alloués à un fichier, il faut utiliser la commande ls -l qui permet de lister les fichiers d'un répertoire avec toutes les informations connexes possibles dont les droits du fichier.
Exemple :
Code : Tout sélectionner
ls -l
-rw-r--r-- user group astuces.txt
drwxr-xr-x user group data
-rw-r--r-- user group lettre.doc
-rw------- user group Mail
En préfixe des droits est affiché le type du fichier (d pour les répertoires et - pour les fichiers normaux et les exécutables).
On peut voir dans cet exemple que tous les fichiers sont du même propriétaire dont le nom est user. Ce propriétaire faisant partie du groupe appelé group. Vous apprendrez par la suite la significations des lettres r, w et x.
Droits d'accès aux fichiers
Les droits d'accès d'un fichier sont au nombre de trois :
Lecture
L'accès en lecture autorise la lecture du fichier, c'est-à-dire qu'il est possible d'éditer ce fichier avec une application quelconque pour en voir le contenu. Cet accès est désigné par la lettre r (read).
Alloué à un répertoire, ce droit permet de lister les fichiers qu'il contient.
Ecriture
L'accès en écriture permet de modifier un fichier et de le supprimer. Il est désigné par la lettre w (write).
Alloué à un répertoire, il autorise la modification et la suppression des fichiers qu'il contient quelques soient les droits d'accès des fichiers de ce répertoire (mêmes s'ils ne possèdent pas eux-même le droit en écriture). Donc attention!
Exécution
L'accès en exécution permet à un fichier exécutable d'être lancé et à un répertoire d'être ouvert. Il est désigné par la lettre x (execute).
Pour qu'un programme puisse être exécuté, il est indispensable que le droit en exécution sur ce fichier soit autorisé pour l'utilisateur qui souhaite le lancer.
Quant à un répertoire, il est tout aussi indispensable que son droit en exécution soit autorisé pour qu'on puisse accèder aux fichiers qu'il contient.
Ce droit en exécution est sans effet lorsqu'il est affecté à un fichier qui n'est pas un exécutable.
Catégories d'utilisateurs
A un fichier on affecte les droits correspondants à trois catégories d'utilisateurs : les droits du propriétaire du fichier, les permissions du groupe d'utilisateurs auquel appartient le propriétaire et celles concédées à tous les autres.
Propriétaire
Le propriétaire d'un fichier est la personne qui le crée. Il est désigné par la lettre u (owner).
Le UID désigne par un identificateur numérique unique le propriétaire d'un fichier.
Groupe
Un groupe d'utilisateur est un ensemble d'utilisateurs privilégiés ayant en général des permissions moindre que le propriétaire d'un fichier mais plus grandes que la catégorie qui suit. Cette catégorie est désignée par la lettre g (group).
Le GID désigne par un identificateur numérique unique le groupe auquel appartient le propriétaire d'un fichier.
Autres
Cette catégorie regroupe tous les utilisateurs qui ne sont ni le propriétaire d'un fichier ni faisant partir du même groupe que le propriétaire. On les désignent par la lettre a (other).
Identification des droits
A chaque catégorie d'utilisateur on associe un triplet de droits : lecture, écriture et exécution. Au total 9 droits (3*3) sont affectés à chaque fichier.
Lorsqu'un droit est alloué, on voit la lettre correspondante (r, w ou x). Si le droit est refusé, on voit un tiret (-).
r = lecture (read), w = écriture (write), x = exécute (execute)
Exemple :
Code : Tout sélectionner
$ ls -l /home/user/work/
drwxr-xr-x 4 user staff 1024 2023-04-04 09:40 todo
-rw-r--r-- 1 user staff 767392 2023-04-04 14:28 file.txt
^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
|| | | | | | | | | |
|| | | | Propriétaire Groupe Taille Date Heure Nom
|| | | Nombre de fichiers ou dossiers que le dossier listé contient
|| | |
|| | Permissions pour tous (r--)
|| Permissions pour les membres du groupe staff (r--)
|Permissions pour le propriétaire (rw-)
Type de fichier * : - = Fichier régulier, d = Dossier, l = Lien symbolique ou autre...
Combinaisons des droits
A chacune des 3 catégories d'utilisateur, on associe d'une des 8 combinaisons différentes possibles pour l'allocation des droits que le tableau ci-dessous récapitule.
Code : Tout sélectionner
Triplet Droits correspondants
--- aucun
--x exécution
-w- écriture
-wx écriture et exécution
r-- lecture
r-x lecture et exécution
rw- lecture et écriture
rwx lecture, écriture et exécution
Code : Tout sélectionner
Droits globaux Description
rwxr-xr-x Le propriétaire a tous les droits, et le groupe ainsi que les autres n'ont pas accès en écriture.
rwxr--r-- Le propriétaire a tous les droits, et le groupe ainsi que les autres n'ont accès qu'en lecture.
rwxr-x--- Le propriétaire a tous les droits, le groupe possède les droits de lecture et d'exécution alors que les autres n'ont aucun droit.
rwx------ Le propriétaire a tous les droits mais le groupe et les autres aucun.
rw-r--r-- Le propriétaire possède les droits de lecture, écriture mais pas exécution. Et le groupe et les autres ont le droit en lecture.
rw-rw---- Le propriétaire et le groupe ont le droit en lecture et écriture mais les autres n'ont aucun droit.
Il est offert au propriétaire d'un fichier (et seulement à lui seul) de modifier les droits du fichier. C'est-à-dire qu'il peut supprimer des droits ou bien en rajouter de nouveaux à chacune des trois catégories d'utilisateur.
Pour cela, on utilise la commande chmod (change mode) selon la syntaxe suivante :
Code : Tout sélectionner
chmod <droits> <fichier>
Notation symbolique
Pour affecter à chaque catégorie les droits voulus, on peut utiliser une notation symbolique selon la syntaxe :
chmod catégorie+opération+liste-des-droits <fichier>
Où les termes catégorie, opération et liste des droits doivent êtres respectivement remplacés par leur notation décrite dans les tableaux suivants.
Code : Tout sélectionner
Catégorie Description
u propriétaire
g groupe
a autres
Code : Tout sélectionner
Opération Description
+ ajouter
- retirer
= définir
Code : Tout sélectionner
Droit Description
r lecture
w écriture
x exécution
On peut retirer, ajouter ou définir un ou plusieurs droits en même temps.
Code : Tout sélectionner
Exemple Description
chmod g=rwx temps.txt Alloue au groupe tous les droits.
chmod g-w temps.txt Retire au groupe le droit d'écriture.
chmod a-rwx temps.txt Retire aux autres tous les droits.
chmod u=rw temps.txt Alloue au propriétaire les droits en lecture et en écriture.
chmod a+r temps.txt Rajoute aux autres le droit en lecture.
L'avantage de la notation numérique sur la précédente est de permettre sur un fichier la définition absolue des droits de toutes les catégories en même temps selon la syntaxe :
Code : Tout sélectionner
chmod <serie-de-3-chiffres> <fichier>
Le tableau ci-après permet de faire la convertion entre les différentes triplets possibles et leur notation octale (nombre en base 8).
Code : Tout sélectionner
Triplet Nombre binaire Nombre octal
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
Code : Tout sélectionner
Exemple Droits globaux associés
chmod 640 temps.txt rw-r-----
chmod 700 temps.txt rwx------
chmod 661 temps.txt rw-rw-r--
chmod 761 temps.txt rwxrw-r--
chmod 610 temps.txt rw-r-----
Exécutable
Un programme ne peut être exécuté que si le fichier exécutable coorespondant possède le droit d'exécution dans la catégorie à laquelle appartient l'utilisateur.
Répertoire
On ne peut accèder à un fichier que si les répertoires successifs constitutifs du chemin absolu de ce fichier possèdent le droit en exécution.
Pour pouvoir lister les fichiers d'un répertoire, ce dernier doit être accessible en lecture.
Fichier
Le droit en exécution n'a aucune incidence sur un fichier non exécutable.
Par contre, un script (c'est-à-dire un fichier texte contenant des commandes du Shell) doit avoir les droits en lecture et en exécution pour pouvoir être interprété et exécuté par le Shell.
Masque de protection des fichiers (umask)
Le masque de protection de fichier permet de définir les droits par défaut de tout fichier créé.
Manipulation
Ce masque se comporte comme un filtre et utilise la notation numérique. On parle de filtre car il ne contient pas la série des 3 chiffres octaux correspondants aux droits à allouer aux fichiers, mais celle correspondant aux droits à ne pas allouer.
Le système Unix affecte à un fichier les droits globaux résultant de la soustraction des droits maxima 777 par le masque de protection.
Exemple : si le masque de protection vaut 037 alors 740 (=777-037) seront les droits alloués à tout nouveau fichier.
La commande permettant de définir un nouveau masque de protection est umask.
Syntaxe : umask <droits>
Exemple : umask 037
Code : Tout sélectionner
777 = rwx rwx rwx = 111 111 111
- 037 = --- -wx rwx = 000 011 111
= 740 = rwx r-- --- = 111 100 000
Pour connaître la valeur du masque de protection, tapez umask sans attribut.
Remarque
Lors de la création d'un fichier, même si le masque de protection spécifie le droit en exécution, ce dernier ne sera pas affecté au fichier nouvellement créé mais seulement à un répertoire. Donc, si vous créez un fichier exécutable ou un script il faudra lui rajouter manuellement le droit en exécution.
Droits étendus
SUID
Définition
Nous avons vu plus haut que chaque catégorie d'utlisateurs dispose de droits différenciés sur les fichiers. Et seul le propriétaire d'un fichier a le pouvoir de céder des droits à d'autres utilisateurs.
Lorsqu'un utilisateur lance un programme, ce programme s'approprie les droits de l'utilisateur pour la manipulation des fichiers et non pas ceux du propriétaire du fichier (sinon quel souk!).
Mais il est quelque fois nécessaire de permettre à d'autres utilisateurs l'accès à des données normalement protégées. Ce droit SUID permet de préter à un utilisateur de façon temporaire, des droits suplémentaires par l'intermédiaire d'un programme (fichier exécutable).
En exécutant un programme possédant un droit SUID, un utilisateur s'appropie les droits du propriétaire du fichier exécutable durant le temps d'exécution du programme. Ces droits supplémentaires ne sont valables que sur les fichiers appelés par le programme et les opérations effectuées par le programme et que durant le temps d'exécution du programme.
Son utilité vient du fait qu'il n'est pas besoin d'accorder durablement des droits étendus à n'importe qui sur des fichiers sensibles. Puisque l'accès à ces fichiers est filtré par un programme qui est seul à prendre des initiatives sur ces fichiers.
Exemple
L'exemple le plus flagrant est celui du programme /usr/bin/passwd (rws--x--x) qui appartient à l'utilisateur root. Ce programme possède le droit s en lieu et place du droit en exécution du triplet du propriétaire. Ce programme sert à modifier votre mot de passe personnel qui est stocké dans le fichier /etc/passwd (rw-r--r--) appartenant à root dont vous n'avez pas les droits en écriture.
Comment donc modifier votre mot de passe si vous n'êtes pas autorisé à écrire sur le fichier stockant les mots passes ?!! Pour des raisons de sécurité évidentes, le root interdit à quiconque de pouvoir modifier ou supprimer ce fichier. Par contre le programme /usr/bin/passwd vous y autorise grace au droit SUID : vous utilisez le droit en écriture du root durant l'exécution du programme qui change votre mot de passe.
Manipulation
Pour ajouter un droit SUID à un programme, utiliser la commande chmod de la même manière que vous procéderiez pour un droit normal.
Notation symbolique
Syntaxe : chmod u+s fichier-exécutable.
Exemple : chmod u+s data/hotprog.
Notation numérique
La valeur numérique d'un SIUD est 4000 et s'ajoute à la valeur de la série numérique globale.
Syntaxe : chmod 4+droits fichier-exécutable.
Exemple : chmod 4755 monprog.
Dans cet exemple on donne les droits rwsr-xr-x au fichier monprog. Ne pas oublier que le droit SUID s'affiche à la place du droit en exécution du propriétaire sans que ce dernier soit supprimé!
Nota : la présence du droit SUID suppose la présence du droit en exécution qui permet de lancer le fichier exécutable.
SGID
Le droit SGID fonctionne différemment selon qu'il est affecté à un fichier exécutable ou à un répertoire.
Exécutable
Sur un fichier exécutable, le SGID est similaire au droit SUID vu précédemment sauf qu'il donne à un utilisateur les droits du groupe auquel appartient le propriétaire de l'exécutable et non plus les droits du propriétaire.
Répertoire
Tout fichier créé porte les droits du masque de protection de son propriétaire. De plus, tout fichier porte un UID (identificateur de propriétaire) et un GID (identificateur de groupe). C'est-à-dire qu'un fichier est toujours identifié par le nom de son propriétaire ainsi que par le nom du groupe auquel appartient le propriétaire.
Le droit SGID, lorsqu'il est affecté à un répertoire, casse cette logique. Puisque tout nouveau fichier créé dans un répertoire marqué par le SGID sera de groupe non pas celui du propriétaire du fichier mais celui du propriétaire du répertoire.
Ainsi, tout fichier créé dans un répertoire portant le SGID, héritera du groupe du propriétaire du répertoire.
Manipulation
La valeur numérique du droit SGID est 2000, il est symbolisé par la lettre s et est affiché à la place du droit d'exécution du groupe.
Notation symbolique
Syntaxe : chmod g+s fichier-exécutable|répertoire.
Exemple : chmod g+s data/.
Notation numérique
Syntaxe : chmod 2+droits fichier-exécutable|répertoire.
Exemple : chmod 2755 monprog.
Dans cet exemple on donne les droits rwxr-sr-x au fichier monprog. Ne pas oublier que le droit GUID s'affiche à la place du droit en exécution du groupe sans que ce dernier soit supprimé!
Sticky Bit
Le droit Sticky Bit (appellé aussi bit collant) est alloué à la catégorie autres d'un répertoire.
Il permet d'interdire à tout utilisateur (sauf le root) de supprimer un fichier dont il n'est pas le propriétaire, quelque soient ses droits.
Si le répertoire en question est accessible en écriture par n'importe quel utilisateur (rwxrwxrwx), n'importe qui peut poser ce bit collant qui protège tous les fichiers d'une suppression ou modification de la part d'un utilisateur autre que son propriétaire.
Ce bit collant permet donc d'aller à l'encontre du droit en écriture d'un répertoire dont héritent les fichiers du répertoire.
Sa valeur numérique est 1000 et est représenté symboliquement par t.
Exemple : chmod 1755 tmp/.
Exemple : chmod a+t tmp/.
Ce droit s'affiche en lieu et place du droit en exécution de la catégorie autres.