Debian – permissions, utilisateurs et groupes

Lorsque l’on est amené à travailler sur une station debian, ou debian-based (Mint, Ubuntu, ElementaryOS…), il arrive que l’on doivent effectuer des opérations sur les groupes et les utilisateurs. Oui, je sais, ça fais peur ce terminal tout noir et peu accueillant, mais une fois apprivoisé, on se rends vite compte que connaître les rudiments des commandes permettant d’effectuer les actions les plus courantes est un gros plus. De manière plus générale, étant donné le rôle essentiel joué par les groupes et utilisateurs dans le fonctionnement même de Linux, il est toujours bien de savoir un minimum comment cela fonctionne. Respirez, c’est parti.

Le système de permission de Linux

Sur Linux, chaque fichier et chaque programme (pléonasme, Didier Deschamps si tu m’entends) appartient à un utilisateur donné (qui appartient à un ou plusieurs groupes), un groupe, et possède des permissions. Il existe 3 permissions sur Linux : Lire, écrire et exécuter. Et les fichiers ont ces trois permissions pour trois types d’utilisateurs : Le propriétaire du fichier, les utilisateurs du groupe du fichier, et tous les autres utilisateurs du système. Prenons un exemple concret :

Le fichier foo.bar appartient à « Elliot », un utilisateur de notre machine linux, et appartient au groupe primaire d’Elliot, « fsociety » (toute référence à une série sur laquelle je compte écrire un article prochainement ne serai que fortuite).

Ce fichier aura trois ensemble de permissions, contenants chacun les trois permissions possible (rappel : lire, écrire, exécuter).

  • Le premier ensemble concernera Elliot, le propriétaire du fichier
  • Le deuxième ensemble concerna les utilisateurs se trouvant dans le groupe du fichier (« fsociety »)
  • Le troisième ensemble concernera tous les autres utilisateurs qui ne se trouve pas dans le groupe « fsociety »

Vous suivez toujours ? Bien. Les permissions peuvent s’afficher de deux manières différentes :

L’affichage avec des lettres

L’affichage avec des lettres fonctionne de la manière suivante :

  • La permission lecture s’écrit « r » (pour read = lire en anglais)
  • La permission écriture s’écrit « w » (pour write = écrire en anglais)
  • La permission exécuter s’écrit « x » (pour execute = exécuter en anglais)

Les trois permissions pour chaque ensemble s’écrit donc rwxrwxrwx. La première série de rwx concerne Elliot, la deuxième les membres du groupe « fsociety » et la troisième tous les autres utilisateurs du système.

Ainsi donc, si nous voulons que Elliot puisse lire, écrire et exécuter le fichier, que les utilisateurs du groupe fsociety puisse le lire et l’exécuter, et que les autres utilisateurs puissent uniquement le lire, nous l’écrirons de la manière suivante :

rwxr-xr– (En plus lisible : rwx . r-x . r-- )

L’affichage avec des chiffres

L’affichage avec des chiffres, au contraire se base sur une addition de chaque permission pour obtenir un chiffre par ensemble. Voyons :

  • Le droit de lecture, (read) vaut 4
  • Le droit d’écriture, (write) vaut 2
  • Le droit d’exécution, (execute) vaut 1
  • Ainsi donc, le droit de lecture et écriture vaut 6
  • Ainsi donc, le droit de lecture et exécution vaut 5
  • Ainsi donc, le droit d’exécution et écriture vaut 3
  • Ainsi donc, le droit de lecture, écriture et exécution vaut 7

En reprenant notre exemple précédent, on l’écrira maintenant de la manière suivante :

754

Les cas spéciaux n°1 : la suppression

Pour supprimer un fichier, les droits du fichier ou du dossier ne sont pas importantes, mais vous devez avoir les permissions d’écriture et d’exécution sur le répertoire parent.

Les cas spéciaux n°2 : Les droits spéciaux

Ben oui, c’était beaucoup trop simple jusqu’à maintenant, là ça se complique un peu, mais pas de panique, voyons cela :

