Droits et permissions

Sommaire

Index

Les droits d’accès POSIX

Catégories d’utilisateurs

Pour un fichier ou dossier, trois catégories d’utilisateurs sont gérées:

Catégorie Nom anglais Acronyme
utilisateur propriétaire owner user u
groupe group g
autres utilisateurs other users o

Types de droits

Trois types de droits sont associés à chacune de ces catégories:

Droit Nom anglais Acronyme
Lecture/affichage read r
Écriture/modification write w
Exécution/accès execution x

La commande ls -l

L’affichage de la commande ls -l produit une sortie semblable à ceci:

-rw-r--r--   1 theuser  thegroup    17B 26 mar 01:02 hello.c
drwxr-xr-x   3 theuser  thegroup   102B  5 apr 09:44 data

La colonne de gauche reprend les droits d’accès répartis dans les trois catégories sur 10 caractères.

Catégories des droits d’accès

t u g o Catégorie
- rw- r-- r--
d rwx r-x r-x
- Type de fichier
d Type de fichier
rw- owner User
rwx owner User
r-- Group
r-x Group
r-- Other users
r-x Other users

Les types de fichiers

La première lettre donne le type du fichier:

Lettre Signification anglophone Signification
- regular file fichier standard
d directory répertoire
l symbolic link lien symbolique
s socket socket
b block device périphérique bloc
c character device périphérique caractère
p FIFO tuyau, tube, pipe

Sous Debian ou RedHat et leurs dérivés, la commande man namei permet de lister les types de fichiers.

Sous d’autres systèmes, la commande man ls donne ces informations.

Quelques informations supplémentaires sont décrites ici.

Notation symbolique / absolue

Symbolique Absolue r = 4 w = 2 x = 1
rwx 7 1 1 1
rw- 6 1 1 0
r-x 5 1 0 1
r-- 4 1 0 0
-w- 2 0 1 0
--- 0 0 0 0

Commande chmod

chmod en symbolique

chmod [augo][+-][rwxX]

chmod en symbolique : ajout

Exemple:

# Ajoute les droits en écriture pour le groupe
chmod g+w fichier

chmod en symbolique : suppression

Exemple:

# Supprime les droits en écriture pour les autres
chmod o-w fichier

chmod en symbolique: modification simultanée

# Ajoute les droits en écriture pour le groupe
# Supprime les droits en écriture pour les autres
chmod g+w,o-w fichier

chmod en symbolique : exemples d’ajouts

# + exécution pour tous
chmod +x fichier

# + exécution pour l'utilisateur propriétaire
chmod u+x fichier

# + exécution si l'un des bits d'exécution est positionné
chmod +X fichier

Le X majuscule: ajout sélectif en exécution

$ touch lisible
$ chmod 400 lisible
$ touch inscriptible
$ chmod 600 inscriptible
$ touch executable
$ chmod 700 executable
$ ll
total 0
-rwx------ 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod o+X *
$ ll
total 0
-rwx-----x 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod g+x *
$ ll
total 0
-rwx--x--x 1 laurent laurent 0 Feb  8 11:32 executable
-rw---x--- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r----x--- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod g-x *
$ ll
total 0
-rwx-----x 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod o-X *
$ ll
total 0
-rwx------ 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod +X *
$ ll
total 0
-rwx--x--x 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod -X *
$ ll
total 0
-rw------- 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod +rX *
$ ll
total 0
-rw-r--r-- 1 laurent laurent 0 Feb  8 11:32 executable
-rw-r--r-- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r--r--r-- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod g-r,o-r *
$ ll
total 0
-rw------- 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod o+x executable
$ ll
total 0
-rw------x 1 laurent laurent 0 Feb  8 11:32 executable
-rw------- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r-------- 1 laurent laurent 0 Feb  8 11:32 lisible
$ chmod +rX *
$ ll
total 0
-rwxr-xr-x 1 laurent laurent 0 Feb  8 11:32 executable
-rw-r--r-- 1 laurent laurent 0 Feb  8 11:32 inscriptible
-r--r--r-- 1 laurent laurent 0 Feb  8 11:32 lisible

chmod en absolu

$ chmod 644 fichier
$ ls -l
-rw-r--r--   1 theuser  thegroup     17 26 mar 01:02 fichier

$ chmod 755 fichier
$ ls -l
-rwxr-xr-x   1 theuser  thegroup     17 26 mar 01:02 fichier

umask

Voir man umask

Modification

umask 0022

Correspondances

