Sécurité - Droits d'accès - GNU/Linux
baissaoui
Messages postés
498
Date d'inscription
jeudi 2 septembre 2021
Statut
Webmaster
Dernière intervention
21 août 2024
-
23 juin 2022 à 15:24
Document initial créé par lami20j
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.
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.
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 :
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).
Exemple :
-rwxr-x---
Ce qui signifie :
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.
Exemple :
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.
Les droits d'endossement dans GNU/Linux sont représentés par :
Numériquement, les droits d'endossement sont représentés de la façon suivante :
Le comportement des droits d'endossement.
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.
Pour connaître les fichiers avec les droits d'endossement de votre système tapez dans un terminal la commande suivante :
Et comme root a le droit de créer dans /var/spool/cron/crontabs le fichier sera créé.
Parmi les options de la commande chmod (qui ne sont pas nombreuses - voir man chmod) je vais en citer seulement deux :
Il y a deux modes d'utilisation de la commande chmod :
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 :
Une autre notation sera utilisée pour attribuer et/ou retirer des droits.
Voilà un petit schéma de construction pour chmod
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.
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).
Astuces :
La façon numérique
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.
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.
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.
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
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 tmpC'est l'affichage des droits pour /tmp et /var/tmp.
drwxrwxrwt 12 root root 1024 2006-07-22 14:18 tmp
drwxrwxrwt 4 root root 4096 2006-07-22 10:23 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 SetGIDLes 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/nullUn 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/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.
bash: cd: /var/spool/cron/crontabs/: Permission non accordée
$ ls -l /usr/bin/crontabOn voit que la commande crontab est la propriété de root et qu'elle fait partie du groupe crontab avec le droit SGID.
-rwxr-sr-x 1 root crontab 26872 2004-07-28 22:44 /usr/bin/crontab
Et comme root a le droit de créer dans /var/spool/cron/crontabs le fichier sera créé.
# ls -l /var/spool/cron/crontabs/lami20jOn 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.
-rw------- 1 lami20j crontab 225 2006-07-22 16:00 /var/spool/cron/crontabs/lami20j
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èsNous ne pouvons pas imaginer toutes les combinaisons possibles, même si ça vous semble réalisable vu le nombre peu important des opérateurs
_____________________________________
u + r
chmod g - w
o = x
a
_____________________________________
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 AutresPour comprendre l'utilisation de chmod avec la façon numérique un exemple sera beaucoup plus parlant.
__________________________________________________________________
LectureEcritureExe LectureEcritureExe LectureEcritureExe
__________________________________________________________________
400 200 100 40 20 10 4 2 1
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.
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.
SUID SGID Sticky bit
__________________________
4000 2000 1000
__________________________
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 fichierchgrp
Pour changer le groupe d'un fichier : chgrp groupe fichierLa 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