Permissions d'accès aux fichiers

  1. u, l'utilisateur normal, son propriétaire, bien souvent son créateur, qui n'a pas pour autant tous les droits sur lui !
  2. g, son groupe, ensemble d'utilisateurs ayant parfois des "permissions" particulières.
  3. o, tous les (others) autres.
Attention, l'utilisateur propriétaire et le groupe propriétaire du fichier peuvent être indépendants :
  • le groupe propriétaire n'est pas forcément le groupe primaire de l'utilisateur propriétaire,
  • et même, le propriétaire n'est pas forcément membre du groupe !
Mais (heureusement) une règle générale simple s'applique à la création de tout nouveau fichier (ou rép)
  • son propriétaire est l'utilisateur (humain ou système) qui l'a créé
  • son groupe est le groupe primaire de ce même utilisateur

Droits d'accès des utilisateurs aux fichiers

Généralités

Linux permet de spécifier les droits d'action sur un fichier, que peuvent exercer les utilisateurs des 3 catégories précédentes, ou plutôt les permissions que leurs accordent les fichiers et les répertoires.
Linux a repris les 3 protections d'UNIX sur les fichiers et les répertoires. Leur notation symbolique est :
  1. r, lecture
  2. w, écriture
  3. x, exécution

De façon générale, ces permissions sont consultables complètement par la commande : ls -l
Rappel : ll est un alias plus court, pour la commande ls -l

Par exemple :
[stagex@p0x stagex] ll *.html
-rw-r--r-- 1 stagex stagex 1200 oct 19 12 : 39 amoi.html

Description globale
On trouve de gauche à droite

  • le 1er caractère indique la nature du fichier

  • "-" fichier normal, "d" un fichier répertoire, "l" un lien.
  • le système de droits est spécifié symboliquement par les 9 attributs suivants, correspondants aux 3 catégories d'utilisateurs du fichier.

  • ...|...|...
    u g o

    La section u fixe les droits accordés au propriétaire du fichier.
    La section g fixe les droits accordés aux utilisateurs faisant partie du groupe auquel appartient le fichier.
    La section o fixe les droits des autres utilisateurs.

  • nombre de liens sur le fichier
    1 signifie que le fichier n'a aucun lien qui pointe vers lui, 2 (ou plus) signifiant qu'il existe un lien (ou plus) vers lui.
  • le nom du propriétaire du fichier
  • le nom du groupe propriétaire
  • la date de dernière modification
  • le nom complet du fichier

Permissions des fichiers normaux

Pour chaque fichier, les utilisateurs sont ainsi séparés en 3 catégories, le propriétaire, les membres du groupe et tous les autres.
Les permissions accordées par le fichier à ces catégories sont complètement indépendantes mais leur signification est la même.
Vis à vis de chacune de ces 3 catégories, on trouve dans l'ordre :
  • le droit de lecture , afficher son contenu --> "r" si permis , "-" si refusé
  • le droit d'écriture , modifier son contenu --> "w" si permis , "-" si refusé
  • le droit d'exécution , pour un fichier script ou binaire --> "x" si permis , "-" si refusé
Exemples :
  • Le fichier de démarrage /etc/rc.d/rc.sysinit possède les droits rwx r-x r-x
    Tous les utilisateurs ont donc le droit de lire et d'exécuter ce fichier (ce qui est à éviter); seul root peut le modifier
  • La table de montage /etc/fstab : rw-r--r-- peut être lue par tous, modifiée uniquement par root
Afficher toutes les infos sur un fichier
La commande stat permet d'obtenir une information plus poussée sur un fichier.
Exemple : stat /etc/passwd

Permissions des répertoires

Pour les fichiers de type répertoire, la signification des attributs est différente de celle d'un fichier normal.
Mais elle est toujours identique pour les 3 catégories d'utilisateurs du répertoire.
La présence d'un tiret "-" signifie toujours l'absence complète de droits
  • r : lire le contenu, la liste des fichiers ( avec ls ou dir)
  • w : modifier le contenu : droits de créer et de supprimer des fichiers dans le répertoire (avec cp, mv, rm)
  • x : permet d'accéder aux fichiers du répertoire et de s'y déplacer (avec cd).Si on attribue w, il faut attribuer aussi x sur le répertoire.

Exemples :

    Passer les commandes cd / puis ls -l, pour lister les répertoires situés à la racine.
  • A qui appartienent-ils ? Un user quelconque peut-il y créer des sous-rép. ?
  • Commenter les 2 cas particuliers /root et /tmp

