Linux est un sytème multi-utilisateurs. De ce fait, tout le monde ne peut pas tout faire, excepté l’administrateur (root), qui à le droit de lire et d’écrire sur tous les fichiers et tous les répertoires, ainsi que d’executer n’importe quelle tâche inhérente au système. Il faut donc établir des règles et a fortiori donner des privilèges à certains utilisateurs et en priver à d’autres.

Droit d’accès aux fichiers

Nous avions vu lors de la courte [introduction à  Linux->art22] que lorsque nous répertorions les fichiers à  l’aide de la commande

ls -l

nous avions une multitude d’informations concernant ces fichiers. En l’occurrence, nous avions vu que la commande suivante renvoyait

nadir@ipowerht:~/Desktop/CV $ ls -l
total 96
-rw-r--r--  1 nadir nadir     8 2005-03-29 11:08 cvnadir.aux
-rw-r--r--  1 nadir nadir  4488 2005-03-29 11:08 cvnadir.dvi
-rw-r--r--  1 nadir nadir  4514 2005-03-29 11:08 cvnadir.log
-rw-r--r--  1 nadir nadir 63856 2005-03-29 11:08 cvnadir.pdf
-rw-r--r--  1 nadir nadir  6778 2005-03-29 11:08 cvnadir.tex

Ce qui nous intéresse ici ce sont la première (-rw-r–r–), la troisième et la quatrième colonne(toute les deux contiennent nadir). La première colonne est relative aux droits du fichier, la troisième au nom du propriétaire du fichier, enfin la quatrième au nom du groupe propriétaire. L’objectif de cette page est donc d’étudier de manière détaillée les droits d’accès aux fichiers, leur appartenance ainsi que la modification de ces droits.

Description

Regardons un autre exemple que celui présenté plus haut

root@port-soualem:/var/www# ls -l
total 32
drwxrwxr--   2 www-data nadir 4096 2005-06-20 20:56 cpp
drwxrwxr--   3 www-data nadir 4096 2005-06-20 20:54 hardware
drwxrwxr--   2 www-data nadir 4096 2005-05-16 16:00 images
-rwxrwxr--   1 www-data nadir 3463 2005-06-24 17:20 index.php
drwxrwxr--   4 www-data nadir 4096 2005-06-17 22:21 latex
drwxrwxr--   2 www-data nadir 4096 2005-06-24 19:13 linux
drwxrwxr--   2 www-data nadir 4096 2005-06-24 17:28 math
drwxrwxr--   2 www-data nadir 4096 2005-06-24 17:16 style

Regardons la première colonne. Celle ci fournit des informations sur les droits.

  • le premier caractère de cette colonne est un d, un - ou un l, d signifie qu’il s’agit la d’un répertoire(example: images est un répertoire), - signifie qu’il s’agit d’un fichier(example: index.php est un fichier) et l un lien
  • ensuite il y a trois groupements de trois caractères(rwx,r–,r-x, etc …) soit neuf caractères au total: ce sont les groupements de permission
  • pour un fichier r signifie readable(en lecture), w writable(en écriture) et x executable
  • pour un répertoire r signifie readable(lire le contenu du réperoire avec ls ou dir), w writable(création, déplacement et suppression de fichiers) et x executable(accès aux fichiers commande cd)

Par exemple, r-x signifie que le fichier est en lecture et executable mais pas en écriture. Un fichier possèdant l’attribut rw- est en lecture et en écriture mais pas executable, etc… Le premier groupement correspond au droit du propriétaire(user), le second au droit du groupe propriétaire(group) le troisième aux autres(others). Le fichier index.html est

  • rwx lecture + écriture + executable pour le propriétaire(user)
  • rwx lecture + écriture + executable pour le groupe(group)
  • r– lecture pour les autres(others).

Le système de fichiers est agencée de telle manière à  ce qu’un fichier ou répertoire appartienne à  un utilisateur(propriétaire) et à  un groupe. Tout fichier possède trois groupements:

  • u user, c’est à  dire le propriétaire
  • g group le groupe
  • o others et les autres.