Le « Set-User-ID » (abrégé par la lettre « s« ) : Il permet à tous les utilisateurs d’exécuter le programme avec les droits du propriétaire (c’est le cas notamment de sudo)

Exemple :

-rwsr-xr-x  1 root   root     155008 févr. 10  2014 sudo*

(J’en profite pour vous dire que le premier tiret dans ce résultat d’un listage de répertoire en console peux être la lettre d si le fichier est un dossier, et un tiret  dans le cas contraire)

Ainsi dans cet exemple le programme sudo sera exécuté en root même si Elliot le lance.

Le « Set-Group-ID » fais la même chose que le Set-User-ID, mais pour le groupe.

Exemple :

-rwxr-sr-x  1 root   ssh      284784 mai   12  2014 ssh-agent*

Dans cet exemple, le fichier s’exécutera avec son groupe plutôt que celui de l’utilisateur : si Elliot le lance, il s’exécutera avec le groupe ssh et non fsociety.

Cas particulier : Si un fichier est un dossier et non un exécutable, Cette permission change de fonction et va faire en sorte que les fichiers crées dans ce répertoire appartiennent au groupe de celui-ci et non au groupe primaire de l’utilisateur qui les crées.

Exemple : Assumé ce répertoire :

drwxrwsrwx  1 root   root     284784 mai   12  2014 home

Si Elliot crée un fichier dans ce répertoire, il appartiendra au groupe root et non fsociety

Et le « Sticky » (abrégé t) restreint la suppression du fichier à son propriétaire : c’est le cas du dossier tmp.

Exemple :

drwxrwxrwt   2 root root  4096 nov.  28 13:17 tmp/

Vous remarquerez que les permissions du dossier tmp donnent les droit de lecture, d’écriture et d’exécution à tous les utilisateurs du système. Mais ce t situé à la place du dernier x va empêcher les autres utilisateurs que le propriétaire de supprimer ce fichier. (À l’exception du root, qui peux tout faire !)

Voyons maintenant comment s’écrivent ces bits spéciaux avec la notation en chiffre : on rajoute un quatrième chiffre avant les autres, de cette manière :

0777

Ce 0 ne crée aucun bit spécial et est donc l’équivalent de 777. Pour ajouter ces droits spéciaux, il suffit de les additionner comme pour le reste selon les valeurs suivantes :

  • Le Set-User-ID vaut 4
  • Le Set-Group-ID vaut 2
  • Le Sticky vaut 1

Ainsi donc pour mettre Set-Group-ID et Sticky sur un fichier, cela donne :

3777 (par exemple)

Les commandes à connaitre pour gérer les permissions

Après toute cette théorie, voyons maintenant les commandes les plus utiles concernant les permissions.

Tout d’abords, la commande

ls -l [,mon_repertoire]

Si un répertoire est fourni, cette commande liste tous les fichiers et dossiers de ce répertoire. Sinon, il fais la même chose avec le répertoire courant

Ensuite viens la commande chown. Sa syntaxe est la suivante :

chown [,args] user:group mon_fichier

Cette commande change le propriétaire et le groupe d’un fichier (nb : Pour effectuer cette action, il faut avoir tous les droits sur le fichier, à savoir 7)

Liste des arguments les plus utiles :

  • -R : Opère sur les fichiers et dossiers de manière récursive
  • -L : Traverse les liens sympboliques qu’il rencontre
  • --no-preserve-root : Par défaut le répertoire racine (« / ») est protégé contre ces commandes potentiellement dévastatrices. Cet argument désactive cette protection. Si vous voulez foutre en l’air le système de quelqu’un de manière permanente… 😀

La commande Chmod pour finir : changer les droits des fichiers

Cette commande peux avoir deux syntaxes, selon que vous voulez utiliser la notation des permissions en lettres ou en chiffres

En lettres :

chmod [,args] u+x,g-w fichier

