Aujourd’hui je vous propose de capitaliser sur l’article de la semaine dernière où je vous introduisais les notions d’user, de group et de permissions sur les fichiers et dossiers. On va être un peu plus les mains dans le cambouis et je vais vous montrer comment créer des groupes et y mettre des utilisateurs, comment changer la propriété des fichiers et dossiers, et comment changer les droits sur ces derniers.
Tout un programme à base de bonnes vieilles lignes de commandes donc : youpi !

Users
Commençons par le commencement : les utilisateurs. Vous pouvez lister les utilisateurs de votre machine de différente façon, mais la plus directe reste la consultation du fichier /etc/passwd :
> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
...
prims:x:1001:1001:Prims,,,:/home/prims:/bin/bash
Je vous passe le détail des lignes qui s’affichent, on y reviendra sûrement une autre fois. Retenez par contre que le premier élément de chaque ligne (root, daemon, games, prims…) est un utilisateur déclaré de la machine, donc quelqu’un à qui peuvent appartenir des fichiers par exemple.
Il est possible de créer un nouvel user avec la commande useradd. Cette commande nécessite toutefois des droits étendus, sujet que nous aborderons la semaine prochaine.
Une fois l’utilisateur créé, il faut lui attribuer un mot de passe avec la commande passwd.
Dans les faits, les deux lignes de commande à utiliser sont les suivantes (ne faites pas attention au mot clé sudo, on s’en reparle très bientôt).
> sudo useradd toto
> sudo passwd toto
Changing password for user username.
New password:
Retype new password:
passwd: password updated successfully
Vous noterez au passage pour ceux qui n’en ont pas l’habitude que les systèmes linux n’affichent pas de “caractères masqués” à la saisie d’un mot de passe. Pas de “********” ou “••••••” comme le ferait Windows donc ! Cela peut dérouter au premier abord mais cela offre une sécurité supplémentaire : quelqu’un qui regarde par-dessus votre épaule ne sait pas de combien de caractères se compose votre mdp.
Enfin, si vous avez essayé les lignes ci-dessus et que vous voulez faire le ménage, vous pouvez supprimer un utilisateur avec la commande userdel.
> sudo userdel toto
Soyez très prudent avec cette commande : elle ne demande pas de confirmation et elle est irréversible.
Groups
Maintenant qu’on sait comment gérer les comptes utilisateur, il convient de s’attarder un moment sur la gestion des groupes.

On peut lister les groupes de notre machine de différentes façons mais la plus complète reste d’afficher le contenu du fichier /etc/group :
root:x:0:admin
daemon:x:1:
games:x:20:
...
prims:x:1001:
webdev:x:1003:prims
appdev:x:1004:prims,tromax
Ici, on a deux informations très utiles : le premier élément de chaque ligne est le nom d’un groupe unique de la machine et le dernier élément liste les utilisateurs qui appartiennent à ce groupe.
Notez qu’on retrouve nos noms d’utilisateur dans nos noms de groupes. En effet, chaque utilisateur dispose d’un groupe qui lui est propre et dont il est automatiquement membre. Ainsi par exemple le groupe games contient l’utilisateur games malgré l’absence d’utilisateurs listés sur cette ligne.
Il est possible de récupérer la liste des groupes auxquels appartient un utilisateur avec la commande groups. Sans argument particulier, cette commande liste les groupes auxquels appartient l’utilisateur courant. Si on met un nom d’utilisateur en argument, cela listera les groupes auxquels appartient cet utilisateur à la place.
> groups
prims webdev appdev
> groups toto
toto : toto appdev
Pour créer un nouveau groupe, on utilise la commande groupadd. On peut alors ajouter un utilisateur dans ce groupe avec la commande usermod qui permet de modifier les informations d’un utilisateur avec des argument appropriés (-a -G permet d’ajouter un ou plusieurs groupes à l’utilisateur ; attention, la majuscule est importante). Enfin, la commande groupdel, à utiliser avec autant de prudence que userdel, permet de supprimer un groupe.
> sudo groupadd titi
> sudo usermod -a -G titi prims
> groups prims
prims : prims webdev appdev titi
> sudo groupdel titi
> groups prims
prims : prims webdev appdev
Notez qu’on peut enlever un utilisateur d’un groupe avec la commande usermod et les options -r -G (encore une fois, la majuscule est importante) :
> sudo usermod -r -G appdev prims
> groups prims
prims : prims webdev
Propriété des entités
Maintenant qu’on sait comment créer et gérer nos différents utilisateurs et groupes, il convient de se demander comment on leur attribue des fichiers.
On rappelle qu’on peut lister les propriétés détaillées de nos fichiers en ajoutant l’option “-l” de ls (j’utilise -al dans les faits pour afficher aussi les entités cachées).
> ls -al
drwxr-xr-x 3 prims devs 4096 Jun 27 14:51 .
-rw-rw-r-- 1 prims devs 0 Jun 27 14:51 bar
drwxr-xr-- 2 prims devs 4096 Jun 27 14:51 foo
drwxr-xr-x 23 prims devs 4096 Jun 27 14:50 ..
Ici, les entités listées sont la propriété de l’utilisateur “prims” et du groupe “devs”. Dès lors, les droits listés à gauche s’y réfèrent. Par exemple, pour “foo”, “rwx” sont les droits de “prims” et “r-x” sont les droits des membres du groupe “devs”.
Lorsqu’on souhaite changer l’utilisateur propriétaire d’une entité, on utilise la commande chown (encore une fois, ne faites pas attention au mot-clé sudo, qu’on traitera la semaine prochaine).
> sudo chown games bar
> ls -al
drwxr-xr-x 3 prims devs 4096 Jul 5 10:51 .
-rw-r--r-- 1 games devs 0 Jul 5 10:51 bar
drwxr-xr-- 2 prims devs 4096 Jul 5 10:51 foo
drwxr-xr-x 24 prims devs 4096 Jul 5 10:51 ..
A partir de maintenant, “prims” n’a plus les droits d’écriture sur le fichier bar. En effet, seul l’utilisateur propriétaire de “bar” a ce droit et c’est désormais “games” qui endosse ce rôle.
Supposons maintenant qu’on veuille changer le groupe propriétaire d’une entité. La commande ad-hoc est alors chgrp, qu’on utilise tout aussi simplement :
> sudo chgrp prims foo
> ls -al
drwxr-xr-x 3 prims devs 4096 Jul 5 10:51 .
-rw-r--r-- 1 games devs 0 Jul 5 10:51 bar
drwxr-xr-- 2 prims prims 4096 Jul 5 10:51 foo
drwxr-xr-x 24 prims devs 4096 Jul 5 10:51 ..
Ce faisant, puisque personne d’autre que “prims” n’est membre de son groupe éponyme, on vient de s’assurer que lui a des droits complets sur ce dossier “foo”. Tout autre utilisateur n’a que les droits de lecture (donc possibilité de lister le contenu), mais pas d’écriture ni de traversée de ce dossier.
Redéfinition des permissions