La réunion de ces trois groupements forment l’ensemble de tous les utilisateurs que l’on définit par a(all users). On définit également la notion de groupe primaire de l’utilisateur(propriétaire) qui n’est rien d’autre en fait que le groupe contenant uniquement l’utilisateur. C’est le cas par exemple du répertoire suivant

drwxr-xr-x   2 nadir nadir     4096 2005-05-20 13:03 TMP

TMP est un répertoire(d) dont le propriétaire est nadir et dont le groupe est primaire(le groupe est nadir).

Remarques

Le propriétaire et le groupe propriétaire peuvent àªtre différents, en effet le groupe propriétaire n’est pas forcément le groupe primaire du propriétaire (groupe contenant que le propriétaire) et le propriétaire n’est pas forcément membre du groupe. Lorsque l’on crée un fichier ou un répertoire le propriétaire est celui qui l’a crée et le groupe est le groupe primaire de l’utilisateur.

Changement de propriétés

Changement de propriétaire

La commande chown(change file owner) permet de changer de propriétaire. Seul le propriétaire actuel du fichier ou du répertoire peut lancer cette commande. à€ noter évidemment que le super-utilisateur root possède tous les droits sur tous les fichiers! On l’utilise comme suit:

chown nouvel_utilisateur nom_de_fichier

pour un fichier. Pour changer le propriétaire d’un répertoire et de ses sous-répertoires, on utilise l’option -R

chown -R nouvel_utilisateur nom_de_repertoire

Regardons l’exemple suivant. Je crée un fichier fonction.php. Je suis root.

root@port-soualem:/root# touch fonction.php

Nous vérifions le propriétaire et le groupe du fichier

root@port-soualem:/root# ls -l fonction.php
-rw-r--r--  1 root root 0 2005-06-26 15:58 fonction.php

root est bien le propriétaire et le groupe primaire. root va donner la propriété du fichier {fonction.php} à  nadir

root@port-soualem:/root# chown nadir fonction.php

vérifions les droits

root@port-soualem:/root# ls -l fonction.php
-rw-r--r--  1 nadir root 0 2005-06-26 15:58 fonction.php

le propriétaire est à  présent nadir. Regardons dans le cas d’un répertoire. On crée en root un répertoire nommé PHP dans lequel on crée un fichier test.php

root@port-soualem:/root# mkdir PHP
root@port-soualem:/root# cd PHP/
root@port-soualem:/root/PHP# touch test.php
root@port-soualem:/root/PHP# cd ..

On vérifie les droits du répertoire et du fichier crée

root@port-soualem:/root# ls -Rl
total 16
-rw-r--r--  1 root  root  188 2005-03-21 19:48 dbootstrap_settings
drwxr-xr-x  2 root  root 4096 2005-03-29 09:04 Desktop
-rw-r--r--  1 nadir root    0 2005-06-26 15:58 fonction.php
-rw-r--r--  1 root  root 1336 2005-03-21 19:48 install-report.template
drwxr-xr-x  2 root  root 4096 2005-06-26 17:30 PHP

./Desktop:
total 0

./PHP:
total 0
-rw-r--r--  1 root root 0 2005-06-26 17:30 test.php

le propriétaire du répertoire PHP et du fichier test.php est root. Changeons de propriétaire, nadir sera désormais propriétaire.

root@port-soualem:/root# chown -R nadir PHP
root@port-soualem:/root# ls -Rl
total 16
-rw-r--r--  1 root  root  188 2005-03-21 19:48 dbootstrap_settings
drwxr-xr-x  2 root  root 4096 2005-03-29 09:04 Desktop
-rw-r--r--  1 nadir root    0 2005-06-26 15:58 fonction.php
-rw-r--r--  1 root  root 1336 2005-03-21 19:48 install-report.template
drwxr-xr-x  2 nadir root 4096 2005-06-26 17:30 PHP

./Desktop:
total 0

./PHP:
total 0
-rw-r--r--  1 nadir root 0 2005-06-26 17:30 test.php

nadir est bien devenu le propriétaire du répertoire PHP ainsi que du fichier test.php

Changement de groupe propriétaire

La commande chgrp permet de changer de groupe propriétaire. Ce changement de groupe peut àªtre opéré par le super utilisateur root ou par le propriétaire lui màªme si et seulement si ce dernier est membre du groupe. chgrp fonctionne comme suit pour les fichiers

chgrp nouvel_utilisateur nom_de_fichier

et comme cela pour les répertoires

chgrp -R nouvel_utilisateur nom_de_repertoire

Reprenons les exemples précédent en changeant les groupes du fichier {fonction.php} et du répertoire PHP contenant le fichier test.php. Le groupe propriétaire était root, il sera à  présent nadir.

root@port-soualem:/root# chgrp nadir fonction.php
root@port-soualem:/root# chgrp -R nadir PHP
root@port-soualem:/root# ls -Rl
total 16
-rw-r--r--  1 root  root   188 2005-03-21 19:48 dbootstrap_settings
drwxr-xr-x  2 root  root  4096 2005-03-29 09:04 Desktop
-rw-r--r--  1 nadir nadir    0 2005-06-26 15:58 fonction.php
-rw-r--r--  1 root  root  1336 2005-03-21 19:48 install-report.template
drwxr-xr-x  2 nadir nadir 4096 2005-06-26 17:30 PHP

./Desktop:
total 0

./PHP:
total 0
-rw-r--r--  1 nadir nadir 0 2005-06-26 17:30 test.php

nadir est bien le groupe propriétaire.

Changement simultané de propriétaire et de groupe propriétaire

On peut évidemment vouloir combiner les deux actions précédentes c’est à  dire modifier le propriétaire et le groupe propriétaire de manière simultanée. On utilise la commande chown, pour un fichier cela donne

chown nouvel_utilisateur.nouveau_groupe nom_de_fichier

pour un répertoire

chown -R nouvel_utilisateur.nouveau_groupe nom_de_fichier

On peut utiliser dans le cas où le propriétaire et le groupe propriétaire sont les màªmes(groupe primaire) la commande

chown nouvel_utilisateur.nom_de_fichier

pour les fichiers

chown -R nouvel_utilisateur.nom_de_fichier

pour les répertoires. On considère encore l’exemple précédent dans lequel nadir était devenu propriétaire et groupe propriétaire. On veut à  présent que le répertoire PHP soient de la propriété de nadir et de groupe propriétaire root

root@port-soualem:/root# chown -R nadir.root PHP
root@port-soualem:/root# ls -Rl

total 16
-rw-r--r--  1 root  root   188 2005-03-21 19:48 dbootstrap_settings
drwxr-xr-x  2 root  root  4096 2005-03-29 09:04 Desktop
-rw-r--r--  1 nadir nadir    0 2005-06-26 15:58 fonction.php
-rw-r--r--  1 root  root  1336 2005-03-21 19:48 install-report.template
drwxr-xr-x  2 nadir root  4096 2005-06-26 17:30 PHP

./Desktop:
total 0

./PHP:
total 0
-rw-r--r--  1 nadir root 0 2005-06-26 17:30 test.php

donne le résultat escompté.

Changement de droit des fichiers

Le changement de droit des fichiers peut àªtre opéré évidemment par le super-utilisateur root (il peut tout faire !!!) et par le propriétaire lui-màªme. On distingue trois type de modifications concernant les droits des fichiers:

  • + l’ajout de droits
  • - la suppression de droits
  • = la fixation de droits

On distingue également trois types d’utilisateurs:

  • u user, c’est à  dire le propriétaire
  • g group le groupe
  • o others et les autres

et leur regroupement est défini par

  • a all, tout les utilisateurs.

Les trois types de modifications +,-,= seront opérés sur les sur les groupes u,g,o,a en octroyant les droits r,w,x.

Pour modifier les droits d’un fichier on utilise chmod, comme suit:

chmod {utilisateur modification droit(s) nom_du_fichier}

ou si vous préférez

chmod [u g o a] [+ - =] [r w x] {nom_du_fichier}

