{{tag>droits sécurité fichier administration }}
----
====== Gérer les droits d'accès (propriétés et permissions) des fichiers et répertoires ======
//Voir aussi [[droits]].//
Les systèmes d'exploitation inspirés d'Unix (dont Linux fait partie) possèdent la capacité de définir de façon poussée la gestion de droits d'accès aux divers fichiers de votre OS.
Les **droits d'accès** paramétrés sur les fichiers et répertoires ne sont pas immuables : ils peuvent être changés, afin d'accommoder des nouveaux besoins apparaissant au fil du temps d'utilisation de votre système Ubuntu. Le présent article explique les différentes manipulations pouvant être appliquées sur des fichiers et répertoires afin d'en changer les propriétaires et les permissions.
===== Les droits d'accès : qu'est-ce que c'est ? =====
Les droits d'accès définissent la possession d'un fichier ou d'un répertoire à un utilisateur et à un groupe d'utilisateurs. Ils gèrent aussi quelles actions les utilisateurs ont le droit d'effectuer sur les fichiers (lecture, écriture et exécution), selon qu'ils sont propriétaire du fichier, membre du groupe propriétaire du fichier ou ni l'un ni l'autre. La possession et la gestion des permissions associées s'effectue individuellement avec chaque fichier.
* Référez-vous au document explicatif « [[:droits|Droits d'accès sous Linux : gérer les accès aux fichiers]] ».
Le présent document expose les diverses manipulations pouvant être effectuées sur des fichiers et répertoires afin d'en modifier les divers droits d'accès. Il tient compte de votre connaissance des catégories de propriétaires d'un fichier (utilisateur propriétaire, groupe propriétaire et "les autres") et des trois types de permissions (lecture, écriture et exécution) ; toutes ces informations sont regroupées dans le document d'explications « [[:droits|Droits d'accès sous Linux : gérer les accès aux fichiers]] ». La description de ces attributs ne sera pas abordée ci-après ; aussi, prenez le temps de lire le document d'explications avant de poursuivre la lecture du présent article.
===== Voir les permissions =====
==== Graphiquement ====
Sous [[Nautilus]] (Ubuntu), faites un clic droit sur un fichier ou répertoire puis choisissez **propriétés**. Rendez-vous dans l'onglet **permissions**.
^ Pour un fichier ^ Pour un répertoire ^
| {{permissions_nautilus_fichier.png?380}} | {{permissions_nautilus_dossier.png?400}} |
Pour le **Propriétaire** et le **Groupe**, vous pouvez choisir dans le menu déroulant correspondant de donner les droits en **lecture et écriture** ou **lecture seule**.\\
Pour les **Autres**, vous pouvez choisir entre **lecture et écriture**, **lecture seule** et **aucun**.
Vous pouvez choisir le groupe auquel appartient le fichier (par défaut, le groupe du propriétaire, sauf cas particulier).
Lorsqu'il s'agit d'un répertoire, pour le **Propriétaire** et **Groupe** vous pouvez choisir entre **Création et suppression des fichiers**, **Accès aux fichiers**, et **Lister seulement les fichiers**.\\
Pour les **Autres**, vous pouvez choisir entre **Création et suppression des fichiers**, **Accès aux fichiers**, **Lister seulement les fichiers** et **Aucun**.
La section suivante (en ligne de commande) détaille un peu plus les différentes possibilités de permissions.
==== En ligne de commande ====
Les droits des fichiers d'un répertoire peuvent être affichés par la commande
ls -l
Les droits d'accès apparaissent alors comme une liste de 10 symboles. :
drwxr-xr-x
Le premier symbole peut être ''-'', ''d'', soit ''l'', entres autres ([[wpfr>Permissions_UNIX#Norme_POSIX|toutes les options sur la page permissions Unix sur wikipédia]])). Il indique la nature du fichier :
* **-** : fichier classique
* **d** : //directory// : répertoire
* **l** : //link// : lien symbolique
* **c** : //character// : périphérique de type caractère
* **b** : //block// : périphérique de type bloc
* **p** : //[[wpfr>Tube_nommé|pipe]]// : tube, tuyau ou file (d'attente), (voir aussi [[wpfr>File_(structure_de_données)|FIFO]])
* **s** : //socket//
Suivent ensuite 3 groupes de 3 symboles chacun, indiquant si le fichier (ou répertoire) est autorisé en lecture, écriture ou exécution. Les 3 groupes correspondent, dans cet ordre, aux droits du propriétaire, du groupe puis du reste des utilisateurs. Dans le paragraphe introductif, vous aurez remarqué des lettres en gras dans les termes anglais. Ce sont ces lettres qui sont utilisées pour symboliser lesdites permissions. Si la permission n'est pas accordée, la lettre en question est remplacé par « - ».
Si l'on reprend les lettres données pour lecture/écriture/exécution (**r**ead/**w**rite/e**x**ecute), nous obtenons : **rwx**.
Une autre commande très pratique permet de visualiser d'un coup les droits (et les propriétaires) de tous les répertoires parents (voir [[:chemins]]) d'une ressource spécifique :
namei -mo /chemin/
=== Explication par l'exemple ===
Reprenons l'exemple théorique précédent :
drwxr-xr-x
Il se traduit de la manière suivante :
* **d** : c'est un répertoire.
* **rwx** pour le 1er groupe de 3 symboles : son propriétaire peut lire, écrire et exécuter.
* **r-x** pour le 2e groupe de 3 symboles : le groupe peut uniquement lire et exécuter le fichier, sans pouvoir le modifier.
* **r-x** pour le 3ème groupe de 3 symboles : le reste du monde peut uniquement lire et exécuter le fichier, sans pouvoir le modifier.
En pratique, en exécutant la commande suivante :
ls -l
on obtient la liste du contenu du répertoire courant, par exemple :
drwxr-xr-x 6 cyrille cyrille 4096 2008-10-29 23:09 Bureau
drwxr-x--- 2 cyrille cyrille 4096 2008-10-22 22:46 Documents
lrwxrwxrwx 1 cyrille cyrille 26 2008-09-22 22:30 Examples -> /usr/share/example-content
-rw-r--r-- 1 cyrille cyrille 1544881 2008-10-18 15:37 forum.xcf
drwxr-xr-x 7 cyrille cyrille 4096 2008-09-23 18:16 Images
drwxr-xr-x 2 cyrille cyrille 4096 2008-09-22 22:45 Modèles
drwxr-xr-x 267 cyrille cyrille 20480 2008-10-27 22:17 Musique
drwxr-xr-x 2 cyrille cyrille 4096 2008-09-22 22:45 Public
drwxr-xr-x 2 cyrille cyrille 4096 2008-10-26 13:14 Vidéos
On retrouve dans la première colonne le groupe de 10 caractères permettant de connaître les droits pour chaque fichier.
Ainsi, pour le fichier ''forum.xcf'', on a :
-rw-r--r--
* Le 1er caractère est **-** => c'est un fichier.
* Le premier groupe de 3 caractères est **rw-** => le propriétaire a le droit de lecture et écriture (mais pas d'exécution) sur le fichier.
* Les 2 groupes suivants sont **r%%--%%** => Les utilisateurs du groupe et les autres n'ont que le droit de lecture (pas d'écriture, ni d'exécution) .
===== Modifier les permissions =====
Les informations ci-dessous sont très importantes pour la compréhension et la maîtrise des permissions. Cependant, si vous voulez calculer rapidement la valeur d'une permission des outils le font pour nous. Ex : [[https://www.onlineconversion.com/html_chmod_calculator.htm| CHMOD calculator]]
==== Graphiquement ====
Dans Nautilus, il vous suffit de changer les valeurs des menus déroulants dans l'onglet permissions (cf. ci-dessus) ou pas.
==== En ligne de commande ====
Un fichier a un **propriétaire** et un **groupe**. Nous pouvons les changer.
=== chown, pour changer le propriétaire ===
La commande ''chown'' (//**ch**ange **own**er//, changer le propriétaire) permet de changer le propriétaire du fichier. Seuls le super-utilisateur ou le propriétaire actuel d'un fichier peut utiliser ''chown''. La commande s'utilise de la façon suivante :
sudo chown toto fichier1
Le fichier ''fichier1'' appartient maintenant à l'utilisateur ''toto''.
=== chgrp, pour changer le groupe ===
La commande **chgrp** (pour **ch**ange **gr**ou**p**) permet de changer le groupe auquel appartient le fichier. Tous les membres de ce groupe seront concernés par les permissions du groupe de la 2ème série de **rwx**. Encore une fois, seuls le super-utilisateur ou __le propriétaire actuel__ d'un fichier peut utiliser ''chgrp'' (un membre du groupe ne peut pas changer le groupe propriétaire). La commande s'utilise de la façon suivante :
sudo chgrp mesPotes fichier2
Le fichier ''fichier2'' appartient maintenant au groupe ''mesPotes''. Tous les membres du groupe ''mesPotes'' auront accès à ce fichier selon les permissions du groupe.
//Quand l'utilisateur actuel n'est pas le propriétaire actuel du fichier, il sera nécessaire de faire précéder la commande par ''[[:sudo]]'', puisqu'elle devra être effectuée avec les droits d'administration.//
=== chown, pour changer simultanément le propriétaire et le groupe ===
Pour changer à la fois le propriétaire //et// le groupe propriétaire, une syntaxe particulière de la commande ''chown'' peut être utilisée. Encore une fois, seuls le super-utilisateur ou __le propriétaire actuel__ d'un fichier peut utiliser ''chown'' (un membre du groupe ne peut pas effectuer de changement de propriété). La commande s'utilise de la façon suivante :
chown nouveau_propriétaire:nouveau_groupe_propriétaire nom_du.fichier
//Quand l'utilisateur actuel n'est pas le propriétaire actuel du fichier, il sera nécessaire de faire précéder la commande par ''[[:sudo]]'', puisqu'elle devra être effectuée avec les droits d'administration.//
Imaginons le même fichier ''foo.txt'' possédé par //utilisateur1// et appartenant au groupe propriétaire //groupe1//. Le propriétaire doit devenir //utilisateur2// et la propriété de groupe de ce fichier doit passer au groupe //groupe2//. En étant connecté au compte //utilisateur1//, l'exécution de cette commande effectuera l'opération demandée :
chown utilisateur2:groupe2 foo.txt
=== chmod, pour changer les droits ===
L'outil ''chmod'' (//**ch**ange **mod**e//, changer les permissions) permet de modifier les permissions sur un fichier. Il peut s'employer de deux façons : soit en précisant les permissions de manière octale, à l'aide de chiffres((Quand on vous propose d'effectuer un ''chmod 777'' sur un fichier, cette représentation des permissions est la manière octale. Chaque chiffre correspond à l'ensemble des permissions attribuées à chacune des catégories d'utilisateurs. Cette manière chiffrée est sans doute moins intuitive pour les néophytes.)) ; soit en ajoutant ou en retirant des permissions à une ou plusieurs catégories d'utilisateurs à l'aide des symboles ''r w et x'', que nous avons présentés plus haut. Nous préférerons présenter cette seconde façon ("ajout ou retrait de permissions à l'aide des symboles"), car elle est probablement plus intuitive pour les néophytes. Sachez seulement que les deux méthodes sont équivalentes, c'est-à-dire qu'elles affectent toutes deux les permissions de la même manière.
== En gérant chaque droit séparément ==
De cette façon, on va choisir :
- À qui s'applique le changement
* **u** (**u**ser, utilisateur) représente la catégorie "propriétaire" ;
* **g** (**g**roup, groupe) représente la catégorie "groupe propriétaire" ;
* **o** (**o**thers, autres) représente la catégorie "reste du monde" ;
* **a** (**a**ll, tous) représente l'ensemble des trois catégories.
- La modification que l'on veut faire
* **+** : ajouter
* **-** : supprimer
* **=** : affectation
- Le droit que l'on veut modifier
* **r** : **r**ead => lecture
* **w** : **w**rite => écriture
* **x** : e**x**ecute => exécution
* **X** : e**X**ecute => exécution, concerne uniquement les répertoires (qu'ils aient déjà une autorisation d'exécution ou pas) et les fichiers qui ont déjà une autorisation d'exécution pour l'une des catégories d'utilisateurs. Nous allons voir plus bas dans la partie des traitements récursifs l'intérêt du X.
Par exemple :
chmod o-w fichier3
enlèvera le droit d'écriture pour les autres.
chmod a+x
ajoutera le droit d'exécution à tout le monde.
On peut aussi combiner plusieurs actions en même temps :
* On ajoute la permission de lecture, d'écriture et d'exécution sur le fichier ''fichier3'' pour le **propriétaire** ;
* On ajoute la permission de lecture et d'exécution au **groupe propriétaire**, on retire la permission d'écriture ;
* On ajoute la permission de lecture aux **autres**, on retire la permission d'écriture et d'exécution.
chmod u+rwx,g+rx-w,o+r-wx fichier3
etc.
== En octal ==
En [[wpfr>Systeme_octal|octal]], chaque « groupement » de droits (pour user, group et other) sera représenté par un chiffre et à chaque droit correspond une valeur :
* r (read) = 4
* w (write) = 2
* x (execute) = 1
* - = 0
Par exemple,
* Pour **rwx**, on aura : 4+2+1 = 7
* Pour **rw-**, on aura : 4+2+0 = 6
* Pour **r%%--%%**, on aura : 4+0+0 = 4
Ce qui permet de faire toutes les combinaisons :
* 0 : **''- - -''** (aucun droit)
* 1 : **''- - x''** (exécution)
* 2 : **''- w -''** (écriture)
* 3 : **''- w x''** (écriture et exécution)
* 4 : **''r - -''** (lecture seule)
* 5 : **''r - x''** (lecture et exécution)
* 6 : **''r w -''** (lecture et écriture)
* 7 : **''r w x''** (lecture, écriture et exécution)
Reprenons le répertoire ''Documents''. Ses permissions sont :
drwxr-x---
En octal, on aura **750** :
rwx r-x ---
7(4+2+1) 5(4+0+1) 0(0+0+0)
Pour mettre ces permissions sur le répertoire on taperait donc la commande :
chmod 750 Documents
=== Récursivement ===
Pour chacune de ces commandes, on peut les lancer récursivement sur un répertoire. C'est à dire que l'action sera effectuée sur le répertoire désigné et sur tous les fichiers ou répertoires qu'il contient. Ceci se fait en ajoutant l'option **-R** .
Attention! Un ''chmod -R'' mal employé peut rendre votre système définitivement inutilisable.
Voir [[:faq_forum#ubuntu_ne_boot_plus_apres_un_sudo_chmod_-r_sur|chmod -R /]]
Par exemple :
chmod -R 750 monRépertoire
donnera tous les droits au propriétaire, les droits de lecture et exécution au groupe et aucuns droits aux autres...
== Exemple d'application traitant différemment les répertoires et les fichiers ==
En effet, si les répertoires doivent obligatoirement avoir la permission x pour pouvoir être ouverts, la permission x est inutile pour les fichiers non exécutables et peut être gênante pour les fichiers textes (txt, html...) car dans ce cas lorsqu'on les ouvre on aura à chaque fois un message demandant si on veut les ouvrir ou les lancer (comme exécutable). Bref le droit x est à réserver aux seuls fichiers qui sont vraiment des exécutables.
**Application 1 :**
Soit un répertoire monrep, contenant des sous-répertoires et des fichiers. Les droits sont drwx------ (700) pour les répertoires et -rw------- (600) pour les fichiers.
On veut ajouter récursivement les mêmes droits (resp. rwx et rw) pour le groupe. C'est à dire qu'on veut aboutir à la situation suivante : drwxrwx--- (770) pour les répertoires et -rw-rw---- (660) pour les fichiers.
Si on lance chmod -R 770 monrep : les fichiers vont avoir les droits d'exécution -> mauvais :-(
Si on lance chmod -R 660 monrep : les répertoires n'auront plus les droits d'exécution -> catastrophique m(
Si on lance chmod -R g+rwx monrep : les fichiers vont avoir les droits d'exécution -> mauvais :-(
Si on lance **chmod -R g+rwX monrep** : seuls les répertoires (et les fichiers déjà exécutables) auront les droits d'exécution -> bon :-)
**Application 2 :**
Imaginons que précédemment on ait lancé la commande chmod -R 770 monrep. La situation est la suivante : les droits sont drwxrwx--- (770) pour les répertoires et -rwxrwx---- (770) pour les fichiers.
On désire supprimer les droits d'exécution uniquement sur les fichiers. C'est à dire qu'on veut aboutir à la situation suivante : drwxrwx--- (770) pour les répertoires et -rw-rw---- (660) pour les fichiers.
Comme chmod s'applique à la fois aux fichiers et répertoires, nous allons jongler avec x et X. Il faut enlever x puis ajouter X.
Si on lance chmod -R u-x+X,g-x+X monrep cela n'aura aucun effet car X concerne à la fois les répertoires ET les fichiers qui ont un x quelque part. Donc si u-x enlève le premier x (ce qui donne -rw-rwx---), la suite +X va aussitôt remettre un x car il reste un x (celui du groupe !).
Donc il faut d'abord enlever tous les x : u-x,g-x avant de les remettre (sera fait uniquement pour les répertoires cette fois)
ce qui donne finalement :
chmod -R u-x,g-x,u+X,g+X monrep
Il est à noter que seuls le propriétaire du fichier ainsi que le super-utilisateur ont la possibilité de modifier les permissions sur un fichier. (Un membre du groupe propriétaire ne peut pas changer les permissions sur un fichier.) Quand l'utilisateur actuel n'est pas le propriétaire actuel du fichier, il sera nécessaire de faire précéder la commande par ''sudo'', puisqu'elle devra être effectuée avec les droits d'administration.
Notez aussi que pour modifier les propriétaires et les permissions sur un fichier qui lui appartient, un utilisateur doit absolument disposer de la permission d'écriture sur ce fichier. S'il ne dispose uniquement que de la permission de lecture, il ne pourra effectuer aucun changement de droits d'accès sur ce fichier.Deux autres options bien pratiques :
* Pour afficher un message si et seulement si les permissions ont changé :
chmod -c
* Pour travailler récursivement sur tous les fichiers d'un répertoire et de ses sous-répertoires :
chmod -R repertoire
===== Droits spéciaux =====
Les droits sont parfois spécifiés avec 4 chiffres, comme file_mode=0777. Ce premier chiffre ajouté devant peut permettre de définir :
tapez en ligne de commande :
ls -l /usr/bin
Vous devez voir dans la liste des noms de fichiers sur fond rouge ou jaune et des droits du type ci-dessous ou //s// (special((https://www.gnu.org/software/coreutils/manual/html_node/Numeric-Modes.html))) vient remplacer le //x//
-rwsr-xr-x 1 root root 155008 févr. 10 2014 sudo*
-rwxr-sr-x 1 root ssh 284784 mai 12 2014 ssh-agent*
le bit Set-User-ID permet à un utilisateur d'exécuter le programme avec les droits du propriétaire, c'est ainsi que sudo nous permet d'exécuter des commandes en "//root//"
le bit Set-Group-ID idem que le User-ID mais par rapport au groupe
le bit restriction de suppression ou Sticky permet quant à lui de restreindre la suppression d'un fichier ou répertoire à son seul propriétaire. C'est le cas du répertoire /tmp :
ls -ld /t*/
drwxrwxrwt 2 root root 4096 nov. 28 13:17 tmp/
le //t// au lieu du //x// pour les autres utilisateurs nous informe que ce répertoire ne peut être supprimé que par l'utilisateur root
Comme pour les autres permissions, vous pouvez cumuler les activations en additionnant le code pour chacun, ainsi pour activer le sticky bit et le GroupID sur votre script renomme_mes_photos.sh, vous réalisez un :
chmod 3777 renomme_mes_photos.sh
===== Liens =====
* [[wpfr>Permissions_Unix|Les permissions UNIX]]
* [[http://www.math-linux.com/spip.php?article23|Droit et permission d'accès aux fichiers]]
* [[http://www.it-connect.fr/la-commande-chmod/|Gestion des droits avec CHMOD]] **(fr)**
* [[https://www.onlineconversion.com/html_chmod_calculator.htm| Outils de calcul des permissions : chmod calculator]]
* [[http://www.it-connect.fr/la-gestion-des-groupes-sous-linux%ef%bb%bf/|Gestion des groupes]] **(fr)**
* [[http://www.it-connect.fr/la-commande-chown/|Gestion des propriétaires avec CHOWN]] **(fr)**
* [[https://www.it-connect.fr/gestion-de-lumask-sous-linux/|Gestion de l'UMASK sous Linux]] **(fr)**
----
//Contributeurs principaux : [[:utilisateurs:_Enchained]], [[:utilisateurs:mohican]]//