dimanche 17 mai 2015

Linux - Les permissions sur les fichiers et gestion des utilisateurs

Préambules
Utiliser une système Unix/Linux est devenu relativement simple. Des distributions comme Ubuntu ou Linux Mint facilitent grandement la prise en main par des Néophytes.

Il n'en reste pas moins que Linux/Unix ne sont pas seulement des systèmes multitâches mais aussi des systèmes multi-utilisateurs. Cela signifie que plusieurs utilisateurs peuvent utiliser un même ordinateur en même temps en mode graphique, en telnet, ssh. Il est même possible de démarrer un programme graphique à distance en indiquant que l'affichage se fait sur le système distant.

Un système multi-utilisateur c'est bien mais il ne faudrait pas que ce que fait un utilisateur puisse planter l'ordinateur... ou qu'il puisse avoir accès à des informations auxquelles il n'aurait pas droit.

C'est la qu'intervient la gestion des permissions, héritée de Unix et toujours d'application aujourd'hui.

Le système de permissions
Le mieux pour découvrir le système de permission c'est de se pencher sur la commande ls -l  qui liste les fichiers avec leurs permissions.

Admettons que nous avons le fichier xfile.mp3, nous allons lister ses permissions.

[domeu@dom-pc ~ $] ls -l xfile.mp3
-rw-rw-r-- 1 domeu domeu 1097374 Sep 26 18:48 xfile.mp3

Décortiquons l'information:
  • - : Le premier caractère indique s'il s'agit d'un fichier (-) ou d'un répertoire (d)
  • rw-rw-r-- : Les permissions (r: read=lecture, w: write=écriture, x=execution) mais nous y revenons ci-dessous.
  • 1 : indique le nombre de liens vers le fichier
  • domeu : propriétaire du fichier (dit owner). L'utilisateur est domeu.
  • domeu : groupe auquel appartient le fichier (ici le groupe est celui de l'utilisateur mais pourrait être dialout, adm, plugdev, etc).
  • 1097374 : La taille du fichier
  • Sep 26 18:48 : La date de dernière modification du fichier
  • xfile.mp3 : le nom du fichier
Les droits d'accès au fichier:
Les droit d'accès sont repris sous forme de regroupement de 3 lettres rwx indiquant respectivement que le droit de lecture (r) est activé, d'écriture (w) est activé ou d'exécution (x) est activé. Lorsqu'un droit est activé, la lettre est visible sinon elle est remplacée par un tiret.

La description reprends 3 groupes de 3 lettres.
  • rw- : Premier groupe de 3 lettres. Indique les droits du propriétaire du fichier.
    L'utilisateur domeu peut lire (r), écrire (w) mais ne peut pas exécuter le fichier.
  • rw- : Deuxième groupe de 3 lettres. Indique les droits des utilisateurs attachés au groupe du fichier (groupe "domeu" dans ce cas).
    Les utilisateurs du groupe "domeu" peuvent lire (r), écrire (w) mais pas exécuter le fichier
  • r-- : troisième groupe de 3 lettres. Indique le droit des autres utilisateurs.
    lecteur (r) uniquement. Les droit w et x ne sont pas disponibles. 
Droit d'accès sur répertoire:
Il est utile de faire remarquer que le droit 'x' (exécution) à une signification différente dans le cas d'un répertoire. Dans le cas d'un répertoire, x autorise la lecture du contenu du répertoire.

Examinons un autre cas:
ls -l /bin/bash
-rwxr-xr-x 1 root root 316848 Feb 27  2000 /bin/bash

Le premier "-" indique que c'est une fichier.
Ensuite, "rwx" indique de l'utilisateur "root" peut lire (r), écrire/modifié (w) et exécuter (w) le fichier.
Le groupe suivant "r-w" indique de tout utilisateur du groupe "root" peut lire et exécuter le fichier (mais pas le modifier, seul l'utilisateur root à ce droit).
Le troisième groupe, également "r-w", signifie que tous les utilisateurs du système peuvent lire le fichier et l'exécuter.

Changer les permissions d'un fichier
La commande chmod permet de modifier les permissions sur un fichier.
Il y a deux façons de modifier les droits sur un fichier mais nous allons nous attacher à la méthode la plus répandue.

Il est facile de concevoir les droits d'accès comme des bits.
rwx rwx rwx = 111 111 111
rw- rw- rw- = 110 110 110
rwx --- --- = 111 000 000

Pour les différentes valeurs possibles, nous retrouvons:
rwx = 111 en binaire = 7
rw- = 110 en binaire = 6
r-x = 101 en binaire = 5
r--- = 100 en binaire =4

Grâce à cela, nous pouvons représenter les 3 groupes de permissions rwx pour le propriétaire, group et autres) à l'aide de 3 chiffres consécutifs.
Ainsi 600 donne les droits rw- pour le propriétaire, rien pour le groupe et rien pour les autres utilisateurs.

l'instruction serait alors:
chmod 600 le_fichier

Voici quelques séries de valeurs des permissions les plus répandues sur les fichiers:
  • 777 - (rwxrwxrwx) aucune restriction. tout le monde peut tout faire. Cette configuration n'est pas souhaitable.
  • 755 - (rwxr-xr-x) le propriétaire du fichier peut le lire, l'écrire, l'exécuter. Tous les autres peuvent le lire et l'exécuter. Cette configuration est habituelle de pour les programmes utilisés par tous les utilisateurs.
  • 700 - (rwx------) seul le propriétaire du fichier peut l'utiliser. Les autres ne peuvent rien faire avec. Cette configuration est utiliser pour les programmes utilisables uniquement par l'utilisateur (et que les autres ne peuvent pas voir où utiliser).
  • 666 - (rw-rw-rw-) tous les utilisateurs peuvent lire et écrire dans les fichiers (mais pas les exécuter). Si vous rencontrez des problèmes de permissions, cette option sera vous tirer facile d'un mauvais pas. Attention, cela reste quand même très permissif.
Changer les permissions d'un répertoire
Comme précisé plus avant dans l'article le "x" à une signification différente lorsqu'il s'agit d'un répertoire.
Comme un répertoire ne s'exécute pas, le "x" sera utilisé pour permettre l'accès au contenu du répertoire (comprenez "lire ce qu'il y a dedans").

Voici quelques séries de valeurs des permissions les plus répandues sur les répertoires:
  • 777 - (rwxrwxrwx) aucune restriction. tout le monde lister le contenu du répertoire, créer ou effacer des fichiers. Cette configuration n'est pas souhaitable.
  • 755 - (rwxr-xr-x) le propriétaire à tous les droits. Les autres utilisateurs peuvent lister le contenu et lire les fichiers. Par contre, les autres utilisateurs ne peuvent pas écrire/effacer des fichiers. Cette configuration est typique pour les répertoires que vous voulez partager avec d'autres utilisateurs.
  • 700 - (rwx------) le propriétaire à tous les droits. Les autres utilisateurs n'ont aucun droit. Cette configuration est pratique pour les répertoires qui doivent reste disponibles uniquement pour le propriétaire.
Changer le propriétaire d'un fichier
Nous l'avons vu, le propriétaire du fichier est quelqu'un de particulier.
Il est donc intéressant de pouvoir modifier/changer le propriétaire d'un fichier/répertoire... c'est ce que fait la commande chown.

Cette instruction se fait en mode super utilisateur, il faut donc utiliser un sudo pour changer le propriétaire d'un fichier.

sudo chown nouveau_propriétaire le_fichier

Changer le groupe d'un fichier
Le propriétaire d'un fichier n'est pas le seul à disposer de droit particulier, il y a aussi le groupe.
En associant des utilisateurs à un groupe donné, vous pouvez leur donner un droit d'accès particulier sur un fichier ou répertoire (même si il n'en est pas propriétaire).
Par exemple, ce serait le cas si l'on voulait autoriser l'accès sur des données comptables pour tous les personnes du service comptabilité.