Bon c’est bien beau, on peut désormais changer l’user et le groupe associé à nos entités, mais on reste dépendant des permissions qui étaient déjà listées pour ces dernières, ce qui n’est pas très utile…
Pour obtenir tout le contrôle et la finesse que l’on souhaite, il faudrait qu’on puisse redéfinir ces permissions. Pour cela, une seule commande : chmod.
Il existe deux façons d’utiliser chmod : par masque ou par explicitation des droits. On va étudier les deux méthodes après une petite introduction sur les champs de bits.
Bitfield, c’est quoi ?
Un bitfield ou champ de bits est une façon usuelle de représenter des propriétés booléennes (oui ou non, vrai ou faux, noir ou blanc, bien clair et tranché parmi deux valeurs quoi) multiples d’un même objet en les stockant dans une valeur numérique unique.
Prenons par exemple des propriétés d’affichage :
- Ratio 4:3 (bit à 0) ou 16:9 (bit à 1)
- Orientation portrait (bit à 0) ou paysage (bit à 1)
- Palette en noir et blanc (bit à 0) ou couleurs (bit à 1)
On pourrait traîner trois entiers pour garder ces informations avec nous ou être malin et prendre un entier unique (qui de nos jours contient 32 ou 64 bits, donc largement assez pour nos trois paramètres) en disant que les trois bits de poids faible représentent nos trois paramètres.
Ainsi, le paramètre fixé à 5, donc de représentation binaire 0101 est 16:9 portrait et couleur, tandis que ce même paramètre fixé à 6 (0110) désigne un affichage 4:3 paysage et couleur. Vous saisissez ?
Ce genre de pratique est très courante et est une bonne habitude à prendre pour sauver de la mémoire (stockage et/ou mémoire vive selon le cas) dans vos développements.
Ça peut paraître faible comme gain vu comme ça mais on parle d’une compression de facteur 1/3 sur cet exemple simple, qu’on pourrait pousser à 1/32 si on avait 32 paramètres stockés dans un entier de 32 bits. Imaginez le gain si vous gérez une base de données qui stocke les informations d’un million d’objets différents : on commence à parler de 40 Mo versus 1,28 Go par exemple.
Vous voyez le gain dont on parle ? Gardez ça en tête et répandez la bonne parole auprès des porcasse de votre entourage : à l’ère où l’écologie est une considération vitale, il ne faut pas négliger les optimisations de taille et de temps de calcul sous prétexte que les capacités de nos CPU et GPU et quantités de RAM et tailles de stockages disponibles sur les machines modernes sont infinies par rapport à ce qu’on faisait il y a 15 ans !
Petite prédiction de Madame Prirma à ce sujet : la 5G étant en fort essor en France, notre belle 4G ne sera bientôt plus capable de gérer les flux de données courants. Pourquoi ? Les développeurs vont arrêter de faire gaffe à la taille des ressources car la bande passante est beaucoup plus importante. Résultat : la 4G ne servira bientôt plus à rien, à l’instar de ce qu’est devenue la 3G ces dernières années, c’est à dire un résidu de rien à peine bon pour envoyer un MMS.
CHMOD par masque