Attention !
on voit que le droit w est très étendu, et même dangereux quand il est accordé à un groupe, car un membre du groupe peut supprimer des fichiers dont il n'est pas propriétaire et sur lesquels il n'a même pas de droit d'écriture !
Remarque
Le droit x sur un répertoire est un préalable indispensable pour qu'un utilisateur (de la catégorie correspondante au positionnement du x), puisse exercer d'éventuels droits sur les fichiers contenus dans le répertoire.


Exercice 1


Changements des droits

De façon générale, l'utilisateur qui crée un fichier en devient le propriétaire,
et le groupe auquel l'utilisateur appartient (au moment de la création) devient le groupe du fichier.

Remarques préalables

  • Mais les droits accordés au propriétaire, au groupe et aux autres dépendent du processus qui a créé le fichier et du masque des droits.
  • D'autre part l'administrateur peut être amené à effectuer des changement de propriété (par exemple pour permettre un travail en groupe) et des changements de droits sur des ensembles de fichiers et de répertoires , les étendre ou les restreindre.
  • Et root n'est pas soumis à ces restrictions, il a le pouvoir absolu sur ... le système de fichiers. En contre-partie il peut être considéré comme responsable de tout dysfonctionnement !

Changer le propriétaire ou le groupe propriétaire

  • Changer le propriétaire
    chown [-R] nv-user fichiers
    Commande réservée au propriétaire actuel des fichiers ou des répertoires (et à root)
    L'option -R (récursif) permet d'agir sur l'ensemble des sous-répertoires.
    Exemple : chown -R stage4 /home/stage1

  • Changer le groupe propriétaire
    chgrp [-R] nv-groupe fichiers
    Ceci doit être effectué par root ou le propriétaire, à condition que celui-ci soit membre du nouveau groupe.
    Exemple : chgrp -R stage4 /home/stage1

  • Changer les 2 en même temps
    chown nv-user.nv-groupe fichiers
    chown new-user.fichiers
    Dans ce cas, en plus, le groupe propriétaire des fichiers est changé pour le groupe primaire du nouveau propriétaire.

Changer les permissions sur les fichiers

  • Les droits d'accès peuvent être modifiés par le propriétaire des fichiers ou par root (ou équivalent, d'uid 0).
  • La commande chmod (change mode, change le "mode" des fichiers) peut s'écrire de plusieurs façons équivalentes, sur le modèle :
    chmod droits fichiers
    Le paramètre droits permet de calculer les nouveaux droits d'accès.
  • Ceux-ci peuvent s'obtenir de façon relative, par ajout (symbole +) ou retrait (-) par rapport aux droits existants, ou bien de façon absolue, en fixant les nouveaux droits qui remplacent les anciens (symbole =).

Ajout, retrait ou fixation des permissions
Pour chaque fichier, on désigne par :

  • u, g et o les 3 catégories d'utilisateurs (user, group, other) et de plus par a (=all) tous les utilisateurs.
  • r,w,x les 3 attributs de chaque fichier, pour chaque catégorie d'utilisateur.
  • + - = l'action d'ajouter, de retirer ou de fixer un droit, qui s'applique à chaque catégorie séparément.
  • les changements, sur le modèle "à quelle(s) catégorie(s), quelle action, quel(s) droit(s)" sont alors notés symboliquement :
    [u g o a] [+ - =] [r w x]
  • par exemple chmod u+x fichier signifie "ajouter le droit d'exécution au propriétaire du fichier"
  • on peut regrouper les catégories si on veut exercer la même action :
    chmod ug+w fichier "ajouter le droit d'exécution au propriétaire et au groupe"
    chmod go-rwx fichier "enlever tous droits d'accès à tous les utilisateurs, sauf au propriétaire"

Notation relative (aux droits existants)

  • chmod [-R] fichiers
  • L'option -R (récursif) permet de modifier les permissions de tous les sous-répertoires.
  • exemple : chmod [-R] go-rwx /home/toto enlève tous les permissions d'accès des fichiers du rép. personnel de toto (et des sous-rép.), à tous sauf au propriétaire, c'est-à-dire toto.

Notation absolue

  • Pour chaque groupe, elle permet de fixer les nouveaux droits qui remplacent les anciens. Si une catégorie n'est pas présente, ses anciens droits s'appliquent.
  • chmod u=rwx,g=rw,o=r fichiers remplace les permissions précédentes des fichiers, en les fixant à -rwxrw-r--
    Attention : aucun espace dans la liste des droits, pas même autour des éventuelles virgules
  • chmod u=rwx,g=r fichiers fixe les permissions à -rwxr--??? en ne changeant pas les permissions précédentes du groupe other
  • chmod u=rwx,g=r,o= fichiers fixe les permissions à -rwxr-----