u+x,g-w ? Quésaco ? Deux modifications dans les permissions (u+x et g-w) séparées par une virgule (on peux en mettre autant qu’on veux, c’est pas beau ?)

On trouve donc dans cette syntaxe une lettre, suivi d’un opérateur plus ou moins, et une ou plusieurs permissions (r, w et x, vous vous rappelez ?)

La lettre au début désigne pour qui les permissions vont changer, parmi les suivantes :

  • u : le propriétaire du fichier
  • g : le groupe du fichier
  • o : tous les utilisateurs qui ne sont pas dans le groupe du fichier
  • a : tous les utilisateurs

u+x ajoute donc la permission d’exécution pour le propriétaire, g-wx retire les permissions d’écriture et d’exécution au groupe, etc…

En chiffres :

Pour les chiffres, c’est cette syntaxe, plus expéditive, qui est utilisée :

chmod [,args] 0777 fichier

Cette fois c’est la notation avec les valeurs des trois ensembles de permissions et des bits spéciaux qui est utilisé pour fixer toutes les permissions d’un coup. On n’a pas toute la journée !

Liste des arguments les plus utiles :

  • -R : change récursivement les droits des dossiers enfants
  • --no-preserve-root : Pour foutre e… ah, j’en ai déjà parlé juste au dessus.

Les utilisateurs et les groupes

C’en est terminé pour la prise de tête. Vous avez maintenant le « background » nécessaire pour comprendre que sur linux, les groupes sont partout et que chaque fichier, dossier, programme, lien symbolique, etc… appartient à un utilisateur et à un groupe, et sont verrouillés par leurs permissions. Cette manière de compartimenter le système est ce qui fais la force de linux en terme de sécurité, à savoir s’assurer qu’un programme n’aura pas d’accès aux éléments du système ou des autres programmes qui ne le concerne pas. (A part si exécuté en root, mais là vous cherchez un peu quand même :-p )

Concentrons nous sur les commandes les plus utiles pour gérer les utilisateurs et les groupes. On commence tout de suite avec la première commande

Voir les groupes d’un utilisateur

Pour voir dans quel(s) groupe(s) se trouve un utilisateur, c’est la commande groups qui est utilisée. Syntaxe :

groups user

Une capture de la sortie de cette commande :

Capture du 2015-10-23 23:15:27

Voilà donc tous les groupes dans se lequel se trouve l’utilisateur « adam » sur mon système. Si vous ne précisez pas le nom de l’utilisateur, c’est l’utilisateur courant (vous) qui sera utilisé comme argument.

Lister tous les groupes du système

Pour une raison ou une autre vous pourriez vouloir connaître tous les groupes se trouvant sur votre système. Voilà la commande :

cut -d: -f1 /etc/group

Vous obtenez la liste de tous les groupes. Y’en a plutôt pas mal hein ?

Ajouter un groupe

Pour ajouter un nouveau groupe au système, rien de plus simple :

sudo groupadd mon_group

Si le groupe existe déjà, l’opération échouera avec un message. Chaque groupe possède un identifiant entre 1 et 999. Si vous ne le préciser pas, un identifiant plus grand que le plus grand existant et inférieur à 999 sera assigné. Si vous voulez le préciser, vous pouvez le faire de la manière suivante :

sudo groupadd mon_group -g 68

Pour donner l’id 68 à ce groupe. Si l’id est déjà assigné à un groupe, l’opération échouera également avec un message.

Renommer / modifier un groupe 

Pour modifier le nom ou l’id d’un groupe, voila la commande :

sudo groupmod -n nouveau_nom -g nouvel_id mon_group

L’argument -n permet de préciser un nouveau nom et -g un nouvel identifiant.

Supprimer un groupe

Je pense que vous commencez à comprendre le principe, voilà la commande :

sudo groupdel mon_groupe

Si des utilisateurs sont présent dans ce groupe, ils en seront retirés et le groupe supprimé.

Les utilisateurs

