La protection d’un fichier est relative à trois groupes d’utilisateurs :
- propriétaire du fichier : u
- le groupe du fichier (par défaut, celui du propriétaire) : g
- le reste du monde : o (other)
Pour chaque catégorie, le propriétaire peut donner trois types de droits : lecture, écriture et exécution (rwx)
L’utilisateur spécial ‘root’ (administrateur) passe outre ces niveaux de protection.
| Permissions | permet pour un fichier de | permet pour un répertoire de |
|---|---|---|
| Read | lire le contenu | lister les fichiers du répertoire |
| Write | modifier le contenu (mais pas le détruire) |
créer, renommer, supprimer le répertoire |
| Execute | executer le fichier (un binaire ou un script) | accéder au répertoire et rwx sur les fichiers qu’il contient |
Lecture des droits
ls -l
donne des informations sur le propriétaires , le groupe et les droits du fichier
- : pas de droits
r : droit de lecture
w : droit d’écriture
x : droit d’exécution
et dans l’ordre : 3 caractères pour le propriétaire, le groupe, puis les autres.
$> ls -l
-rw-r–r– 1 oracle transf 341331968 Aug 19 20:07 test.dmp
-r–r–r– 1 dd dba 476 Dec 05 10:20 error.log
# test.dmp appartient à oracle, est du groupe ‘transf’, accessible en lecture/écriture pour le propriétaire et en lecture seule pour le groupe et les autres.
# error.log appartient à dd, au groupe dba
et est en lecture seule pour tous
note : le premier caractère affiché indique le type de fichier. ‘-’ est ici un fichier ordinaire (‘d’ aurait indiqué un répertoire)
Changement des droits
chmod permet de changer les droits d’accès.
$ chmod [ugoa] [+-=] [rwx] [fichier...]
le 1er parametre précise la cible u,g,o ou ‘a’ pour tous les trois.
le 2eme : ‘+’ ajoute, ‘-’ supprime, ‘=’ remplace des permissions
le 3eme : les permissions utilisées
le 4eme : le fichier ou rep sur lequel on fait le changement
exemples
$>touch toto
$> par défaut on a …
$>ls -l toto
-rwxr–r-x 1 oracle dba 0 Dec 05 14:24 toto
$>chmod g+wx toto
$>ls -l toto
-rwxrwxr-x 1 oracle dba 0 Dec 05 14:24 toto
$># on enleve le x a others
$>chmod o-x toto
$>ls -l toto
-rwxrwxr– 1 oracle dba 0 Dec 05 14:24 toto
$>#on écrase le groupe par rx
$>chmod g=rx toto
$>ls -l toto
-rwxr-xr– 1 oracle dba 0 Dec 05 14:24 toto
$>chmod a-r toto
$>ls -l toto
–wx–x— 1 oracle dba 0 Dec 05 14:24 toto
$># on rajoute r a u et g seulement
$>chmod ug+r toto
$>ls -l toto
-rwxr-x— 1 oracle dba 0 Dec 05 14:24 toto
chmod numérique
Il existe une autre notation plus compacte ou l’on note les permissions (rwx) avec un nombre binaire en octal. Chaque permission a le poids suivant :
r=4 w=2 x=1 et n octal = code r + code w + code x
n bin symbole
0 000 —
1 001 –x
2 010 -w-
3 101 r-x
4 100 r–
5 101 r-x
6 110 rw-
7 111 rwx
exemples
$> chmod 755 toto
$> ls -l
rwxr-xr-x 1 oracle dba 0 Dec 05 14:24 toto
$>chmod 770 toto
$ >ls -l toto
-rwxrwx— 1 oracle dba 0 Dec 05 14:24 toto
Droits par défaut
Le système fixe des permissions par défaut lors de la création d’un fichier et d’un répertoire :
- - 666 ou rw- rw- rw- pour un fichier
- - 777 ou rwx rwx rwx pour un répertoire
Cependant ces permissions par défaut, sont filtrées par un code le ‘umask’.
On peut vérifier sa valeur courante ou lui en fixer une nouvelle avec la commande :
$> umask
0022
$> umask 0044
Pour appliquer le filtre il suffit simplement de soustraire sa valeur numérique des permissions par défaut.
Le umask de la plupart des systèmes est fixé à 0022 ce qui nous donne les protections suivantes par défaut :
- fichier : 666-022 = 644 ==> rw- r– r–
- répertoire : 777 – 022 = 755 ==> rwx r-x r-x
Ce que l’on vérifie sur notre système :
$> umask
0022
$> touch titi # on cree un fichier
$> mkdir toto # puis une directory
$> ls -al titi
-rw-r–r– 1 root root 0 dec 9 08:43 titi
$> ls -al|grep toto
drwxr-xr-x 2 root root 4096 dec 9 08:43 toto
Droits spéciaux
Il existe en plus des droits rwx 3 droits spéciaux s’appliquant aux fichiers et répertoires.
- Set User ID bit ou SUID bit
- un fichier est exécuté avec l’ID et donc les droits du propriétaire (et pas de l’exécuteur)
- un répertoire fait hériter son UID aux fichiers
note importante : le suid bit ne s’applique en général qu’aux exécutables binaires et pas aux fichiers scripts…
Un exemple classique d’utilisation (implicite) du suid bit par les utilisateurs, est le changement de mot de passe. Pour ce faire on doit modifier le fichier /etc/passwd …qui appartient à root et n’est pas en écriture pour tout le monde. c’est impossible à faire en direct avec un éditeur ! mais la commande executable ‘passwd’ a justement le suid bit positionné , ce qui permet de prendre momentanément l’ID de root et de pouvoir écrire dans le fichier. CQFD.
On en a la preuve ici sur notre machine:
$> ls -l /etc/passwd
-rw-r–r– 1 root root 1593 dec 8 11:08 /etc/passwd
$> # on voit bien que le fichier est en lecture seule pour others (dont DD)
$> # voyons voir les droits de l’executable
$> ls -l /usr/bin/passwd # il peut se trouver ailleurs suivant les versions
-rwsr-xr-x 1 root root 22984 jun 6 2007 /usr/bin/passwd
- Set GID bit
Cette permission donne les droits suivants :
- un fichier s’exécute avec le groupe propriétaire
- un répertoire fait hériter son GID aux fichiers
- Sticky bit
Cette permission spéciale donne les droits suivants :
- fichier exécutable ‘collé’ en mémoire après exécution
- répertoire ou tous peuvent écrire, mais seul le propriétaire peut détruire
–S—— set UID ok mais pas execute pour u
–s—— set UID ok et execute pour u
—–S— set GID bit ok mais pas execute pour le g
—–s— set GID bit ok et execute pour le g
——–T sticky bit OK mais pas x pour o
——–t sticky bit OK et x pour o
$> chmod +t nom_rep
note : le sticky bit est différemment supporté suivant les versions d’Unix. Il est ignoré pour les fichiers sur Linux.