Remarque importante

Le "super-utilisateur" root n'est pas soumis aux restrictions des permissions. Une petite expérience :
  1. Vérifier que /etc/shadow est inaccessible même en lecture aux utilisateurs
  2. Vérifier que ses permissions sont --------- ou 400 en octal, seul le propriétaire root peut lire
  3. Root supprime ce droit de lecture : chmod u-r /etc/shadow
    Vérifier /etc/shadow
  4. Root peut le lire, le copier et le modifier, ce n'est bien sûr pas recommandé, mais root peut tout se permettre (raison de plus pour ne jamais se connecter root, sans nécessité !)
  5. Mais bonne nouvelle, root peut donc retrouver de fichiers appartenant à des utilisateurs ayant perdu leurs droits d'accès !
    [stagex@p00 stagex]$ cp ./bashrc ./bashrc1
    [stagex@p00 stagex]$ chmod ugo= ./bashrc1 aucune permission sur le fichier !
    [stagex@p00 stagex]$ cat ./bashrc1 bien sûr il est totalement protégé en lecture
    [root@p00 stagex]# cat ./bashrc1 mais pas pour root !
Exercice 2

Exercice 3


Compléments .. indispensables

Notation octale des permissions

Il existe une autre facon d'indiquer les permissions de chaque catégorie, plus simple en utilisant la numération octale

Voici la table de correspondance entre les 8 chiffres en numérotation octale (base 8) et les 8 valeurs de droits fichiers.
Par convention la présence d'un droit est noté 1, l'absence 0.

Binaire ----- Droit ----- Octal
000 -------- (---) ------- 0
001 -------- (--x) ------- 1
010 -------- (-w-) ------- 2
011 -------- (-wx) ------- 3
100 -------- (r--) ------- 4
101 -------- (r-x) ------- 5
110 -------- (rw-) ------- 6
111 -------- (rwx) ------- 7

Synthèse : notation globale pour les 3 catégories

propriétaire groupe autre
lecture écriture exécution lecture écriture exécution lecture écriture exécution
400 200 100 40 20 10 4 2 1

Pour obtenir les permissions exprimées en octal, il suffit d'ajouter en octal les nombres de la table de correspondance ci-dessus, pour lesquels les droits sont positionnés.

Exemples

chmod 700  /home/rep-a-moi droits par défaut pour un rép. personnel.
ls -l /home/rep-a-moi
--> drwx------

Les 2 commandes suivantes sont équivalentes :

chmod 764 test
chmod u=rwx,g=rw,o=r test
ls -l test
-rwxrw-r--

Le masque de protection umask

  • Rappelons les règles simples de propriété qui s'appliquent à la création d'un fichier ou d'un répertoire :
    • son propriétaire est l'utilisateur qui l'a créé
    • son groupe est le groupe primaire de ce même utilisateur
  • Mais quelles sont les permissions attribuées par défaut à l'utilisateur propriétaire, au groupe propriétaire et à tous les autres ?
    Les permissions maximales accordées par un fichier et un répertoire sont 666 (-rw-rw-rw-) et 777 (-rwxrwxrwx).
    On peut restreindre ces permissions lors de sa création. C'est le rôle de la commande umask de fixer les permissions masquées, autrement dit les droits non accordés aux fichiers et répertoires lors de leur création.
  • Exemple de calcul de permissions effectives, affectées lors de la création d'un répertoire, par un utilisateur dont le masque de protection est 027
      777 = 111 111 111 permissions maxi = rwx rwx rwx 
    - 027 = 000 010 111 masque de protection
    = 750 = 111 101 000 permissions effectives = rwx r-x ---

  • La commande umask
    • umask affiche le masque de l'utilisateur actif
      Quelles sont les valeurs des masques par défaut de root et des autres utilisateurs ?
    • umask -S affiche les permissions correspondantes au masque, sous forme symbolique.
    • umask masque fixe les permissions ultérieures de création des fichiers de l'utilisateur actif, conformément à masque, en notation octale.
      Attention ! le changement ne s'applique qu'à la présente session.
    • Pour la rendre permanente, on peut intervenir sur un fichier profile :
      • Dans le fichier profil général /etc/profile, on peut modifier la règle habituelle :
        if [ $UID == 0 ] ; then umask 022 ; else umask 077 ; fi
      • Pour agir au niveau des utilisateurs, ajouter la ligne umask masque dans le fichier de profil personnel $HOME/.bash_profile