Chaque utilisateur à un dossier home, généralement situé dans /home, qui détermine le root de cet utilisateur.

Voilà la commande pour lister les utilisateurs :

cut -d: -f1 /etc/passwd

Ajouter un utilisateur

Si vous avez suivi, vous devriez vous douter de la commande qui va suivre :

sudo useradd nouvel_user

Arguments intéressants (optionnels) :

sudo useradd [,-d chemin_du_dossier_home, -e aaaa-mm-jj, -g group, -G [group1,group2], -N, -p mot_de_passe] nouvel_user

Détaillons ensemble ces arguments (Les réglages par défaut sont modifiables dans /etc/default/useradd:

  • -d repertoire : Permet de choisir le dossier root de l’utilisateur. Si non précisé, un dossier du même nom que l’utilisateur sera crée dans /home
  • -e aaaa-mm-jj : Permet de fixer une date d’expiration après laquelle le compte sera désactivé. Si non précisé, le compte n’expirera pas par défaut
  • -g group : Permet de définir le groupe principal de l’utilisateur. Si non fourni, un groupe du même nom sera crée
  • -G group1,group2 : Permet d’assigner des groupes secondaires à l’utilisateur
  • -N : Ne crée pas de groupe du même nom que l’utilisateur (l’argument -g doit être renseigné)
  • -p mot_de_passe : Spécifie le mot de passe de l’utilisateur. Si non fourni, l’utilisateur n’aura pas de mot de passe

Une autre manière interactive d’ajouter un utilisateur, qui va vous demander les infos au fur et à mesure mais moins configurable :

sudo adduser mon_user

Modifier un utilisateur

sudo usermod [-l nouveau_nom mon_user]

Modifie l’utilisateur. Le paramètre -l nouveau_nom permet de changer le nom d’un utilisateur. Les arguments suivants sont aussi présent et font la même chose que pour la création, mais en modifiant l’user existant : -d, -e, -g, -G

Changer le mot de passe d’un utilisateur

passwd nom_utilisateur

La console va vous demander un nouveau mot de passe UNIX et de le confirmer. Si aucun nom d’utilisateur n’est fourni, le mot de passe de l’utilisateur courant (vous) sera changé

Supprimer un utilisateur

sudo userdel nom_utilisateur

Vous devrez également supprimer à la mano le répertoire home de cet utilisateur

sudo rm -rf /repertorie/de/cet/utilisateur

(Ah si, évidemment, tenter de supprimer l’utilisateur avec lequel vous êtes connecté ne marchera évidemment pas.)

Assigner un utilisateur existant à un groupe

sudo usermod -a -G group mon_user

C’était insinué dans « modifier un utilisateur » mais c’est toujours utile de le rappeler.

Retirer un utilisateur existant d’un groupe

gpasswd -d user group

À noter que les changement prendront effet au prochain login, ce n’est pas instantané

Pour finir

C’est la fin de cet article, j’avais encore plein de choses à dire sur le sujet mais l’heure avance et ma volonté d’être exhaustif à déjà prolongé la longueur de cet article bien au delà de ce que j’aurais souhaité. À défaut d’être bref, il est au moins plutôt complet et j’espère qu’il vous sera utile par la quantité d’informations qu’il traite sur le sujet. Je vous laisse avec un cachet d’acide acétylsalicylique et vous dit à bientôt pour de nouvelles avantures !

Sources

Permissions unix (wikipedia) : https://fr.wikipedia.org/wiki/Permissions_UNIX

Doc ubuntu (permissions) : http://doc.ubuntu-fr.org/permissions

Opérations sur les groupes (en anglais) : http://www.cyberciti.biz/faq/howto-linux-add-user-to-group

 

 

 

Adam Écrit par :

Développeur web et webdesigner en Freelance passionné de code et de design. Autodidacte et amoureux de la connaissance, je suis curieux et passe mon temps à apprendre de nouvelles choses, que j'ai envie de vous faire partager !

Soyez le premier à commenter

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *