Sécurité - Droits d'accès - GNU/Linux

baissaoui Messages postés 497 Date d'inscription jeudi 2 septembre 2021 Statut Webmaster Dernière intervention 22 mars 2024 - 23 juin 2022 à 15:24
Document initial créé par lami20j

Les droits d'accès


Préface

Le but de cet article n'est pas de vous apprendre quels droits vous devez positionner sur vos fichiers ou répertoires ni pourquoi.
L'utilisation de la gestion des utilisateurs, groupes ou autres ainsi que les permissions accordées, dépend de chaque configuration, de la stratégie mise en place par l'administrateur de votre système et aussi de vos besoins.
En revanche dans l'article vous trouverez une brève présentation des droits que le système GNU/Linux utilise ainsi que les commandes utilisées pour le faire.

Un grand merci à jipicy pour sa disponibilité et sa patience pour les corrections linguistiques ainsi que certaines d'ordre technique.

I. Généralités

Sous un système GNU/Linux tout est fichier, y compris les fichiers spéciaux qui désignent les périphériques. Linux divise les fichiers en plusieurs catégories :
  • les répertoires
  • les fichiers ordinaires (programmes, fichiers de configuration, fichiers de données, etc..)
  • les fichiers spéciaux (type bloc ou caractère)


Le système de fichier sous GNU/Linux est organisé dans une arborescence, n'ayant pas besoin de mentionner le nom du disque ou de la partition pour y avoir accès.

II. Les droits

Dans un système GNU/Linux, tout fichier se voit attribuer des droits pour 3 identités :
  • le propriétaire - c'est l'utilisateur qui a créé le fichier ou l'utilisateur que root a désigné comme propriétaire
  • le groupe (qui n'est pas forcément le groupe du propriétaire)
  • les autres (ceux qui ne font pas partie du groupe)


La commande ls -l nous permet d'afficher les droits d'un fichier sous GNU/Linux.

Pour chaque identité (voir plus haut), il existe 3 droits d'accès :
  • r - read (le droit de lecture)
  • w - write (le droit d'écriture)
  • x - execute (le droit d'exécution)


L'affichage des droits est représenté par une chaîne de 9 caractères, précédée d'un caractère, représentant le type de fichier.


Ces 9 caractères, regroupés 3 par 3 (rwx rwx rwx), définissent les droits des 3 identités (propriétaire, groupe et les autres).

Pour chaque droit existant on voit une lettre parmi r,w ou x (voir plus haut) et si un droit n'existe pas on utilise le tiret (à ne pas confondre avec le 1er tiret qui signifie - fichier régulier).
Signification  Symbol Propriétaire   Groupe Autres 
______________________________________________________________________
fichier régulier -
répertoire d
périphérique caractère c
périphérique bloc b r w x r w x r w x
lien symbolique l
tube nommé p
socket locale s
______________________________________________________________________


Exemple :

-rwxr-x---

Ce qui signifie :
  • qu'il s'agit d'un fichier régulier ( le 1er caractère est un tiret -)
  • que le propriétaire a tous les droits (ReadWriteExecute donc LireEcrireExécuter)
  • que les membres du groupe ont les droits de Lire (le 1er caractère est r) et d'Exécuter (le 3ème caractère est x), en revanche ils n'ont pas le droit d'Ecrire (le 2ème caractère est un tiret -)
  • que les autres n'ont aucun droit, ni de lecture, ni d'écriture, ni d'exécution (les 3 caractères sont des tirets -)

III. Les droits spéciaux

1. Le Sticky bit

Le Sticky bit est un droit spécial dont le comportement est différent pour les fichiers exécutables et les répertoires.
Il correspond à la lettre t ou numériquement à 1000.
Si les droits d'exécution ne sont pas positionnés c'est la lettre T qui correspond.
  • les fichiers exécutables - le programme restera en mémoire pour une exécution ultérieure
  • les répertoires - si le sticky bit est positionné sur un répertoire, seul le propriétaire pourra supprimer ses fichiers (c'est le cas des répertoires /tmp et /var/tmp sous GNU/Linux)


Exemple :
$ ls -l / | grep tmp;ls -l /var | grep tmp 
drwxrwxrwt 12 root root 1024 2006-07-22 14:18 tmp
drwxrwxrwt 4 root root 4096 2006-07-22 10:23 tmp
C'est l'affichage des droits pour /tmp et /var/tmp.
Nous remarquons que le dernier caractère dans la suite des 9 pour les droits est un t et pas un x ou un tiret.

2. Les droits d'endossement

SetUID et SetGID

Les droits d'endossement dans GNU/Linux sont représentés par :
  • la lettre s (si le droit x est positionné)
  • la lettre S (si le droit x n'est pas positionné)


Numériquement, les droits d'endossement sont représentés de la façon suivante :
  • 4000 - pour l'endossement de l'identité du propriétaire
  • 2000 - pour l'endossement de l'identité du groupe


Le comportement des droits d'endossement.
  • Pour les fichiers programme ou exécutable
    • SUID = 4000 - le processus a les droits du propriétaire du programme exécuté
    • SGID = 2000 - le processus a les droits du groupe du programme exécuté
  • Pour les répertoires
    • SGID = 2000 - les fichiers qui se trouvent dans le répertoire appartiennent au groupe du répertoire


Les droits d'endossement sont très importants pour la sécurité.


Au lieu de donner l'accès à un fichier, on donne le droit d'accès à une commande.
Le kernel (ou noyau), au moment de l'exécution de la commande endosse l'identité du propriétaire ou du groupe de la commande au lieu de celle de l'utilisateur qui a lancé la commande.
Donc l'accès au fichier se fait par le biais de la commande et non pas directement.

Quand un utilisateur se connecte sur un système GNU/Linux, il détient 2 UID (UserIDentity) et 2 GID (GroupIDentity) : le réel et l'effectif.
  • Au moment de l'exécution d'une commande les UID et GID sont les réels,les effectifs sont attribués à la commande.
  • Quand les droits d'endossement ne sont pas positionnés, alors les UID et GID effectifs sont identiques aux UID et GID réels.
  • Si les droits d'endossement sont positionnés alors l'UID et/ou GID effectifs sont ceux de la commande. Ce qui veut dire que les UID et GID effectifs sont ceux qui contrôlent les droits d'accès à une commande



Pour connaître les fichiers avec les droits d'endossement de votre système tapez dans un terminal la commande suivante :
# find / -perm -2000 -o -perm -4000 -exec ls -l {} \; 2>/dev/null
Un bon exemple c'est la commande crontab. Cette commande crée un fichier dans /var/spool/cron/crontabs pour l'utilisateur qui a exécuté la commande crontab. L'accès au répertoire /var/spool/cront/crontabs est interdit aux utilisateurs sauf root.
$ cd /var/spool/cron/crontabs/ 
bash: cd: /var/spool/cron/crontabs/: Permission non accordée
Quand l'utilisateur lance la commande crontab -e (pour éditer son fichier /var/spool/cron/crontabs/nom_user), la commande s'exécute avec l'UID et GID réel de l'utilisateur mais avec l'UID et GID effectif de root.
$ ls -l /usr/bin/crontab 
-rwxr-sr-x 1 root crontab 26872 2004-07-28 22:44 /usr/bin/crontab
On voit que la commande crontab est la propriété de root et qu'elle fait partie du groupe crontab avec le droit SGID.

Et comme root a le droit de créer dans /var/spool/cron/crontabs le fichier sera créé.
# ls -l /var/spool/cron/crontabs/lami20j 
-rw------- 1 lami20j crontab 225 2006-07-22 16:00 /var/spool/cron/crontabs/lami20j
On voit que l'utilisateur lami20j est le propriétaire du fichier et qu'il a les droits de lecture et d'écriture. Cependant il ne peut pas le faire directement.

IV. Les commandes

1. chmod

La commande chmod (CHangeMODe) permet de définir et de changer les droits d'accès d'un fichier ou un ensemble de fichiers.
Parmi les options de la commande chmod (qui ne sont pas nombreuses - voir man chmod) je vais en citer seulement deux :
  • v pour verbose (affichage sur la sortie standard STDOUT du résultat de la commande)
  • R traiter les répertoires de façon récursive (application de la commande à l'arborescence entière du répertoire en question)


Il y a deux modes d'utilisation de la commande chmod :
  • de façon littérale
  • de façon numérique



La façon littérale

Si vous avez lu attentivement jusqu'ici, alors vous devriez deviner la façon littérale.
Il s'agit de l'utilisation des lettres qui vous sont déjà connues r, w et x pour spécifier les droits voulus.
La nouveauté c'est qu'on va utiliser aussi des lettres pour designer les identités dont nous avons parlé plus haut : le propriétaire, le groupe et les autres.

chmod utilise la notation suivante :
  • u - pour le propriétaire (user)
  • g - pour le groupe (group)
  • o - pour les autres (other)
  • a - pour tous (all)


Une autre notation sera utilisée pour attribuer et/ou retirer des droits.
  • + (plus) pour attribuer
  • - (moins) pour retirer
  • = (égale) pour fixer l'accès exact


Voilà un petit schéma de construction pour chmod
 Identité Opérateur Type accès 
_____________________________________
u + r
chmod g - w
o = x
a
_____________________________________
Nous ne pouvons pas imaginer toutes les combinaisons possibles, même si ça vous semble réalisable vu le nombre peu important des opérateurs

et des droits. Ce qui complique les choses c'est plutôt le nombre d'utilisateurs, le nombre de fichiers et leur répartition sur le(s)

disque(s) et les partitions dont on ne connaît pas non plus le nombre, etc.

En revanche quelques règles vous aideront si jamais vous utilisiez la commande chmod.
  • plusieurs identités et types d'accès peuvent être utilisés.

Ex: chmod go-wx fichier pour les membres du groupe (g) et les autres (o) on retire (-) les droits d'écriture (r) et d'exécution (x).
  • plusieurs ensembles d'opérateurs et types d'accès peuvent être utilisés.
    • Ex : chmod o+r-w fichier on attribue le droit de lecture (r) mais on retire le droit d'écriture (w) pour les autres (o).
  • les chaînes peuvent être combinées en les séparant par des virgules.
    • Ex : chmod u+x,og-w fichier on attribue (+) le droit d'exécution (x) pour le propriétaire (u) et on retire (-) les droits d'écriture (r) pour les membres du groupe (g) et les autres (o). Attention! Il n'y a aucun espace entre les chaînes séparées par les virgules.
    • pour appliquer la commande chmod à un répertoire et son contenu (sous-répertoires, fichiers) on utilise la commande chmod -R droits Répertoire



Astuces :
  • lorsque l'identité est omise, c'est la valeur a (tous) qui sera utilisée
    • chmod -R +w repertoire
  • le type d'accès peut être omis si le signe égal (=) est utilisé pour supprimer tous les accès
    • chmod o= fichier


La façon numérique
   Propriétaire        Groupe        Autres 
__________________________________________________________________
LectureEcritureExe LectureEcritureExe LectureEcritureExe
__________________________________________________________________
400 200 100 40 20 10 4 2 1
Pour comprendre l'utilisation de chmod avec la façon numérique un exemple sera beaucoup plus parlant.

Exemple : nous voulons établir pour un fichier les droits suivants :

- propriétaire

lecture + ecriture + exécution = 400 + 200 +100 = 700

- groupe
lecture + exécution = 40 + 10 = 50
- les autres
lecture + exécution = 4 + 1 = 5
Au total ça donne 700 + 50 + 5 = 755

Maintenant nous allons utiliser le résultat obtenu avec chmod.
chmod -v 0755 fichier
ou
chmod 0755 fichier
mais dans ce cas le résultat de la commande n'est pas affiché sur la sortie standard

On peut écrire tout simplement chmod 755 fichier

Voici un petit assistant pour calculer les droits en octal

fr.selfhtml.org/petitsassistants/chmod.htm

En bref, le principe n'est pas compliqué. On établit les droits voulus pour chaque identité et on fait l'addition. Pour le reste chmod s'en charge.

Maintenant que nous avons vu la façon numérique d'utiliser la commande chmod, je suppose que vous avez peut être trouvé la réponse pour une question qui peut être vous a traversé l'esprit.

Il s'agit de l'attribution des droits d'endossement.

SUID SGID Sticky bit
__________________________
4000 2000 1000
__________________________
Pour ajouter un droit d'endossement, outre les droits habituels, vous insérer dans le calcul le ou les droits d'endossement que vous auriez besoin.

Prenons le cas précédent 700 + 50 + 5 = 755.
Pour ajouter le droit d'endossement du group on écrit 2000 + 700 + 50 + 5 = 2755

Rappel! Il s'agit des droits pour une commande, ce qui veut dire que le droit d'exécution doit être positionné.

A ce que je sache il n'y a pas moyen de revenir aux droits précédents une fois la commande exécutée. Si vous en connaissez un, ce serait sympa de m'en faire part.

Une idée saugrenus serait d'enregistrer d'abord les droits existants dans un fichier avec ls -l ou ls -Rl et ensuite de créer un script pour parser ce fichier, mais ça compliquerait les choses et à vrai dire je n'ai jamais eu le besoin de le faire.

Une autre idée, tout aussi saugrenue, serait de sauvegarder avec tar pour ensuite, au cas où vous vous perdriez dans les droits, revenir à la configuration d'origine.

En conséquence avant de modifier les droits sur un fichier ou une arborescence jetez d'abord un coup d'oeil aux droits déjà existants.

2. umask

La commande umask permet de définir les droits par défaut d'un fichier ou répertoire à sa création. Autrement dit elle indique les droits qu'il faut retirer lors de leur création.

La commande umask, à l'instar de la commande chmod (façon numérique) prend en argument 3 chiffres, qui cette fois représentent les droits que nous ne voulons pas accorder.

$ umask 0022 fichier


A savoir que la durée de vie de la commande umask est limité à la session shell en cours.
Pour une durée permanente voir les fichiers de configuration de votre shell. Pour le shell bash on peut utiliser le fichier ~/.bashrc

Personnellement je n'ai utilisé la commande umask que pour de petits tests dans un unique but de compréhension de la commande chmod.

chown

Pour changer le propriétaire d'un fichier il faut utiliser la commande : chown usager fichier

chgrp

Pour changer le groupe d'un fichier : chgrp groupe fichier


La compréhension des droits pour les fichiers dans un système GNU/Linux est fortement liée à la gestion des utilisateurs et groupes.



Outre les droits que nous avons vus plus haut, dans un système GNU/Linux on trouve aussi les ACLs (Access Control List) qui permettent d'accorder des droits supplémentaires, que nous détaillerons dans un autre thread. Le voici securite les access control lists acls