permissions bin oct umask (binaire) umask fichier
rw-rw-r– 110 110 100 664 000 000 000 010 0002 texte0002.txt
rw-r–r– 110 100 100 644 000 000 010 010 0022 texte0022.txt
rw——- 110 000 000 600 000 000 110 110 0066 texte0066.txt
r–rw-r– 100 110 100 464 000 010 000 010 0202 texte0202.txt
r–r–r– 100 100 100 444 000 010 010 010 0222 texte0222.txt
r–r–r– 100 100 100 444 000 011 011 011 0333 texte0333.txt

Calcul des droits

Calcul des droits d’un fichiers :

droits = 666 - umask

Exemple avec un umask de 0026 :

666 - 0026 = 640

Exercices sur les droits UNIX

Avant de commencer ce qui suit, votre umask doit être positionné sur sa valeur par défaut (0002).

Si ce n’est pas le cas, lancer la commande:

umask 0002

Créations d’utilisateurs

Après chacune des opérations suivantes, observez le contenu des fichiers /etc/group, /etc/passwd et /etc/shadow

  1. Créez un utilisateur nommé bill
  2. Ajoutez le dans un groupe nommé microsoft
  3. Créez un utilisateur nommé steve
  4. Ajoutez le dans un groupe nommé apple
  5. Créez un utilisateur nommé linus et un autre nommé ian
  6. Les ajouter au groupe gnu.

Utilisation de ces utilisateurs

Utilisation de su

Pour se connecter en tant qu’un autre utilisateur, utiliser la commande suivante:

~$ su ian

Une fois le mot de passe saisi, l’invite de commande change:

/home/laurent$

Cela indique que l’on est connecté sur le dossier courant /home/laurent.

Exécuter une commande:

touch fichier-de-ian

Selon les permissions du dossier courant, le fichier sera créé ou un message d’erreur affiché.

Pour se déconnecter, utiliser la commande exit ou CtrlD.

Utilisation de sudo

Dans le cas où l’utilisateur courant est membre du groupe des sudoers

Pour vérifier si votre utilisateur est membre des sudoers, lancer la commande suivante:

sudo echo bonjour

Si la sortie affiche :

bonjour

Alors votre utilisateur est sudoer.

Sinon, une erreur indique que ce n’est pas le cas:

alice is not in the sudoers file.  This incident will be reported.

Dans ce dernier cas, il faut se connecter en tant que root pour réaliser la commande donnée.

Au lieu de sudo -u ian touch fichier il faudra exécuter les commandes suivantes:

su - ian
touch fichier
exit

Pour exécuter la commande directement en tant qu’un autre utilisateur, dans le dossier courant :

sudo -u ian touch fichier-de-ian

Utilisation de su

Pour exécuter la commande directement en tant qu’un autre utilisateur, dans le dossier courant :

su ian

Le mot de passe de ian est alors demandé.

Exécuter la ou les commandes:

touch fichier-de-ian

Se déconnecter de ian:

exit

Arborescence de travail

Créer l’arborescence suivante:

Dans chaque dossier sources, créer un fichier init.c.

Le contenu du fichier est :

#include <stdio.h>
int main()
{
   printf("Hello World !");
   return 0;
}
$ mkdir -p informatique/{windows,mac,linux}/sources/
$ cd informatique
$ cat | tee {windows,mac,linux}/sources/init.c <<EOF
#include <stdio.h>
int main()
{
   printf("Hello World !");
   return 0;
}
EOF

Positionnement des propriétaires

Les propriétaires (utilisateur et groupe) sont positionnés en utilisant la commande chown.

Changement de propriétaire et de groupe

La commande suivante :

chown ian:gnu ledossier

Va modifier le propriétaire et le “groupe propriétaire” du répertoire ledossier:

Changement récursif

La commande suivante agit de manière récursive :

chown -R ian:gnu ledossier

Va modifier le propriétaire et le “groupe propriétaire” du répertoire ledossier et de tous ses fichiers et sous-dossiers récursivement :

Changement de groupe

Les commandes suivantes ont le même effet :

chgrp gnu ledossier
chown :gnu ledossier

Va modifier le “groupe propriétaire” du répertoire ledossier:

Il est possible de lui appliquer l’option -R

Exercice pratique

Avant de commencer, ajouter l’utilisateur courant dans chacun les groupes de travail microsoft et apple:

sudo adduser $USER apple
sudo adduser $USER microsoft

Si ce n’est pas le cas, vous aurez une erreur lors des changements de groupe des dossiers.

Le positionnement des utilisateurs et groupes propriétaires se fait avec la commande chown.

  1. Positionner les groupes propriétaires des dossiers récursivement en suivant le cahier des charges ci-dessous:

Résultat attendu :

$ cd informatique
$ tree -p -u -g
.
├── [drwxrwxr-x laurent  gnu   ]  linux
│   └── [drwxrwxr-x laurent  gnu   ]  sources
│       └── [-rw-rw-r-- laurent  gnu   ]  init.c
├── [drwxrwxr-x laurent  apple   ]  mac
│   └── [drwxrwxr-x laurent  apple   ]  sources
│       └── [-rw-rw-r-- laurent  apple   ]  init.c
└── [drwxrwxr-x laurent  microsoft]  windows
    └── [drwxrwxr-x laurent  microsoft]  sources
        └── [-rw-rw-r-- laurent  microsoft]  init.c

chgrp peut être utilisée à la place de chown pour modifier le groupe propriétaire.

Les deux commandes suivantes produisent le même effet:

chown -R :microsoft windows/
chgrp -R microsoft windows/
chown -R :microsoft windows
chown -R :gnu linux
chgrp -R gnu linux
chgrp -R apple mac
chgrp -R microsoft windows

Positionnement des droits

Le positionnement des permissions se fait avec la commande chmod.

  1. Utiliser la commande chmod pour faire en sorte que les “autres utilisateurs” ne puisse ni lire, ni écrire, ni accéder aux trois dossiers et à leurs sous-éléments. Par exemple, un membre du groupe apple n’a pas le droit d’aller lire ni écrire dans le répertoire windows.

Résultat attendu (partiel):

$ tree -p -u -g
.
├── [drwxrwx--- laurent  gnu   ]  linux
│   └── [drwxrwx--- laurent  gnu   ]  sources
│       └── [-rw-rw---- laurent  gnu   ]  init.c
...
chmod -R o-r,o-x linux

Manipulation des droits UNIX

Nous allons maintenant manipuler les droits UNIX.

Pour visualiser les modifications, la commande ls -l ou son alias ll seront utilisés.

  1. Lancer la commande suivante: chmod 755 mac windows. Vérifier ses effets.

Créations de fichiers en tant que linus

Se connecter en tant que linus:

su linus

Saisir le mot de passe.

Puis effectuer les opérations suivantes:

  1. Taper la commande touch mac/jesuislinus. Que se passe-t-il ?
  2. Taper la commande touch linux/jesuislinus. Que se passe-t-il ?
  3. Taper la commande touch windows/jesuislinus. Que se passe-t-il ?

Se déconnecter de linus

exit

Une variante consiste à utiliser la commande sudo -u linus:

  1. Taper la commande sudo -u linus touch mac/jesuislinus. Que se passe-t-il ?
  2. Taper la commande sudo -u linus touch linux/jesuislinus. Que se passe-t-il ?
  3. Taper la commande sudo -u linus touch windows/jesuislinus. Que se passe-t-il ?

Autres créations de fichiers

Dans ce qui suit, <USER> sera à remplacer par le nom de votre utilisateur courant

  1. Créer le fichier windows/<USER> avec la commande touch windows/<USER>. Est-ce normal que le fichier existe ?
  2. Supprimer le fichier windows/<USER>

Se connecter en tant que “”:

su "<USER>"
  1. Taper la commande sudo chown bill windows. Se déconnecter de “

Saisir à nouveau la commande touch windows/<USER>.

  1. Exécuter la commande chown linus linux (en tant que super-utilisateur)
  2. Exécuter la commande chown steve mac (en tant que super-utilisateur)
  3. Tenter de créer les fichiers windows/<USER>, mac/<USER> et linux/<USER>
  4. Ajouter <USER> au groupe gnu et retenter de créer linux/<USER> (cela devrait fonctionner, mais sous certaines conditions, lesquelles ?)

Le manuel de adduser indique l’exemple suivant pour l’utilisation de cette commande :

adduser [options] user group

En effet, la commande suivante ajoutera l’utilisateur freddie au groupe queen

adduser freddie queen

Une alternative est d’utiliser la commande suivante:

sudo usermod -a -G queen freddie

Pour vérifier l’appartenance à un groupe de l’utilisateur courant, utiliser une des commandes suivantes:

groups
id

La commande id -Gn peut aussi être utilisée.

Ces deux dernières commandes peuvent aussi afficher les informations sur d’autres utilisateurs:

$ id -Gn bill
bill microsoft
$ groups steve
steve : steve apple

Pour supprimer un utilisateur d’un groupe (ici l’utilisateur freddie) :

deluser freddie queen
  1. Ajouter <USER> au groupe apple et retenter de créer windows/<USER>, mac/<USER> et linux/<USER>
  2. Ajouter <USER> au groupe microsoft et retenter de créer windows/<USER>
  3. Taper la commande sudo chmod g+w windows et retenter de créer windows/<USER>. Est-ce normal ?
  4. Déconnectez vous et retenter de créer windows/<USER>. Que s’est-il passé ? Dans quel autre cas avez-vous déjà dû vous déconnecter pour observer le changement de groupe effectif ?