Maintenant que vous êtes des champions du bitfield, on va voir comment utiliser la fonction chmod par masquage. Derrière ce terme qui fait peur, on veut en fait simplement parler du fait de représenter les droits comme étant des bitfields :
- Le bit de poids faible représente l’exécution / droits de traversée
- Le bit central représente l’écriture
- Le bit de poids fort représente la lecture
On va donc donner à chmod trois chiffres représentant séquentiellement les droits du user propriétaire, les droits du groupe propriétaire puis les droits des utilisateurs lambdas.
Un cas pratique ? Supposons que le fichier “bar” soit finalement un exécutable mais qu’on veuille que seuls “prims” et les membres du groupe “devs” puissent l’exécuter. En revanche, on veut que tout le monde puisse lire le fichier mais que seul “prims” puisse l’écrire.
En résumé, on veut “rwx” pour “prims”, “r-x” pour le groupe “devs” et “r–” pour les autres, soit 7 puis 5 puis 4 en utilisant la notion de bitfield. Facile, non ?
> sudo chmod 754 bar
> ls -al
drwxr-xr-x 3 prims devs 4096 Jul 5 10:51 .
-rwxr-xr-- 1 games devs 0 Jul 5 10:51 bar
drwxr-xr-- 2 prims prims 4096 Jul 5 10:51 foo
drwxr-xr-x 24 prims devs 4096 Jul 5 10:51 ..
CHMOD par droits explicites
Il existe une autre façon d’utiliser chmod. Elle est plus intuitive pour les débutants mais elle gère les permissions une à une, ce qui rend son utilisation plus fastidieuse qu’en utilisant le masquage car on a besoin de plusieurs commandes pour parvenir aux mêmes résultats.
Pour cette utilisation de la commande chmod, on utilise la même symbolique que celle utilisée par ls : ‘r’ pour la lecture, ‘w’ pour l’écriture et ‘x’ pour l’exécution / la traversée de répertoire. On associe à ces permissions les symbole ‘+’ ou ‘-‘ selon qu’on veut ajouter ou retirer un droit, et on précise aussi de qui on veut modifier les permissions : ‘u’ pour l’user propriétaire, ‘g’ pour le groupe propriétaire ou ‘o’ pour les utilisateurs lambdas. On peut utiliser aussi ‘a’ ou laisser vide pour appliquer le changement aux trois catégories en même temps.
Donc par exemple chmod u+x ajoute l’exécution à l’utilisateur propriétaire, chmod -w (ou chmod a-w) enlève les droits de lecture pour tout le monde ou encore chmod g+r ajoute les droits en lecture pour les membres du groupe propriétaire.
> sudo chmod -x bar
> ls -al
drwxr-xr-x 3 prims devs 4096 Jul 5 10:51 .
-rw-r--r-- 1 games devs 0 Jul 5 10:51 bar
drwxr-xr-- 2 prims prims 4096 Jul 5 10:51 foo
drwxr-xr-x 24 prims devs 4096 Jul 5 10:51 ..
> sudo chmod g+w bar
> ls -al
drwxr-xr-x 3 prims devs 4096 Jul 5 10:51 .
-rw-rw-r-- 1 games devs 0 Jul 5 10:51 bar
drwxr-xr-- 2 prims prims 4096 Jul 5 10:51 foo
drwxr-xr-x 24 prims devs 4096 Jul 5 10:51 ..
La sécurité comme maître mot
Encore et toujours, j’aimerais vous rappeler avant qu’on ne se quitte qu’une bonne gestion dans la définition des propriétaires et des permissions est une pierre essentielle à l’édifice de la sécurité de votre machine. Soyez donc vigilants lorsque vous touchez à tout ça et essayez toujours de coller au plus proche des droits qui sont absolument nécessaires sans en mettre trop.
Ouvrir les vannes à fond sans discernement est toujours une mauvaise idée : le temps de réflexion que vous allouerez à la gestion des droits portera automatiquement sur fruits du côté de la sécurité et l’alternative – à savoir repenser tous les droits à postériori suite à un mauvais audit de sécurité – est une plaie innommable !

Leave a Reply