En pratique créons le fichier {test.php}

nadir@ipowerht:~/test $ ls -l
total 0
-rw-r--r--  1 nadir nadir 0 2005-12-16 18:00 fonction.php

Nous allons enlever(-) le droit de lecture(r) aux autres (o others):

nadir@ipowerht:~/test $ chmod o-r fonction.php
nadir@ipowerht:~/test $ ls -l
total 0
-rw-r-----  1 nadir nadir 0 2005-12-16 18:00 fonction.php
nadir@ipowerht:~/test $

Fixons(=) les droits de lecture et d’écriture(rw)sur le fichier {fonction.php} pour le user et le groupe(ug)

nadir@ipowerht:~/test $ chmod ug=rw fonction.php
nadir@ipowerht:~/test $ ls -l
total 0
-rw-rw----  1 nadir nadir 0 2005-12-16 18:08 fonction.php

Enfin enlevons tout les droits sauf à  l’utilisateur:

nadir@ipowerht:~/test $ chmod go-rwx fonction.php
nadir@ipowerht:~/test $ ls -l
total 0
-rw-------  1 nadir nadir 0 2005-12-16 18:08 fonction.php

Pour les répertoires on procède comme précédemment en ajoutant l’option récursive -R:

chmod -R [u g o a] [+ - =] [r w x] {nom_du_repertoire}

On peut vouloir changer les droits de fichiers ou de répertoires non pas avec l’attribut [u g o a] [+ - =] [r w x] mais en fixant un attribut octal [0-7 0-7 0-7] …. Ca va àªtre plus clair

--- 0->000----->aucun droit
--x 1->001----->execution
-w- 2->010----->écriture
-wx 3->011----->écriture-execution
r-- 4->100----->lecture
r-x 5->101----->lecture-execution
rw- 6->110----->lecture-écriture
rwx 7->111----->lecture-écriture-execution

On fonctionne en base octale(numérotation de 0 à  7), la correspondance en base binaire est assez évidente.

Supposons que vous vouliez rendre le fichier {fonction.php} rwx pour le user et le groupe propriétaire et aucun droit pour other cela donne:

nadir@ipowerht:~/test $ chmod 770 fonction.php
nadir@ipowerht:~/test $ ls -l
total 0
-rwxrwx---  1 nadir nadir 0 2005-12-16 18:08 fonction.php

Si on veut tout les droits pour le user et aucun pour les autres cela donne:

nadir@ipowerht:~/test $ chmod 700 fonction.php
nadir@ipowerht:~/test $ ls -l
total 0
-rwx------  1 nadir nadir 0 2005-12-16 18:08 fonction.php

Enfin si vous voulez seulement les droits de lecture et d’exécution pour le user et rien pour les autres, vous avez:

nadir@ipowerht:~/test $ chmod 500 fonction.php
nadir@ipowerht:~/test $ ls -l
total 0
-r-x------  1 nadir nadir 0 2005-12-16 18:08 fonction.php

Les droits spéciaux

SETUID Regardons les droits du fichier {/usr/bin/passwd}

nadir@ipowerht:~/test $ ls -l /usr/bin/passwd
-rwsr-xr-x  1 root bin 25648 2005-10-11 18:14 /usr/bin/passwd

Il apparait un s. Cela signifie que le fichier est setuid. Etre setuid signifie que lorsque le programme est exécuté, il est avec le droit du propriétaire. Dans l’exemple précédent, lorsque le groupe {bin} excute la commande passwd, durant cette execution les membres de {bin} auront les droits de root.

SETGID De manière identique, un exécutable est setgid, et s’exécuter avec les droits du groupe auquel il appartient.

STICKY Un utilisateur ayant les droits d’écriture au sein d’un répertoire peut effacer n’importe quel fichier de ce répertoire. Cela peut s’avérer dangereux dans le cas où un répertoire est partagé par plusieurs personne. De ce fait, on introduit le sticky bit et dès lors l’utilisateur ne peut effacer que les fichier qui lui appartiennent. C’est le cas par exemple du répertoire {/tmp}.