Les Access Control Lists (ACL)

L’installation du paquet acl est nécessaire pour utiliser les commandes setfacl et getfacl. Pour l’installer :

Sous Debian et dérivés:

sudo apt-get update && sudo apt-get install acl

Sous RedHat et dérivés:

sudo dnf install acl
  1. Utiliser la commande setfacl pour permettre à linus (sans rajouter d’autres permissions à d’autres utilisateurs ou groupes) de lire et écrire dans le répertoire mac et ses sous-répertoires. Testez.

Ci-dessous une fonction partielle qui ne fonctionnera pas:

sudo setfacl -R -m u:linus:rw mac

En effet, linus n’aura pas le droit d’accéder (en exécution) au dossier mac

  1. Utilisez la commande getfacl pour vérifier les droits affectés au fichier informatique/mac/sources/init.c

Voir aussi la page sur les ACLs de Lea Linux

  1. Taper la commande sudo -u linus touch mac/sources/init.c

Si linus a les droits d’accès en exécution dans mac et mac/sources, il pourra exécuter cette commande.

On peut tester cela en se connectant avec linus:

su linus
cd mac
cd sources

Si les deux dernières commandes ne fonctionnent pas, il faut repositionner les ACL en utilisant rwX (avec un X majuscule) sur mac et de manière récursive (question 35)

sudo setfacl -R -m u:linus:rwX mac
  1. Taper la commande sudo -u bill touch mac/sources/init.c. Est-ce que le résultat est normal ?
  2. Taper la commande setfacl -Rb mac puis essayer à nouveau sudo -u linus touch mac/sources/init.c. Que s’est-il passé ?

Toutes les ACL ont été supprimées sur le dossier mac. Vérifier avec getfacl

  1. Taper la commande setfacl -Rm u:linus:rwX mac puis créer le répertoire mac/bin. Quels sont les autorisations associées à ce dossier ? Est-ce normal ? Est-ce souhaité ?
  2. Taper la commande setfacl -Rdm u:linus:rwX mac puis créer le répertoire mac/partage. Observer les autorisations associées à ce dossier. Que peut-on en conclure ?
  3. Pour finir, supprimer les ACLs de tous les dossiers (mac, linux, windows)

Eléments de solution

Suppression des droits

Récursivement

setfacl -Rx u:linus: mac

Pour un fichier

setfacl -x g:apple mac

Suppression:

setfacl -Rb mac windows linux

Avec les ACLs par défaut

$ mkdir confacl

Positionnement des ACLs par défaut

$ setfacl -d -m g:gnu:rwX confacl

richard ne pourra pas créer de dossier dans ce dossier:

$ sudo -u richard touch confacl/richard.txt
touch: cannot touch 'confacl/richard.txt': Permission denied

Par contre le propriétaire peut créer un fichier:

$ touch confacl/proprietaire.txt

Que richard peut alors modifier:

$ sudo -u richard touch confacl/proprietaire.txt

Pourquoi ? Parce que désormais ce nouveau fichier proprietaire.txt a récupéré les ACLs par défaut:

$ getfacl confacl/proprietaire.txt
# file: confacl/proprietaire.txt
# owner: laurent
# group: laurent
user::rw-
group::r-x          #effective:r--
group:gnu:rwx           #effective:rw-
mask::rw-
other::r--

De même le propriétaire peut créer un dossier:

$ mkdir confacl/dossier
$ sudo -u richard touch confacl/dossier/richard.txt

En effet, les droits d’accès de ce dossier sont désormais hérités:

$ getfacl confacl/dossier/
# file: confacl/dossier/
# owner: laurent
# group: laurent
user::rwx
group::r-x
group:gnu:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:gnu:rwx
default:mask::rwx
default:other::r-x

ACLs par défaut + modifications autorisés

$ mkdir partage
$ setfacl -d -m g:gnu:rwX partage
$ setfacl -m g:gnu:rwX partage
$ sudo -u richard touch partage/richard.txt

Les bits spéciaux

set-group-ID bit (SGID)

Le SGID permet d’appliquer le groupe propriétaire d’un dossier aux fichiers et dossiers qui seront créés dans ce dossier.

Il permet donc de modifier le groupe par défaut lors de création de nouveau fichier

$ sudo chmod -R g+s debian

Tentative de création d’un nouveau fichier:

$ sudo -u richard touch debian/richard-avec-sgid.txt
$ ll debian
total 0
-rw-r--r-- 1 richard gnu   0 Jul 17 16:23 richard-avec-sgid.txt
-rw-r-Sr-- 1 richard richard 0 Jul 17 16:19 richard.txt

Les autres bits spéciaux