Gestion des comptes d'utilisateurs sous Linux
L'ajout, la modification et la suppression des informations d'identification des comptes utilisateurs (noms d'utilisateur, informations sur les comptes et mots de passe) constituent une partie importante (mais fastidieuse) de l'administration du système.
Pour ajouter un nouveau compte utilisateur sur le système, on utilise généralement l'utilitaire useradd. Sur certaines distributions, comme Ubuntu, un script appelé adduser est utilisé pour ajouter des utilisateurs au système, mais il invoque le programme useradd pour gérer la tâche réelle.
Le processus d'ajout de comptes implique en fait plusieurs acteurs en plus du programme useradd de base.
Le fichier /etc/login.defs
Ce fichier de configuration est généralement installé par défaut sur la plupart des distributions Linux. Il contient des directives à utiliser dans diverses commandes de la suite de mots de passe fantômes (shadow password). La suite de mots de passe fantômes est un terme générique pour les commandes traitant des informations d'identification des comptes, telles que les commandes useradd, userdel et passwd.
Les directives de ce fichier de configuration contrôlent la longueur du mot de passe, le délai dans lequel l'utilisateur doit changer le mot de passe du compte, la création par défaut d'un répertoire personnel, etc. Le fichier est généralement rempli de commentaires et de directives commentées (ce qui rend les directives inactives). L'extrait suivant montre certaines des directives actives dans un fichier /etc/login.defs :
devinfo@ubuntu:~$ cat /etc/login.defs # # /etc/login.defs - Configuration control definitions for the login package. # ... MAIL_DIR /var/mail #MAIL_FILE .mail ... FTMP_FILE /var/log/btmp ... TTYGROUP tty TTYPERM 0600 ... ERASECHAR 0177 KILLCHAR 025 UMASK 022 UID_MIN 1000 UID_MAX 60000 ... GID_MIN 1000 GID_MAX 60000 ... PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_WARN_AGE 7 ... # # Max time in seconds for login # LOGIN_TIMEOUT 60 ... # # If defined, this command is run when removing a user. # It should remove any at/cron/print jobs etc. owned by # the user to be removed (passed as the first argument). # #USERDEL_CMD /usr/sbin/userdel_local ... ENCRYPT_METHOD SHA512 CREATE_HOME yes ...
Remarquez la directive UID_MIN dans l'exemple précédent. Un numéro d'identification d'utilisateur (UID) est le numéro utilisé par Linux pour identifier les comptes utilisateurs. Un compte utilisateur, parfois appelé compte normal ou standard, est tout compte qu'une personne autorisée a reçu pour accéder au système, avec les informations d'identification appropriées, et effectuer des tâches quotidiennes. Alors que les humains utilisent des noms de comptes, Linux utilise des UID. L'UID_MIN indique l'UID le plus bas autorisé pour les comptes d'utilisateurs. Sur le système, UID_MIN est défini à 1000. Cette valeur est typique, bien que certains systèmes la fixent à 500.
Le fichier /etc/default/useradd
Le fichier /etc/default/useradd est un autre fichier de configuration qui dirige le processus de création de comptes. Il s'agit généralement d'un fichier beaucoup plus court que le fichier /etc/login.defs.
devinfo@ubuntu:~$ cat /etc/default/useradd # Default values for useradd(8) # # The SHELL variable specifies the default login shell on your # system. # Similar to DSHELL in adduser. However, we use "sh" here because # useradd is a low level utility and should be as general # as possible SHELL=/bin/sh # # The default group for users # 100=users on Debian systems # Same as USERS_GID in adduser # This argument is used when the -n flag is specified. # The default behavior (when -n and -g are not specified) is to create a # primary user group with the same name as the user being added to the # system. # GROUP=100 # # The default home directory. Same as DHOME for adduser # HOME=/home # # The number of days after a password expires until the account # is permanently disabled # INACTIVE=-1 # # The default expire date # EXPIRE= # # The SKEL variable specifies the directory containing "skeletal" user # files; in other words, files such as a sample .profile that will be # copied to the new user's home directory when it is created. # SKEL=/etc/skel # # Defines whether the mail spool should be created while # creating the account # CREATE_MAIL_SPOOL=yes devinfo@ubuntu:~$ useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/sh SKEL=/etc/skel CREATE_MAIL_SPOOL=no
Remarquez qu'il y a deux façons différentes d'afficher les directives actives dans ce fichier. Vous pouvez utiliser la commande cat ou invoquer la commande useradd -D. Les deux sont tout aussi simples à utiliser. Un aspect intéressant de la commande useradd -D est que vous pouvez l'utiliser pour modifier les directives du fichier /etc/default/useradd.
Toujours dans l'exemple précédent, remarquez la directive HOME. Elle est actuellement définie sur /home, ce qui signifie que tout compte utilisateur nouvellement créé aura son répertoire de compte situé dans le répertoire /home. Gardez à l'esprit que si CREATE_HOME n'est pas défini ou défini sur no dans le fichier /etc/login.defs, un répertoire home n'est pas créé par défaut.
La directive SHELL nécessite un peu plus d'explications. En général, elle est définie sur /bin/sh, ce qui signifie que lorsque vous accédez à la ligne de commande, votre processus utilisateur exécute le programme shell /bin/sh. Ce programme vous fournit l'invite de la ligne de commande et traite toutes les commandes que vous y entrez.
Le répertoire /etc/skel/
Le répertoire /etc/skel, ou le répertoire squelette comme on l'appelle communément, contient les fichiers. Si un répertoire personnel est créé pour un utilisateur, ces fichiers doivent être copiés dans le répertoire personnel du compte utilisateur lors de la création du compte.
devinfo@ubuntu:~$ ls -a /etc/skel . .. .bash_logout .bashrc .profile
La sortie de la commande ls affiche trois fichiers. Ces fichiers particuliers sont des fichiers d'environnement. Dans le répertoire /etc/skel, vous pouvez modifier n'importe lequel de ces fichiers ou ajouter de nouveaux fichiers et répertoires pour répondre aux besoins particuliers de votre système.
Maintenant que nous avons couvert les fichiers du côté création du processus de création de compte utilisateur, examinons les fichiers et les répertoires qui sont créés ou modifiés lors de la création d'un compte.
Le fichier /etc/passwd
Les informations de compte sont stockées dans le fichier /etc/passwd. Les données de chaque compte occupent une seule ligne dans le fichier. Lorsqu'un compte est créé, un nouvel enregistrement pour ce compte est ajouté au fichier /etc/passwd.
devinfo@ubuntu:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin ... sssd:x:126:131:SSSD system user,,,:/var/lib/sss:/usr/sbin/nologin devinfo:x:1000:1000:Développement informatique,,,:/home/devinfo:/bin/bash ...
Les enregistrements /etc/passwd contiennent plusieurs champs. Chaque champ d'un enregistrement est délimité par deux points (:). Il y a sept champs dans un enregistrement /etc/passwd.
- Nom d'utilisateur du compte utilisateur
- Champ de mot de passe. Généralement, ce fichier n'est plus utilisé pour stocker les mots de passe. Un x dans ce champ indique que les mots de passe sont stockés dans le fichier /etc/shadow.
- Numéro d'identification d'utilisateur (UID) du compte utilisateur
- Numéro d'identification de groupe du compte utilisateur (GID)
- Champ de commentaire. Ce champ est facultatif. Généralement, il contient le nom complet de l'utilisateur.
- Répertoire personnel du compte utilisateur
- Shell par défaut du compte utilisateur. S'il est défini sur /sbin/nologin ou /bin/false, l'utilisateur ne peut pas se connecter de manière interactive au système.
On pourrait penser que le fichier de mots de passe contiendrait des mots de passe, mais en raison de ses autorisations de fichier, le fichier de mots de passe peut être compromis. Par conséquent, les mots de passe sont stockés dans le fichier /etc/shadow dont les autorisations sont plus restreintes.
Le fichier /etc/shadow
Un autre fichier qui est mis à jour lorsqu'un compte est créé est le fichier /etc/shadow. Il contient des informations concernant le mot de passe du compte, même si vous n'avez pas encore fourni de mot de passe pour le compte. Comme le fichier /etc/passwd, les données de chaque compte occupent une seule ligne de fichier. Étant donné que le fichier est plus protégé que le fichier de mot de passe, vous devrez soit utiliser le compte root, soit utiliser les privilèges de super utilisateur pour le visualiser.
devinfo@ubuntu:~$ sudo cat /etc/shadow [sudo] Mot de passe de devinfo : root:!:18916:0:99999:7::: daemon:*:18858:0:99999:7::: bin:*:18858:0:99999:7::: sys:*:18858:0:99999:7::: sync:*:18858:0:99999:7::: games:*:18858:0:99999:7::: man:*:18858:0:99999:7::: lp:*:18858:0:99999:7::: mail:*:18858:0:99999:7::: news:*:18858:0:99999:7::: ... devinfo:$1$2FJm5id7$5/6JIkOOhrvlZ7Tt3nkCj0:18916:0:99999:7::: systemd-coredump:!!:18916::::::
Les enregistrements /etc/shadow contiennent plusieurs champs. Chaque champ d'un enregistrement est délimité par deux points (:). Il y a neuf champs au total.
- Nom d'utilisateur du compte utilisateur
- Champ du mot de passe. Le mot de passe est un mot de passe salé et haché. Un !! ou ! indique qu'un mot de passe n'a pas été défini pour le compte. Un ! ou * indique que le compte ne peut pas utiliser un mot de passe pour se connecter. Un ! devant un mot de passe indique que le compte a été verrouillé.
- Date du dernier changement de mot de passe au format d'époque Unix (jours)
- Nombre de jours après la modification d'un mot de passe jusqu'à ce que le mot de passe puisse être modifié à nouveau.
- Nombre de jours avant qu'un changement de mot de passe soit nécessaire. Il s'agit de la date d'expiration du mot de passe
- Nombre de jours où un avertissement est émis à l'utilisateur avant l'expiration d'un mot de passe (voir champ 5.)
- Nombre de jours après l'expiration d'un mot de passe (voir champ 5) qui n'a pas été modifié avant que le compte ne soit désactivé.
- Date d'expiration du compte au format d'époque Unix (jours)
- Appelé le drapeau spécial. Il s'agit d'un champ destiné à un usage spécial futur, qui n'est actuellement pas utilisé et qui est vide.
Notez que le champ 1 est le nom d'utilisateur du compte. C'est le seul champ partagé avec le fichier /etc/passwd.
Il est essentiel de comprendre les différentes expirations possibles. Lorsque l'expiration du mot de passe a eu lieu, il y a une période de grâce. L'utilisateur disposera d'un certain nombre de jours (désigné dans le champ 7) pour se connecter au compte avec l'ancien mot de passe mais devra changer de mot de passe immédiatement. Cependant, si l'expiration du mot de passe s'est produite et que l'utilisateur ne se connecte pas au système à temps, l'utilisateur est effectivement verrouillé hors du système.
Avec l'expiration du compte, il n'y a pas de période de grâce. Une fois le compte expiré, l'utilisateur ne peut pas se connecter au compte avec son mot de passe.
Création d'un compte
La commande useradd est l'outil principal pour créer des comptes d'utilisateurs sur la plupart des distributions. Cet utilitaire a de nombreuses options utiles pour divers besoins.
useradd [options] nomutilisateur
Dans la distribution Ubuntu, la directive CREATE_HOME n'est pas définie dans le fichier /etc/login.defs, elle sera donc par défaut no et la directive SHELL est définie sur /bin/sh au lieu du shell Bash.
devinfo@ubuntu:~$ grep CREATE_HOME /etc/login.defs devinfo@ubuntu:~$ useradd -D | grep SHELL SHELL=/bin/sh devinfo@ubuntu:~$
En raison de ces paramètres, lors de la création d'un compte utilisateur sur cette distribution Ubuntu, si vous souhaitez que le compte ait un répertoire personnel et utilise le shell Bash, vous devrez utiliser les options de commande useradd supplémentaires répertoriées. Voici un exemple:
devinfo@ubuntu:~$ sudo useradd -md /home/mostafa -s /bin/bash -g staff mostafa devinfo@ubuntu:~$ ls -l /home total 8 drwxr-xr-x 20 devinfo devinfo 4096 oct. 19 04:06 devinfo drwxr-xr-x 2 mostafa staff 4096 oct. 19 07:13 mostafa
Option (nom court) | Option (Nom long) | Description |
---|---|---|
-c | --comment | Contenu du champ de commentaire. Traditionnellement, il contient le nom complet de l'utilisateur. Optionnel. |
-d | --home ou --home-dir | Spécification du répertoire personnel de l'utilisateur. L'action par défaut est définie par les directives HOME et CREATE_HOME. |
-D | --defaults | Affichez les directives /etc/default/useradd. |
-e | --expiredate | Date d'expiration du compte au format AAAA-MM-JJ. L'action par défaut est définie par la directive EXPIRE. |
-f | --inactive | Nombre de jours après qu'un mot de passe a expiré et n'a pas été modifié jusqu'à ce que le compte soit désactivé. Un -1 indique que le compte ne sera jamais désactivé. L'action par défaut est définie par la directive INACTIVE. |
-g | --gid | L'appartenance au groupe du compte, qui est active lorsque l'utilisateur se connecte au système (groupe par défaut) |
-G | --groups | Les adhésions de groupe supplémentaires du compte |
-m | --create-home | S'il n'existe pas, créez le répertoire personnel du compte utilisateur. L'action par défaut est définie par la directive CREATE_HOME. |
-M | N/A ou --no-create-home | Ne créez pas le répertoire personnel du compte utilisateur. L'action par défaut est définie par la directive CREATE_HOME. |
-s | --shell | Shell du compte. L'action par défaut est définie par la directive SHELL. |
-u | --uid | Numéro d'identification de l'utilisateur (UID) du compte |
-r | --system | Créez un compte système au lieu d'un compte utilisateur. |
Notez que dans l'exemple, trois options sont utilisées avec la commande useradd. Comme ce système n'a pas défini la directive CREATE_HOME, l'option -m est nécessaire pour forcer useradd à créer un répertoire personnel pour le compte. L’option -d indique que le nom du répertoire doit être /home/mostafa. Étant donné que la directive SHELL est définie sur /bin/sh sur ce système, l'option -s est nécessaire pour définir le shell par défaut du compte sur /bin/bash.
Maintenant que ce compte est créé, vérifions que les options useradd fonctionnent correctement.
devinfo@ubuntu:~$ getent passwd mostafa mostafa:x:1001:50::/home/mostafa:/bin/bash devinfo@ubuntu:~$ sudo getent shadow mostafa mostafa:!:18919:0:99999:7::: devinfo@ubuntu:~$ ls -a /home/mostafa . .. .bash_logout .bashrc .profile
Notez que des enregistrements existent désormais pour le nouveau compte d'utilisateur dans les fichiers passwd et shadow. De plus, un nouveau répertoire a été créé, /home/mostafa, qui contient les fichiers du répertoire /etc/skel/ de cette distribution. Gardez à l'esprit à ce stade qu'aucun mot de passe n'a encore été ajouté au compte mostafa, et donc son enregistrement dans le fichier shadow apparaît ! dans le champ mot de passe.
Gestion des mots de passe
Lorsque vous créez un compte interactif pour la première fois, vous devez immédiatement créer un mot de passe pour ce compte à l'aide de l'utilitaire passwd. Vous pouvez créer ou mettre à jour le mot de passe d'un compte en passant le nom d'utilisateur comme argument à la commande.
passwd [options] [nomutilisateur]
Ici, un mot de passe est créé pour le nouveau compte mostafa sur une distribution Ubuntu :
devinfo@ubuntu:~$ sudo passwd mostafa Nouveau mot de passe : Retapez le nouveau mot de passe : passwd : le mot de passe a été mis à jour avec succès devinfo@ubuntu:~$
Si vous devez mettre à jour le mot de passe de votre propre compte, il suffit d'entrer passwd sans arguments de commande supplémentaires. Avec l'utilitaire passwd, vous pouvez verrouiller ou déverrouiller des comptes, définir le mot de passe d'un compte comme étant expiré, supprimer le mot de passe d'un compte, et ainsi de suite. Le tableau ci-dessous présente les options de passwd les plus couramment utilisés ; toutes ces options nécessitent des privilèges de super utilisateur.
Option (nom court) | Option (Nom long) | Description |
---|---|---|
-d | --delete | Supprime le mot de passe du compte |
-e | --expire | Définit le mot de passe d'un compte comme expiré. L'utilisateur doit changer le mot de passe du compte lors de la prochaine connexion. |
-i | --inactive | Définit le nombre de jours après l'expiration d'un mot de passe et n'a pas été modifié jusqu'à ce que le compte soit désactivé |
-l | --lock | Place un point d'exclamation (!) devant le mot de passe du compte dans le fichier /etc/shadow, empêchant efficacement l'utilisateur de se connecter au système en utilisant le mot de passe du compte |
-n | --minimum | Définit le nombre de jours après la modification d'un mot de passe jusqu'à ce que le mot de passe puisse être modifié à nouveau |
-S | --status | Affiche l'état du mot de passe du compte |
-u | --unlock | Supprime un point d'exclamation placé (!) Du mot de passe du compte dans le fichier /etc/shadow |
-w | --warning ou --warndays | Définit le nombre de jours pendant lesquels un avertissement est envoyé à l'utilisateur avant l'expiration d'un mot de passe |
-x | --maximum ou --maxdays | Définit le nombre de jours jusqu'à ce qu'un changement de mot de passe soit requis. Il s'agit de la date d'expiration du mot de passe. |
L'utilitaire chage affiche les informations de mot de passe, mais dans un format plus lisible par l'homme que l'affichage des enregistrements dans le fichier /etc/shadow ou l'utilisation de la commande getent shadow. Il nécessite des privilèges de super utilisateur pour fonctionner.
devinfo@ubuntu:~$ sudo chage -l mostafa Dernier changement de mot de passe : oct. 19, 2021 Fin de validité du mot de passe : jamais Mot de passe désactivé : jamais Fin de validité du compte : jamais Nombre minimum de jours entre les changements de mot de passe : 0 Nombre maximum de jours entre les changements de mot de passe : 99999 Nombre de jours d'avertissement avant la fin de validité du mot de passe : 7
Notez que le mot de passe de ce compte n'expire jamais.
Modification des comptes
Outre l'ajout et la gestion des mots de passe, les comptes de vos systèmes peuvent nécessiter des modifications supplémentaires. L'utilitaire utilisé pour modifier les comptes est le programme usermod. Le type de modification de compte d'utilisateur est déterminé par les options utilisées avec l'utilitaire usermod.
usermod [options] nomutilisateur
Le tableau ci-dessous montre les options couramment utilisées.
Option (nom court) | Option (Nom long) | Description |
---|---|---|
-c | --comment | Contenu du champ de commentaire. Traditionnellement, il contient le nom complet de l'utilisateur. Optionnel. |
-d | --home ou --home-dir | Spécification du répertoire personnel de l'utilisateur. L'action par défaut est définie par les directives HOME et CREATE_HOME. |
-e | --expiredate | Date d'expiration du compte au format AAAA-MM-JJ. L'action par défaut est définie par la directive EXPIRE. |
-f | --inactive | Nombre de jours après qu'un mot de passe a expiré et n'a pas été modifié jusqu'à ce que le compte soit désactivé. Un -1 indique que le compte ne sera jamais désactivé. L'action par défaut est définie par la directive INACTIVE. |
-g | --gid | L'appartenance au groupe du compte, qui est active lorsque l'utilisateur se connecte au système (groupe par défaut) |
-G | --groups | Les adhésions de groupe supplémentaires du compte |
-l | -login | Modifie le nom d'utilisateur du compte avec le nom spécifié. Ne modifie pas le répertoire personnel |
-L | --lock | Verrouiller le compte en plaçant un point d'exclamation devant le mot de passe dans l'enregistrement du fichier /etc/shadow du compte. |
-s | --shell | Shell du compte. L'action par défaut est définie par la directive SHELL. |
-u | --uid | Numéro d'identification de l'utilisateur (UID) du compte |
-U | --unlock | Déverrouillez le compte en supprimant le point d'exclamation au début du mot de passe dans l'enregistrement du fichier /etc/shadow du compte. |
Là où usermod est vraiment utile, c'est dans une situation où vous avez créé un compte mais vous avez oublié de vérifier les paramètres de configuration de création de compte de la distribution, comme sur une distribution Ubuntu.
devinfo@ubuntu:~$ sudo getent passwd mostafa mostafa:x:1001:50::/home/mostafa:/bin/bash devinfo@ubuntu:~$ sudo usermod -s /bin/sh mostafa devinfo@ubuntu:~$ sudo getent passwd mostafa mostafa:x:1001:50::/home/mostafa:/bin/sh devinfo@ubuntu:~$
Suppression de comptes
La suppression d'un compte sous Linux est assez simple. L'utilitaire userdel est l'outil clé dans cette tâche. L'option la plus courante à utiliser est l’option -r. Cette option supprimera l'arborescence du répertoire personnel du compte et tous les fichiers qu'elle contient.
userdel [-r] nomutilisateur
devinfo@ubuntu:~$ sudo getent passwd mostafa mostafa:x:1001:50::/home/mostafa:/bin/bash devinfo@ubuntu:~$ ls -d /home/mostafa /home/mostafa devinfo@ubuntu:~$ sudo userdel -r mostafa userdel : l'emplacement de boîte aux lettres de mostafa (/var/mail/mostafa) n'a pas été trouvé devinfo@ubuntu:~$ ls -d /home/mostafa ls: impossible d'accéder à '/home/mostafa': Aucun fichier ou dossier de ce type devinfo@ubuntu:~$ sudo getent passwd mostafa
Notez qu'un message d'erreur est généré indiquant que le fichier /var/mail/mostafa est introuvable. Ce n'est pas un problème. Cela signifie simplement que ce fichier n'a pas été créé lors de la création du compte.