Les droits étendus

Le droit SUID

  • Sa présence permet à un fichier exécutable de s'exécuter sous l'identité et donc les droits de son propriétaire, à la place des droits de l'utilisateur actuel qui l'exécute.
  • Il s'agit d'un dispositif de sécurité essentiel qui autorise un utilisateur quelconque (par rapport à la commande) à bénéficier de droits plus étendus que les siens (souvent ceux de root), pour exécuter la commande agir sur d'autres fichiers indispensables, juste le temps et sous le contrôle de l'exécution de la commande, SANS qu'il soit nécessaire d'attribuer ces droits en permanence sur les fichiers.
  • Ce droit est noté symboliquement s et se positionne à la place du x du propriétaire u (mais sans écraser le droit x)
    Sa valeur octale est 4000

  • Exemple significatif
    Examiner les droits du fichier exécutable /usr/bin/passwd, qui permet de (re)définir un mot de passe et le comparer à ceux du fichier /etc/shadow qui contient les mots de passe cryptés.
    Observez :
    ll /etc/shadow
    -r-------- root root shadow
    ll -l /usr/bin/passwd
    -r-sr-xr-x root bin passwd
    Comme le droit x est accordé à tous, chacun peut donc exécuter la commande passwd, mais personne ne posséde pas lui-même le droit d'écriture dans le fichier /etc/shadow qui doit le stocker.
    Le positionnement du SUID permet d'agir en tant que root lors de la demande d'accès au fichier et comme root a tous les droits, il est alors possible de mettre à jour ce fichier des mots de passe.

  • Manipulation
    Comment connaitre les commandes comme passwd, qui offre cette permission SUID ? Voici plusieurs façons
    cd /usr/bin
    # grep filtre les lignes produites par ls en utilisant
    # l'expression rationnelle ^...s

    ls -l | grep "^...s"
    # pour afficher tous les fichiers possédant le SUID
    cd /
    ls -lR | grep "^...s"
    # recherche parmi les fichiers ordinaires ceux qui ont au moins le droit s
    find / -type f -perm +4000

Le droit SGID

  • Pour un fichier exécutable, il fonctionne de la même façon que le SUID, mais transposé aux membres du groupe.
    Exemple
    • Examiner les droits symboliques de la commande d'impression /usr/bin/lpr
    • Quelle est sa valeur octale ?
    • Si une imprimante a été installée, un répertoire lp a été créé dans /var/spool/lpd . Or la commande lpr écrit dans ce répertoire. Comment un utilisateur quelconque peut-il alors y écrire le fichier d'impression ?

  • Positionné sur un répertoire, ce droit modifie le groupe propriétaire d'un fichier créé dans ce répertoire.
    Un fichier créé dans un tel répertoire, verra son groupe propriétaire modifié :
    Ce ne sera plus le groupe primaire du propriétaire qui l'a créé (règle habituelle), mais à la place, le groupe propriétaire du répertoire lui-même.
    Autrement dit, ce droit s posé sur un répertoire, met en place un mécanisme d'héritage de groupe, de répertoire conteneur à fichiers contenus.
  • Notation symbolique s, mis à la place du x du groupe, valeur octale 2000

Le "sticky bit"

  • Ce droit spécial, traduit en "bit collant", a surtout un rôle important sur les répertoires.
    Il réglemente le droit w sur le répertoire, en interdisant à un utilisateur quelconque de supprimer un fichier dont il n'est pas le propriétaire
  • Ce droit noté symboliquement t occupe par convention la place du droit x sur la catégorie other de ce répertoire, mais bien entendu il ne supprime pas le droit d'accès x (s'il est accordé).
    Justement, si ce droit x n'est pas accordé à la catégorie other, à la place de t c'est la lettre T qui apparaitra.
    Sa valeur octale associée vaut 1000.
  • Pour positionner ce droit :
    chmod +t rep
    --> d ... ... ..t rep si le répertoire a le droit x pour tous
    --> d ... ... ..T rep sinon

  • Exemple
    Le sticky bit est présent sur le rép. /tmp
    Pour quelle raison ?
    ls -l /
    ........
    drwxrwxrwt root root tmp/

  • Exercice 4 : sécuriser le partage d'un répertoire.