Gérer les utilisateurs
Objectif : définir qui a accès à quoi dans un système Linux.
Caractéristiques d'un système multi-utilisateurs
Linux est un vrai système multi-utilisateurs, tout comme son ancêtre Unix. Pour comprendre la portée de cette assertion, imaginez un poste de travail comme on peut en trouver dans la salle informatique d'une grande université, fréquentée par une bonne dizaine de milliers d'étudiants. Chaque étudiant inscrit a le droit d'utiliser les machines de la salle informatique. Il possède donc son identifiant personnel et son mot de passe, qui lui permettent de se connecter à une machine de la salle informatique pour y travailler, c'est-à-dire effectuer ses recherches, écrire ses devoirs, rédiger son mémoire ou sa thèse, etc. Une telle installation doit répondre à quelques exigences.
-
Chaque utilisateur du système doit disposer de son répertoire personnel, c'est-à-dire d'un endroit pour lui seul, utilisable par lui seul, où il peut stocker toutes ses données.
-
La confidentialité doit être assurée, c'est-à-dire qu'un étudiant connecté ne pourra pas aller fouiner librement dans les données de ses collègues.
-
Il ne faut pas non plus qu'un utilisateur puisse effacer par mégarde (ou même intentionnellement) les données qui ne lui appartiennent pas.
-
Enfin, l'intégrité du système ne doit en aucun cas être mise en péril par les utilisateurs.
Notre configuration de test sera beaucoup plus modeste qu'une série de postes de travail dans la salle informatique d'une université. Il n'empêche que l'approche multi-utilisateurs est tout aussi pertinente, même pour un usage sur une machine locale. Après tout, peu importe si le système gère deux ou trois utilisateurs ou vingt-cinq mille.
Techniquement parlant, une telle installation dans une université se différencie d'une installation domestique d'un poste de travail par la configuration itinérante des profils d'utilisateurs. Dans une telle configuration, l'ensemble des données, les identifiants de connexion et les mots de passe sont stockés de façon centralisée sur le serveur. À partir de là, chaque étudiant peut se connecter sur n'importe quelle machine de la salle informatique et retrouver son environnement, alors que sur une installation comme un poste de travail domestique, chaque compte d'utilisateur reste lié à la machine locale. Il existe plusieurs manières de mettre en place les profils itinérants dans un réseau local, et nous les aborderons en temps et en heure. Pour l'instant, nous nous concentrons sur la gestion locale des utilisateurs sur une seule machine tournant sous Linux.
Ajouter de nouveaux utilisateurs : useradd
Lors de la configuration post-installation, j'ai défini un premier utilisateur du "commun des mortels" pour mon système. Cela signifie que ma machine connaît déjà deux comptes :
-
l'administrateur
root
-
l'utilisateur en question (
microlinux
)
En dehors de mon utilisateur initial, je vais créer quelques comptes supplémentaires :
-
Agnès Debuf (
adebuf
) -
Jean Mortreux (
jmortreux
) -
Fanny Banester (
fbanester
) -
Franck Teyssier (
fteyssier
)
Chacun des utilisateurs sera créé à l'aide de la commande useradd
.
L'invocation de cette commande requiert des droits d'administrateur. Dans un
premier temps, nous allons acquérir ces droits de façon peu élégante, en nous
déconnectant et en nous reconnectant en tant que root
.
Je lance la création de ma première utilisatrice :
# useradd -c "Agnès Debuf" adebuf
# passwd adebuf
Changing password for user adebuf.
New password: ********
Retype new password: ********
passwd: all authentication tokens updated successfully.
Un coup d'oeil rapide dans la page man
de useradd
nous renseigne sur la
signification exacte de l'option -c
, que vous avez probablement devinée dans
le contexte.
-c, --comment COMMENT
Any text string. It is generally a short description of the login, and is
currently used as the field for the user's full name.
Notez qu'il y a une vérification sur la robustesse du mot de passe défini. Pour
un utilisateur quelconque, le système refuserait tout simplement de créer le
mot de passe s'il est faible (puisque la commande passwd
peut être invoquée
par un utilisateur pour changer son propre mot de passe). En revanche, root
a
tous les droits, y compris celui ce forcer l'utilisation d'un mot de passe trop
simple (ce que je vous déconseille néanmoins).
# useradd -c "Jean Mortreux" jmortreux
# passwd jmortreux
Changing password for user jmortreux.
New password: ****
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: ****
passwd: all authentication tokens updated successfully.
Procédez de même pour créer les autres utilisateurs de la machine.
Utiliser n'est pas administrer
Tout au long de notre initiation à la ligne de commande, nous avons travaillé en tant que simples utilisateurs – à quelques rares exceptions près – pour créer, éditer, visualiser, déplacer, copier et effacer des fichiers. Ces tâches ne mettaient pas en péril le fonctionnement du système ou les données des autres utilisateurs et ne nécessitaient par conséquent aucun privilège spécifique. Il n'en est plus de même pour la gestion des utilisateurs, qui comprend entre autres choses :
-
la création d'un nouvel utilisateur ;
-
la définition de son mot de passe ;
-
la configuration de ses droits : à quoi aura-t-il accès dans le système ?
-
la suppression éventuelle de l'utilisateur ainsi que de toutes ses données.
Changer d'identité et devenir root
Lors de l'installation du système, nous avons défini un mot de passe pour
l'utilisateur root
. Un peu plus haut, nous avons eu besoin des privilèges de
root
pour créer quelques utilisateurs supplémentaires, que nous avons acquis
en nous déconnectant et en nous reconnectant. Or, il existe un moyen bien plus
simple grâce à la commande su
(switch user, c'est-à-dire "changer
d'utilisateur"). Tapez ce qui suit, en saisissant le mot de passe root
lorsque le système vous le demande.
[microlinux@linuxbox ~]$ su -
Password: ********
Last login: Mon May 17 08:05:24 CEST 2021 on pts/0
[root@linuxbox ~]#
Notez le tiret -
qui suit la commande su
. Il précise qu'il faut devenir
root
en récupérant toutes les variables d'environnement de ce compte. Nous y
reviendrons. Contentez-vous pour l'instant de connaître la démarche.
Une mise en garde solennelle s'impose. En acquérant les droits de
root
, vous voilà en quelque sorte détenteur du fameux bouton rouge. Cela ne veut pas dire que vous allez forcément déclencher une guerre nucléaire, mais une simple commande bien sentie suffirait à enclencher une apocalypse numérique sur votre système. En un mot : prudence. Et gare aux fautes de frappe.
S'il est utile de savoir comment acquérir les pleins pouvoirs sur la machine,
il est tout aussi indispensable de savoir comment revenir en sens inverse pour
se débarrasser de tous ces super-pouvoirs lorsqu'on n'en a plus besoin. Dans ce
cas, c'est exactement la même commande que pour quitter une session dans la
console. Vous avez donc le choix entre les deux commandes logout
et exit
, à
moins que vous ne préfériez le raccourci clavier Ctrl+D.
[root@linuxbox ~]# exit
logout
[microlinux@linuxbox ~]$
Savoir qui l'on est
La commande su
ne nous permet pas seulement de devenir root
. Si le système
dispose d'un utilisateur fteyssier
, je pourrais très bien devenir fteyssier
en invoquant la commande suivante (et en saisissant son mot de passe) :
[microlinux@linuxbox ~]$ su - fteyssier
Password: ********
[fteyssier@linuxbox ~]$
Là encore, notez l'utilisation du tiret -
pour indiquer que vous souhaitez
devenir un autre utilisateur en utilisant ses variables d'environnement.
L'invite de commandes ([fteyssier@linuxbox ~]$
) nous indique qu'un changement
d'identité a eu lieu. Pour le vérifier, nous avons tout loisir de demander à
notre système qui nous sommes, grâce à la commande whoami
("Who am
I ?", "Qui suis-je ?"). Voici une petite démonstration
pratique :
[microlinux@linuxbox ~]$ su - fteyssier
Password: ********
[fteyssier@linuxbox ~]$ whoami
fteyssier
[fteyssier@linuxbox ~]$ exit
logout
[microlinux@linuxbox ~]$ whoami
microlinux
[microlinux@linuxbox ~]$ su -
Password: ********
[root@linuxbox ~]# whoami
root
[root@linuxbox ~]# exit
logout
[microlinux@linuxbox ~]$ whoami
microlinux
Vous remarquerez que si j'invoque su
sans autre argument que le tiret -
,
cela revient exactement à la même chose que su - root
.
[microlinux@linuxbox ~]$ su -
Password: ********
[root@linuxbox ~]#
En savoir un peu plus sur les utilisateurs : id, groups, finger
Chacun des utilisateurs que nous avons créés jusqu'ici possède un certain
nombre de caractéristiques, comme son UID unique, son GID, les groupes
secondaires auxquels il appartient, son répertoire d'utilisateur, son shell
de connexion, etc. Voyons maintenant comment afficher ces différentes
informations. Commençons par nous-mêmes, en utilisant la commande id
:
$ id
uid=1000(microlinux) gid=1000(microlinux) groups=1000(microlinux),10(wheel)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Invoquée sans autre argument, la commande id
nous affiche l'UID, le GID,
ainsi que la liste complète des groupes secondaires auxquels l'utilisateur est
affecté. Elle nous affiche également le contexte SELinux (Security Enhanced
Linux), que nous allons laisser de côté pour l'instant. SELinux est une
technologie quelque peu complexe, et nous l'aborderons (beaucoup) plus loin.
Afficher l'UID (User Identification) de l'utilisateur :
$ id -u
1000
Afficher le GID (Group Identification) :
$ id -g
1000
Afficher le nom du groupe :
$ id -gn
microlinux
Afficher les groupes dont l'utilisateur est membre :
$ id -G
1000 10
Afficher les noms des groupes dont l'utilisateur est membre :
$ id -Gn
microlinux wheel
Pour cette dernière commande, nous disposons d'une alternative plus courante :
$ groups
microlinux wheel
Évidemment, personne ne vous demande de retenir toutes ces options par coeur. N'oubliez pas que vous avez la page du manuel pour cela :
$ man id
Pour en savoir plus sur les autres utilisateurs du système, il suffit de fournir leur nom en argument. Ces informations sont accessibles à tous les utilisateurs non privilégiés du système.
$ id adebuf
uid=1001(adebuf) gid=1001(adebuf) groups=1001(adebuf)
$ id jmortreux
uid=1002(jmortreux) gid=1002(jmortreux) groups=1002(jmortreux)
Les arguments et les options peuvent évidemment être combinés à souhait, par exemple pour afficher l'UID d'un autre utilisateur.
$ id -u fteyssier
1004
Enfin, la commande finger
permet d'afficher quelques renseignements sur les
utilisateurs du système comme le nom, le répertoire utilisateur et le shell de
connexion utilisé. Elle ne fait pas partie du système minimal, mais nous
pouvons l'installer facilement.
# yum install -y finger
Une fois installée, la commande finger
affiche ces informations :
$ finger fteyssier
Login: fteyssier Name: Franck Teyssier
Directory: /home/fteyssier Shell: /bin/bash
Last login Mon May 17 09:00 (CEST) on pts/0
...
La gestion des utilisateurs sous le capot
Comprendre le fichier /etc/passwd
Essayons de voir un peu plus en détail comment se passe la gestion des
utilisateurs au niveau du système. Affichez le contenu du fichier
/etc/passwd
:
$ less /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
microlinux:x:1000:1000:microlinux:/home/microlinux:/bin/bash
adebuf:x:1001:1001:Agnès Debuf:/home/adebuf:/bin/bash
jmortreux:x:1002:1002:Jean Mortreux:/home/jmortreux:/bin/bash
fbanester:x:1003:1003:Fanny Banester:/home/fbanester:/bin/bash
fteyssier:x:1004:1004:Franck Teyssier:/home/fteyssier:/bin/bash
Certains d'entre vous seront peut-être vaguement surpris voire inquiets de pouvoir lire ce fichier sans autres privilèges. C'est tout à fait normal et nous y viendrons.
Le fichier /etc/passwd
contient l'ensemble des informations qui régissent la
connexion des utilisateurs. Chaque ligne de ce fichier correspond à un
utilisateur. Essayez de repérer l'entrée qui correspond à votre humble
personne :
microlinux:x:1000:1000:Microlinux:/home/microlinux:/bin/bash
Comment décrypter ce charabia ? Il s'agit en fait d'une série de champs séparés par deux-points, où l'on trouve dans l'ordre... :
-
l'identifiant de connexion (
microlinux
) ; -
la lettre
x
, signifiant que le mot de passe chiffré de l'utilisateur se situe dans le fichier/etc/shadow
; -
l'UID (User Identification, ici
1000
), que le système utilise plutôt que votre identifiant pour gérer les droits d'accès de vos fichiers ; -
le GID (Group Identification, également
1000
ici), groupe primaire auquel appartient l'utilisateur ; -
le nom complet de l'utilisateur (
Microlinux
) ; -
le répertoire de connexion (
/home/microlinux
) ; -
le shell de connexion de l'utilisateur (
/bin/bash
).
Pour être précis, le shell de connexion est la commande que le système doit exécuter lorsque l'utilisateur se connecte. En pratique, il s'agit de l'interpréteur de commandes de l'utilisateur.
Les utilisateurs système
Qui sont donc tous ces utilisateurs mystérieux sur votre système ? Vous
n'avez pas défini ces gens aux identifiants pour le moins curieux :
daemon
, operator
, nobody
... Rassurez-vous, votre machine n'est peuplée ni
par des démons, ni par des hommes invisibles. Il s'agit là des utilisateurs
système.
À titre d'exemple, si vous installez le serveur web Apache (yum install
httpd
), l'installation crée un utilisateur système apache
. Lorsque le
serveur Apache est lancé, le processus "n'appartient" pas à l'utilisateur
root
, mais à l'utilisateur système apache
. Il peut arriver (et dans le
monde réel, cela arrive effectivement) qu'une personne malintentionnée décide
d'attaquer le serveur, en exploitant une faille de sécurité. Or, si le serveur
fonctionnait avec des droits root
, cela rendrait l'attaquant tout-puissant
sur la machine. Le recours à un utilisateur système permet donc de limiter les
dégâts dans un tel cas de figure. Je vous épargne les détails complexes d'une
telle situation. Retenez juste que l'existence des utilisateurs système est
avant tout motivée par des considérations de sécurité.
Dorénavant, nous pouvons établir une classification sommaire des utilisateurs sur notre machine :
-
L'administrateur
root
, l'utilisateur tout-puissant. Son UID est toujours égal à0
. -
Les utilisateurs système, gérant les droits d'accès d'un certain nombre de services sur la machine. Leur UID est compris entre
1
et999
. -
Les utilisateurs "normaux", c'est-à-dire les personnes physiques comme vous et moi (
microlinux
,adebuf
,jmortreux
). Notre UID sera supérieur ou égal à1000
.
Comprendre le fichier /etc/shadow
Dans le bon vieux temps, le fichier /etc/passwd
contenait également les mots de
passe des utilisateurs. Ils étaient certes chiffrés, mais l'algorithme de
chiffrement utilisé à l'époque n'était pas très performant. Avec l'avènement
des processeurs de plus en plus puissants, un attaquant avait la perspective de
décrypter les mots de passe en un temps raisonnable.
Pour cette raison, les mots de passe ont été délocalisés vers le fichier
/etc/shadow
. Contrairement à /etc/passwd
, il n'est pas accessible à tout le
monde.
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
Les permissions de ce fichier sont beaucoup plus restrictives. Seul root
a le
droit d'en afficher le contenu :
# cat /etc/shadow
root:$6$nYUyqivY6aOSet2AgoLVSmGsxP5.oSFwkpb9z/1t8ZuKSn1pwbrF/::0:99999:7:::
bin:*:18222:0:99999:7:::
daemon:*:18222:0:99999:7:::
adm:*:18222:0:99999:7:::
lp:*:18222:0:99999:7:::
sync:*:18222:0:99999:7:::
shutdown:*:18222:0:99999:7:::
halt:*:18222:0:99999:7:::
mail:*:18222:0:99999:7:::
operator:*:18222:0:99999:7:::
games:*:18222:0:99999:7:::
ftp:*:18222:0:99999:7:::
nobody:*:18222:0:99999:7:::
systemd-network:!!:18762::::::
dbus:!!:18762::::::
polkitd:!!:18762::::::
sshd:!!:18762::::::
postfix:!!:18762::::::
chrony:!!:18762::::::
microlinux:$6$yF/uUl.WgLE8Nz61Q3OzEgUqTJg73hRxQZ3cG1rvJSrQc0HDo//W0::0:99999:7:::
adebuf:$6$ZmTxgZkH$FuYo6Y6CvRZvEPX03iZkk9FfLdFA/uTdrgu/:18764:0:99999:7:::
jmortreux:$6$gVvKCj/qAW6Urc4.HNLS6qART51fOFVy6g/ESzCU2Dk0.:18764:0:99999:7:::
fbanester:$6$jyI.D3ECe2zLeNl5OK6BPPOEML9ozb5s23BVYg5HePLY/:18764:0:99999:7:::
fteyssier:$6$j5GhStPf/DXRS5hSgS1SsSeGyQ6tE3MKg6PfWHsqnlG5.:18764:0:99999:7:::
À première vue, la syntaxe de ce fichier ressemble de très loin à celle que
nous avons pu trouver dans /etc/passwd
:
jmortreux:$6$gVvKCj/qAW6Urc4.HNLS6qART51fOFVy6g/ESzCU2Dk0.:18764:0:99999:7:::
Là aussi, nous disposons d'une série d'informations séparées par deux-points :
-
l'identifiant de connexion (
microlinux
) ; -
le mot de passe chiffré (
$6$gVvKCj/qAW6U...zCU2Dk0.
) ; -
la date du dernier changement de mot de passe (
18764
) ; -
l'âge minimum du mot de passe (
0
) ; -
l'âge maximum du mot de passe (
99999
) ; -
la période d'expiration du mot de passe (
7
) ; -
etc.
La syntaxe du fichier mérite quelques remarques.
-
Chacun des identifiants de connexion (
microlinux
,adebuf
,jmortreux
, etc.) est également présent dans/etc/passwd
. Ce champ peut donc être considéré comme un connecteur entre les deux fichiers. -
Les mots de passe chiffrés commencent tous par
$6$
, ce qui signifie que l'algorithme de hachage SHA-512 a été utilisé. -
Au cas où deux utilisateurs ont le même mot de passe, les empreintes correspondantes dans
/etc/shadow
seront différentes grâce au salage. -
La date de dernière modification du mot de passe (
18764
) est indiquée en nombre de jours depuis le 1er janvier 1970.
Le salage est une méthode utilisée en cryptographie. Elle permet de renforcer la sécurité des informations destinées à être hachées en ajoutant une donnée supplémentaire. Cette technique permet d'éviter que deux informations identiques conduisent à la même empreinte.
Les pages de manuel en ligne du système ne nous renseignent pas seulement sur le rôle et la syntaxe des commandes. Les fichiers de configuration du système y sont également décrits en détail.
$ apropos shadow
gpasswd (1) - administer /etc/group and /etc/gshadow
gshadow (5) - shadowed group file
...
shadow (5) - shadowed password file
...
$ man 5 shadow
Trouver les utilisateurs physiques du système
Admettons que nous voulions afficher tous les vrais utilisateurs, c'est-à-dire tous ceux qui ne sont pas des utilisateurs système. Comment nous y prendrions-nous ?
Une première approche consisterait à considérer que les vrais utilisateurs
disposent tous d'un shell de connexion, en l'occurrence /bin/bash
. Il
suffirait donc d'afficher toutes les lignes du fichier /etc/passwd
qui
contiennent la chaîne de caractères /bin/bash
ou, plus simplement, bash
.
C'est tout à fait possible. J'en profite pour vous présenter la commande
grep
.
$ grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
microlinux:x:1000:1000:Microlinux:/home/microlinux:/bin/bash
adebuf:x:1001:1001:Agnès Debuf:/home/adebuf:/bin/bash
jmortreux:x:1002:1002:Jean Mortreux:/home/jmortreux:/bin/bash
fbanester:x:1003:1003:Fanny Banester:/home/fbanester:/bin/bash
fteyssier:x:1004:1004:Franck Teyssier:/home/fteyssier:/bin/bash
L'opération ressemble à un succès. Même si root
semble être un cas à part,
les utilisateurs en chair et en os sont tous là. Or, notre approche souffre
d'un certain nombre de points faibles. Si l'un de nos utilisateurs décide de
choisir un autre shell de connexion que /bin/bash
(ce qui est tout à fait
possible), il ne s'affichera plus. Essayons donc une approche différente.
Nous avons vu plus haut que ce qui distingue les utilisateurs "en chair et en
os", c'est leur UID supérieur ou égal à 1000
. Nous avons vu également que le
fichier /etc/passwd
était organisé en colonnes séparées par des deux-points.
Je vais me servir de l'outil de filtrage awk
pour arriver à mes fins. GNU
AWK est un véritable langage de traitement de lignes qui sert à manipuler des
fichiers textes. Voyons quelques exemples simples.
La première colonne du fichier /etc/passwd
contient les noms d'utilisateurs.
$ awk -F: '{print $1}' /etc/passwd
root
bin
daemon
...
microlinux
adebuf
jmortreux
fbanester
fteyssier
L'option -F
indique à awk
que le fichier /etc/passwd
utilise les
deux-points comme séparateur, et '{print $1}'
signifie "affiche la première
colonne".
Les UID des utilisateurs figurent dans la troisième colonne. Je peux donc les "extraire" de la sorte :
$ awk -F: '{print $3}' /etc/passwd
0
1
2
3
...
1000
1001
1002
1003
1004
À partir de là, j'ai la réponse à ma question. Il suffit que j'affiche la
première colonne ($1
) de chaque ligne où le contenu de la troisième colonne
($3
) est strictement supérieur à 999
:
$ awk -F: '$3 > 999 {print $1}' /etc/passwd
microlinux
adebuf
jmortreux
fbanester
fteyssier
Enfin, je peux combiner la commande précédente avec sort
pour afficher le
résultat par ordre alphabétique :
$ awk -F: '$3 > 999 {print $1}' /etc/passwd | sort
adebuf
fbanester
fteyssier
jmortreux
microlinux
Vue détaillée sur l'ajout d'un utilisateur
La commande useradd
telle qu'on la trouve dans un système Oracle Linux
présente un comportement par défaut qui la rend immédiatement utilisable, sans
que l'on ait trop à se casser la tête sur les différentes options à spécifier.
En résumé, que se passe-t-il lors de la création simple d'un utilisateur sans
autre option, c'est-à-dire en invoquant la commande useradd
<identifiant>
?
-
L'utilisateur reçoit un UID supérieur ou égal à
1000
. Tout laisse à penser (selon le contenu de/etc/passwd
) que le système choisit le premier UID disponible à partir de1000
. -
Tous les utilisateurs sont affectés d'emblée à un groupe nommé d'après leur identifiant, dont le GID est égal à l'UID. Dans notre exemple,
jmortreux
(UID1002
) est également membre du groupejmortreux
(GID1002
). -
Un répertoire d'utilisateur est créé, et c'est l'identifiant de l'utilisateur qui servira de base pour le nommer. L'utilisatrice
adebuf
aura donc un répertoire/home/adebuf
. -
Par défaut, c'est l'interpréteur de commandes Bash (
/bin/bash
) qui sera utilisé.
Vous vous doutez probablement que les options par défaut de la commande
useradd
ne sont pas gravées dans le marbre. Elles sont fournies par les fichiers de configuration/etc/login.defs
et/etc/default/useradd
.
Les données GECOS des utilisateurs
Nous avons utilisé l'option -c
(ou --comment
) pour créer les utilisateurs
sur notre système, en fournissant le prénom et le nom correspondant en
argument. Ces données se retrouvent dans le cinquième champ du fichier
/etc/passwd
, entre le GID et le répertoire utilisateur. La page de manuel en
ligne de ce fichier (man 5 passwd
) nous dit qu'il s'agit du champ GECOS.
GECOS signifie General Electric Comprehensive Operating System, du nom d'un système d'exploitation mainframe créé originellement par la General Electric.
Le champ GECOS est une relique du bon vieux temps où les utilisateurs d'Unix
dans les entreprises et dans les universités se connectaient à un ordinateur
central par le biais d'un terminal. Il permet d'enregistrer des informations
sommaires sur un compte utilisateur. La commande finger
permet d'afficher ces
informations.
Les informations GECOS sont accessibles à tous les utilisateurs :
$ finger fteyssier
Login: fteyssier Name: Franck Teyssier
Directory: /home/fteyssier Shell: /bin/bash
Last login Mon May 17 09:00 (CEST) on pts/0
...
La commande chfn
(change your finger information d'après la page man
)
permet de modifier les informations GECOS, notamment :
-
le nom en toutes lettres ;
-
le bureau dans le bâtiment ;
-
le numéro de téléphone professionnel ;
-
le numéro de téléphone personnel.
Concrètement, voici à quoi cela ressemble :
[microlinux@linuxbox ~]$ chfn
Changing finger information for microlinux.
Name [Microlinux]:
Office []: 101
Office Phone []: 04 66 63 10 32
Home Phone []: 06 51 80 12 12
Password: ********
Finger information changed.
Ces informations sont désormais accessibles à tout le monde :
$ finger microlinux
Login: microlinux Name: Microlinux
Directory: /home/microlinux Shell: /bin/bash
Office: 101, 04 66 63 10 32 Home Phone: 06 51 80 12 12
...
Sous le capot, elles sont stockées dans le cinquième champ du fichier
/etc/passwd
et utilisent la virgule comme séparateur :
microlinux:x:1000:1000:Microlinux,101,04 66 63 10 32,
06 51 80 12 12:/home/microlinux:/bin/bash
De nos jours, on ne renseigne guère plus que le nom des utilisateurs dans ce champ. Ceci étant dit, c'est bien de connaître son rôle historique.
Le profil par défaut des nouveaux utilisateurs
Parmi les utilisateurs nouvellement créés, prenons-en un qui ne s'est pas encore connecté au système :
# finger fteyssier
Login: fteyssier Name: Franck Teyssier
Directory: /home/fteyssier Shell: /bin/bash
Never logged in.
...
Au moment de la création de son compte, son répertoire d'utilisateur se trouve apparemment vide :
# tree /home/fteyssier/
/home/fteyssier/
0 directories, 0 files
En fait, il n'est pas si vide que cela, si nous regardons d'un peu plus près :
# tree -a /home/fteyssier/
/home/fteyssier/
├── .bash_logout
├── .bash_profile
└── .bashrc
0 directories, 3 files
D'où sortent ces mystérieux fichiers .bash_logout
, .bash_profile
et
.bashrc
? Jetons un oeil dans la page man
de useradd
, dans la
section OPTIONS
:
-k, --skel SKEL_DIR
The skeleton directory, which contains files and directories to be copied
in the user's home directory, when the home directory is created by
useradd.
This option is only valid if the -m (or --create-home) option is specified.
If this option is not set, the skeleton directory is defined by the SKEL
variable in /etc/default/useradd or, by default, /etc/skel.
...
Vérifions la définition de la variable SKEL
dans le fichier
/etc/default/useradd
:
# grep SKEL /etc/default/useradd
SKEL=/etc/skel
Le répertoire squelette de notre système, c'est bien /etc/skel
. Affichons le
contenu de ce répertoire en prenant soin d'afficher les fichiers cachés :
# tree -a /etc/skel/
/etc/skel/
├── .bash_logout
├── .bash_profile
└── .bashrc
0 directories, 3 files
Cela ressemble effectivement au contenu de mon répertoire d'utilisateur nouvellement créé. Pour en avoir le coeur net, tentons une petite expérience.
Personnaliser le profil par défaut des nouveaux utilisateurs
Nous pourrions très bien imaginer la confection d'un fichier de bienvenue pour
les nouveaux utilisateurs de notre système. Dans un premier temps, nous créons
le message dans /etc/skel
:
# cat > /etc/skel/LISEZ_MOI.txt << EOF
> Bienvenue sur votre nouveau système Linux !
> EOF
Notez que vous pourriez très bien vous servir de Vi pour éditer votre message.
À présent, créons un nouvel utilisateur fantasio
:
# useradd -c "Fantasio" fantasio
# passwd fantasio
Avant même qu'il ne se connecte pour la première fois, penchons-nous sur le contenu de son répertoire d'utilisateur :
# ls -la /home/fantasio/
total 20
drwx------. 2 fantasio fantasio 83 May 17 10:34 .
drwxr-xr-x. 8 root root 4096 May 17 10:34 ..
-rw-r--r--. 1 fantasio fantasio 18 Nov 22 2019 .bash_logout
-rw-r--r--. 1 fantasio fantasio 193 Nov 22 2019 .bash_profile
-rw-r--r--. 1 fantasio fantasio 231 Nov 22 2019 .bashrc
-rw-r--r--. 1 fantasio fantasio 45 May 17 10:34 LISEZ_MOI.txt
L'utilisation de /etc/skel
ne se limite pas à l'ajout de documents par
défaut ; de manière plus générale, tout fichier peut être distribué aux
nouveaux utilisateurs. On peut donc également répliquer des configurations par
défaut du bureau ou des logiciels et définir par exemple le même fond d'écran
et le même thème d'icônes par défaut pour tous les utilisateurs. Il suffit pour
cela de repérer le fichier (ou répertoire) de configuration en question et de
le recopier dans /etc/skel
avant la création des utilisateurs.
Modifier le mot de passe d'un utilisateur
Nous avons vu que la création d'un nouveau compte comprend l'affectation d'un
mot de passe avec la commande passwd
. Celle-ci n'est d'ailleurs pas réservée à
l'administrateur. Appelée par un simple utilisateur, elle lui servira à changer
son mot de passe pour quelque chose de plus personnalisé :
[fantasio@linuxbox ~]$ passwd
Changing password for user fantasio.
Changing password for fantasio.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Il arrive assez souvent que les utilisateurs choisissent des mots de passe trop simples. Dans ce cas, le système les en empêchera et se chargera de les sermonner :
[fantasio@linuxbox ~]$ passwd
Changing password for user fantasio.
Changing password for fantasio.
(current) UNIX password:
New password:
BAD PASSWORD: The password is shorter than 8 characters
New password:
BAD PASSWORD: The password is shorter than 8 characters
New password:
BAD PASSWORD: The password is shorter than 8 characters
passwd: Have exhausted maximum number of retries for service
Notez que cette restriction ne vaut pas pour l'administrateur root
. Autrement
dit, si vous avez la mauvaise idée de définir un mot de passe simpliste comme
1234
ou azerty
pour l'utilisateur fantasio
, vous devrez le faire comme
ceci, en insistant un peu :
# passwd fantasio
Associer les utilisateurs aux groupes
La commande groups
présentée un peu plus haut nous a affiché le ou les
groupes auxquels appartient l'utilisateur. Vous pouvez vous représenter cette
appartenance à un groupe comme une carte de membre, qui vous ouvre les portes
vers des lieux dont l'accès est normalement restreint.
Sur un système Oracle Linux, chaque utilisateur nouvellement créé fait partie au minimum d'un groupe nommé d'après son identifiant :
$ groups jmortreux
jmortreux : jmortreux
Les utilisateurs membres de certains groupes bénéficient de toute une série de "privilèges", qui leur donnent accès à certaines parties du système :
$ groups microlinux
microlinux : microlinux wheel
Comment se fait-il que l'utilisateur microlinux
soit membre du groupe
wheel
? Rappelez-vous qu'il a été créé lors de l'installation initiale.
Sur un système Oracle Linux, le groupe wheel
sert avant tout à différencier
les utilisateurs qui ont le droit de se servir de la commande sudo
(nous y
viendrons). Si nous avons coché la case Faire de cet utilisateur un
administrateur
, nous avons ajouté notre utilisateur initial à ce groupe
privilégié.
Admettons que je souhaite élever l'utilisateur jmortreux
au rang
d'administrateur. Je peux l'ajouter au groupe wheel
comme ceci :
# usermod -aG wheel jmortreux
Si
jmortreux
est connecté pendant cette opération, il faudra qu'il se déconnecte et qu'il se reconnecte pour que l'ajout au groupewheel
prenne effet.
N'hésitez pas à ouvrir la page man 8 usermod
pour avoir une idée un peu plus
précise de ce que nous venons de faire.
-
usermod
modifie un compte utilisateur. -
L'option
-a
(comme--append
) ajoute l'utilisateur à un groupe supplémentaire. -
Elle s'utilise conjointement avec l'option
-G
(--groups
).
Comprendre le fichier /etc/group
Maintenant que vous êtes familiarisé avec le fonctionnement des fichiers
/etc/passwd
et /etc/shadow
, affichez le fichier /etc/group
:
# less /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
...
wheel:x:10:microlinux,jmortreux
cdrom:x:11:
mail:x:12:postfix
...
postdrop:x:90:
postfix:x:89:
chrony:x:996:
microlinux:x:1000:
adebuf:x:1001:
jmortreux:x:1002:
fbanester:x:1003:
fteyssier:x:1004:
fantasio:x:1005:
Pour comprendre en détail la syntaxe de ce fichier, nous avons développé le bon réflexe :
# apropos group
# man 5 group
Tout comme pour les utilisateurs, nous avons ici :
-
un groupe
root
avec un GID de0
; -
une série de groupes système avec des GID compris entre
1
et999
; -
les groupes correspondant aux utilisateurs, avec des GID supérieurs ou égaux à
1000
.
Dans l'exemple ci-dessus, regardez la ligne qui définit le groupe wheel
. Notez
que les membres de ce groupe sont énumérés avec une virgule comme séparateur,
et sans espace.
Supprimer un utilisateur d'un groupe
La manière la plus simple pour révoquer l'appartenance d'un utilisateur à un
groupe, c'est d'utiliser la commande gpasswd
. Admettons que jmortreux
ait
mis en péril notre installation. Nous allons le supprimer du groupe
wheel
:
# groups jmortreux
jmortreux : jmortreux wheel
# gpasswd -d jmortreux wheel
Removing user jmortreux from group wheel
# groups jmortreux
jmortreux : jmortreux
Là encore, jetez un oeil dans man gpasswd
et repérez l'option -d
comme
--delete
.
Créer et supprimer des groupes
Bien évidemment, nous ne sommes pas limités à l'utilisation des groupes
prédéfinis sur la machine. En guise d'exemple, créons deux groupes formateurs
et direction
, puis ajoutons les utilisateurs microlinux
, adebuf
, jmortreux
,
fbanester
et fteyssier
à leurs groupes respectifs, sachant que certains
appartiennent aux deux groupes :
# groupadd formateurs
# groupadd direction
# usermod -aG formateurs microlinux
# usermod -aG formateurs jmortreux
# usermod -aG formateurs fteyssier
# usermod -aG direction adebuf
# usermod -aG direction jmortreux
# usermod -aG direction fbanester
# usermod -aG direction fteyssier
Pour apprécier le résultat de l'opération, ouvrez /etc/group
et examinez les
deux dernières lignes du fichier. Vous pourriez très bien utiliser cat
, more
ou
less
pour visualiser /etc/group
, mais j'en profite en passant pour vous
présenter la commande tail
. Dans sa configuration par défaut, tail
affiche les
dix dernières lignes du fichier fourni en argument. L'option -n 2
nous limitera
aux deux dernières lignes :
# tail -n 2 /etc/group
formateurs:x:1006:microlinux,jmortreux,fteyssier
direction:x:1007:adebuf,jmortreux,fbanester,fteyssier
Pour supprimer un groupe, utilisez la commande groupdel
:
# groupdel formateurs
# groupdel direction
Supprimer un utilisateur
Vous voilà en mesure de créer des utilisateurs et de gérer leurs comptes. Il ne
vous reste plus qu'à savoir comment vous en débarrasser, le cas échéant. Comme
un employé doit vider son bureau et rendre son badge, il arrive qu'un
utilisateur n'ait plus la place sur votre système. Dans ce cas, vous serez
amené à supprimer son compte. C'est l'objet de la commande userdel
.
Appliquons-la sur l'utilisateur fantasio
:
# userdel fantasio
Malheureusement, il y a un détail auquel nous n'avons pas pensé :
# ls -l /home/
total 8
drwx------. 2 adebuf adebuf 62 May 17 08:05 adebuf
drwx------. 2 1005 1005 4096 May 17 12:10 fantasio
drwx------. 2 fbanester fbanester 62 May 17 08:12 fbanester
drwx------. 2 fteyssier fteyssier 83 May 17 09:00 fteyssier
drwx------. 2 jmortreux jmortreux 62 May 17 08:09 jmortreux
drwx------. 2 microlinux microlinux 4096 May 16 15:47 microlinux
La commande userdel
s'est chargée de supprimer l'utilisateur fantasio
, mais
pas son répertoire.
Vider l'eau du bain avec le bébé
Le répertoire /home/fantasio
existe toujours et semble intact, à un détail
près :
# ls -la /home/fantasio/
total 28
drwx------. 2 1005 1005 4096 May 17 12:10 .
drwxr-xr-x. 8 root root 4096 May 17 10:34 ..
-rw-------. 1 1005 1005 76 May 17 12:10 .bash_history
-rw-r--r--. 1 1005 1005 18 Nov 22 2019 .bash_logout
-rw-r--r--. 1 1005 1005 193 Nov 22 2019 .bash_profile
-rw-r--r--. 1 1005 1005 231 Nov 22 2019 .bashrc
-rw-r--r--. 1 1005 1005 45 May 17 10:34 LISEZ_MOI.txt
Les fichiers et répertoires de /home/fantasio
sont toujours là, mais ils
"appartiennent" à présent à l'UID 1005
et au GID 1005
. Admettons que vous
ayez maintenant l'idée de créer un nouveau compte et de lui affecter ces
identifiants d'utilisateur et de groupe désormais vacants. Il se retrouverait
propriétaire de tous les fichiers de fantasio
. Autrement dit :
fantasio
a rendu son badge, mais il n'a vidé ni son bureau ni son casier, et
c'est le nouvel employé qui a désormais la clé.
Lors de la suppression, il peut donc s'avérer nécessaire de supprimer le
répertoire d'utilisateur correspondant au compte. Cependant, si nous affichons
la page man
de la commande userdel
, nous lisons ceci :
OPTIONS
...
-r, --remove
Files in the user's home directory will be removed along with the home
directory itself and the user's mail spool. Files located in other file
systems will have to be searched for and deleted manually.
...
Essayons cette option sur l'utilisatrice fbanester
, que nous avons dans le
collimateur depuis un petit moment :
# userdel -r fbanester
[root@linuxbox ~]# ls -l /home/
total 8
drwx------. 2 adebuf adebuf 62 May 17 08:05 adebuf
drwx------. 2 1005 1005 4096 May 17 12:10 fantasio
drwx------. 2 fteyssier fteyssier 83 May 17 09:00 fteyssier
drwx------. 2 jmortreux jmortreux 62 May 17 08:09 jmortreux
drwx------. 2 microlinux microlinux 4096 May 16 15:47 microlinux
La commande userdel
suivie de l'option -r
a donc bien supprimé le compte
utilisateur fbanester
ainsi que le répertoire utilisateur /home/fbanester
avec toutes les données qu'il contenait.
Administrer le système avec sudo
Au début de cette leçon, nous avons vu qu'il était possible de changer
d'identité grâce à la commande su
(switch user), notamment pour devenir
root
:
[microlinux@linuxbox ~]$ ls /boot/grub2/
ls: cannot open directory /boot/grub2/: Permission denied
[microlinux@linuxbox ~]$ su -
Password:
[root@linuxbox ~]# ls /boot/grub2/
device.map fonts grub.cfg grubenv i386-pc locale
Une autre manière de faire, c'est d'utiliser la commande sudo
. Elle permet
littéralement de "faire (do) en se substituant à l'utilisateur (su)", en
l'occurrence lancer une commande en tant qu'administrateur. Dans l'exemple qui
suit, notez bien que je saisis le mot de passe de microlinux
et non pas celui
de root
:
[microlinux@linuxbox ~]$ ls /boot/grub2/
ls: cannot open directory /boot/grub2/: Permission denied
[microlinux@linuxbox ~]$ sudo ls /boot/grub2/
[sudo] password for microlinux: ********
device.map fonts grub.cfg grubenv i386-pc locale
Lorsqu'un utilisateur invoque sudo
pour la première fois, le système affiche un
avertissement solennel :
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
Rappelez-vous que lors de l'installation du système et de la création de
l'utilisateur initial, nous avons coché la case Faire de cet utilisateur un
administrateur
, ce qui a ajouté l'utilisateur au groupe privilégié wheel
. Le
principal privilège de ce groupe est défini dans le fichier
/etc/sudoers
:
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
Voilà comment se présentent les choses lorsque sudo
est invoqué par un
utilisateur qui ne dispose pas de ce privilège :
[fteyssier@linuxbox ~]$ sudo ls /boot/grub2/
[sudo] password for fteyssier:
fteyssier is not in the sudoers file. This incident will be reported.
Le signalement en question a lieu dans le fichier /var/log/secure
et
ressemble à ceci :
Sep 1 08:14:17 linuxbox sudo: fteyssier : user NOT in sudoers ; TTY=pts/1 ;
PWD=/home/fteyssier ; USER=root ; COMMAND=/bin/ls /boot/grub2/
Utiliser su ou sudo ?
Dans le monde d'Unix et de Linux, il existe en gros deux écoles pour s'acquitter des tâches administratives :
-
travailler directement en tant que
root
lorsque cela est nécessaire ; -
se connecter en tant qu'utilisateur simple et utiliser
sudo
lorsqu'une tâche le requiert.
Certaines distributions – comme Ubuntu par exemple – favorisent explicitement
l'approche avec sudo
en désactivant le compte root
dans la configuration
par défaut.
Quelle est donc la "meilleure" approche ici ? Je me garderai de trancher la question, et je me contenterai d'attirer votre attention sur les principales différences entre les deux manières de faire :
-
Travailler directement en tant que
root
est certainement plus confortable. -
Utiliser
sudo
n'a jamais empêché personne de se tirer dans le pied. -
Le principal argument en faveur de
sudo
, c'est sans doute la journalisation des opérations dans/var/log/secure
. Si vous travaillez en tant qu'utilisateur simple et que vous utilisezsudo
, tout ce que vous faites est enregistré dans ce fichier. Ce qui n'est pas le cas pourroot
. Essayez pour voir.
La rédaction de ces cours demande du temps et des quantités significatives de café espresso. Vous appréciez cette formation ? Offrez un café au formateur en cliquant sur la tasse.