Page 1 sur 1

[tuto][linux][débutant] Les droits d'accès aux fichiers

Publié : 12 décembre 2023, 10:20
par N4T0R4
Notion de droits

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
Ici n'ont été reproduites que les informations intéressantes affichées par la commande (certaines ont été effacées). Sont affichés : la liste des droits puis le nom du propriétaire de chaque fichier, le nom du groupe d'utilisateurs auquel appartient de propriétaire des fichier et enfin le nom du fichier.

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...
Dans l'exemple ci-dessus, le propriétaire du fichier file.txt dispose des droits de lecture et d'écriture. Tandit que le groupe staff ainsi que les autres ne disposent que du droit de lecture.

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
Les droits globaux d'un fichier sont identifiés par l'association de 3 triplets de droits. Ce qui nous fait 83=512 combinaisons différentes. Le tableau suivant regroupe quelques unes de ces combinaisons possibles.

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.
Changement des droits (chmod)

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>
On peut utiliser cette commande de deux façons différentes pour les mêmes résultats. On choisit soit la notation symbolique soit la notation numérique.

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
Comme le montre le tableau ci-dessous, la commande chmod lorsqu'elle est utilisée en notation symbolique ne permet de modifier les droits que pour une catégorie d'utilisateurs à la fois.

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.
Notation numérique

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>
Ainsi on remplace chacun des triplets par un nombre compris entre 0 et 7. Ce qui nous fait un nombre à trois chiffres en guise de notation numérique.

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
L'emploi de cette numérotion suppose de connaître ou de savoir retrouver aisément le nombre octal associé à chaque triplet. Ce qui est assez simple, puisque cette numérotation est la convertion en octal de la représentation binaire du triplet. Considérez la présence d'un droit comme un booléen valant 1 et son absence comme 0, vous obtenez alors un nombre binaire qu'il est aisé de convertir en octal (ce qui revient à du décimal car on ne passe pas aux dizaines dans la base 8).

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-----
Remarques importantes

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
D'après cet exemple, tout nouveau fichier aura les droits 740 (rwxr-----) car le masque de protection vaudra 037 (----wxrwx).

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.