Pour changer le groupe d'un fichier/répertoire, l'on utilise la commande chgrp.
Tout comme chown, il faut être super utilisateur pour modifier cette information (il faut donc utiliser un sudo).



sudo chgrp nouveau_groupe le_fichier


Les utilisateurs et stockage des utilisateurs
Gestion multi-utilisateurs c'est bien, assignation des permission c'est cool mais faut-il encore savoir comment créer des utilisateurs.
J'ai trouvé l'article The Complete Guide to “useradd” Command in Linux vraiment très bien fait, en voici l'essence.  

Création d'un utilisateur:
pour créer un utilisateur, il faut utiliser la commande useradd et passwd (pour assigner son mot de passe).

$ sudo useradd minty
$ sudo passwd minty
Changing password for user minty.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.


Lister les utilisateurs
Les informations utilisateurs sont stockés dans le fichier /etc/passwd
En inspectant le contenu de ce fichier, nous apprenons plein de choses intéressantes:

more /etc/passwd

Contenu de /etc/passwd
Nous y retrouvons les informations suivantes (en dernière ligne):
  • minty - nom de l'utilisateur
  • x - le mot de passe, toujours 'x' car il est stocké dans le fichier encrypté /etc/shadow
  • 1001 - cette première valeur est l'UID (identification de l'utilisateur)
  • 1001 - cette seconde valeur est le GUI (identification du groupe, par défaut, chaque utilisateur dispose de son propre groupe).
  • (vide) - cette zone vide contient une information sur l'utilisateur (commentaire comme le prénom+nom de l'utilisateur). Cette zone peut être remplie au moment de la création de l'utilisateur ou remplie par la commande finger.
  • /home/minty - répertoire 'home' de l'utilisateur.
  • (vide) - cette dernière zone contient la commande shell. Cette dernière peut être précisée au moment du useradd (par exemple: /bin/bash) mais peut également être /usr/sbin/nologin (pas de login possible mais ssh autorisé, plus d'info sur nologin ici) ou /bin/false (l'utilisateur ne peut pas se logger)
Ajouter des groupes à un utilisateur
Il est possible d'ajouter un ou plusieurs groupes pour un utilisateur. Cela se fait à l'aide de l'instruction.

useradd -G admins,webadmin,developers minty

Plus d'information sur l'utilisateur
La commande id permet d'obtenir plus d'information sur l'utilisateur courant (ou l'utilisateur désigné dans la commande)

$ id minty
uid=1001(minty) gid=1001(minty) groupes=1001(minty)


Ajouter un groupe
Nous avons pas mal parlé des utilisateurs, des groupes et des droits.
Il manque encore une commande, celle qui permet de créer un groupe.

groupadd nom_du_groupe

Il ne reste plus qu'a ajouter ce groupe pour les utilisateurs concerné.

useradd -G nom_du_groupe minty
  
Ressources

Aucun commentaire: