Utilisateurs et groupes Linux

Dans ce chapitre sur les utilisateurs et les groupes, nous verrons la différence entre les programmes su et sudo. On identifiera l’emplacement des informations sur les utilisateurs et les groupes. On trouvera aussi des considérations sur le chiffrement et la force des mots de passe sous Linux.

1. Commande su

su (substitute user ou switch user) est une commande Unix permettant d’exécuter un interpréteur de commandes en changeant d’identifiant de GID et de UID.

Sans argument, la commande utilise les UID 0 et le GID 0, c’est-à-dire ceux du compte utilisateur root.

Cette commande est surtout utilisée pour obtenir les privilèges d’administration à partir d’une session d’utilisateur normal, c’est-à-dire, non privilégiée.

L’option - place le shell de l’utilisateur.

Exercice

su
exit
su -
exit
su root
exit
su - root
exit

2. Programme sudo

sudo (abréviation de substitute user do, en anglais : «exécuter en se substituant à l’utilisateur») est une commande qui permet à l’administrateur système d’accorder à certains utilisateurs (ou groupes d’utilisateurs) la possibilité de lancer une commande en tant qu’administrateur, ou comme autre utilisateur, tout en conservant une trace des commandes saisies et des arguments.

Exercice

Pour configurer sudo, dans une session utilisateur root :

visudo

Visudo

La commande visudo ouvre le fichier de configuration sudo avec l’éditeur vi. En voici le contenu sous Centos 7 :

# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## 	user	MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root	ALL=(ALL) 	ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel	ALL=(ALL)	ALL

## Same thing without a password
# %wheel	ALL=(ALL)	NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Un utilisateur devient “sudoer” en modifiant finement ce fichier ou ses fichiers inclus jusqu’à définir les commandes seules autorisées. On peut profiter comme dans cet exemple d’un configuration par défaut qui rend “sudoer” tout membre d’un groupe défini (le groupe wheel sous Centos et le groupe sudo sous Debian / Ubuntu).

Par exemple, ajouter un utilisateur au système en tant que non-root :

sudo useradd zozo

Exercice : se configurer en tant qu’utilisateur normal comme “sudoer”.

3. Utilisateurs

Toute entité (personne physique ou programme particulier) devant interagir avec un système UNIX est authentifiée sur cet ordinateur par un utilisateur ou “user”.

Ceci permet d’identifier un acteur sur un système UNIX. Un utilisateur est reconnu par un nom unique et un numéro unique.

Sur tout système UNIX, il y a un super-utilisateur, généralement appelé root, qui a tous les pouvoirs sur le système. Il peut accéder librement à toutes les ressources de l’ordinateur, y compris à la place d’un autre utilisateur, c’est-à-dire sous son identité. En général, du moins sur les systèmes de production, seul l’administrateur système possède le mot de passe root. L’utilisateur root porte le numéro 0.

4. Utilisateurs : fichier /etc/passwd

On peut créer un utilisateur de plusieurs manières mais la finalité est toujours la même : pour chaque utilisateur, une entrée doit être créée dans le fichier /etc/passwd sous ce format :

account:passwd:UID:GID:GECOS:directory:shell

Illustration

Par exemple, on ajoute un utilisateur “user1” :

echo "user1:x:2000:2000:user1:/home/user1:/bin/bash" >> /etc/passwd

Mais faut-il encore créer le groupe correspondant, vérifier la validité des UID et GID, créer le répertoire utilisateurs, y donner les droits et y placer une structure …

5. Mots de passe : fichier /etc/shadow

Le mot de passe est écrit dans le fichier /etc/shadow avec ses paramètres :

  1. nom de connexion de l’utilisateur (« login »)
    • mot de passe chiffré : $1$ (MD5),$2$ (Blowfish), $5$ (SHA-256), $6$ (SHA-512)
    • date du dernier changement de mot de passe
    • âge minimum du mot de passe
    • âge maximum du mot de passe
    • période d’avertissement d’expiration du mot de passe
    • période d’inactivité du mot de passe
    • date de fin de validité du compte
    • champ réservé

Illustration

francois:$6$d/uLirbD$s90XRAj6g14036jIuvYYQaSOSrcJKqiNNywIQplztkTlyIrySZE1o2zjFvSobewvyORXFdZ7bGeF0U1OTPoOm.:16842:0:99999:7:::

6. Générer un mot de passe aléatoire

Exercice

pwmake est un outil qui permet de générer des mots de passe (Centos 7) :

pwmake 128
Ib9AHK3boravZUSuNuffYPExunEn

Exercice

Voici un exemple à utiliser dans un exercice de récupération de mot de passe :

pwmake 128 | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.

Exercice

On peut utiliser des outils natifs.

Avec les utilitaires de génération d’empreinte :

date +%s | sha256sum | base64 | head -c 32 ; echo

Avec /dev/urandom :

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;

Avec openssl s’il est installé :

openssl rand -base64 32

Dans les dépôts Debian, on trouve les générateurs de mots de passe:

  • pwgen
  • apg
  • makepasswd

7. Tester la force des mots de passe

On peut tester la force des mots de passe avec John The Ripper.

Si le paquet john est présent dans le dépôt Debian / Ubuntu, il n’est pas disponible pour les distributions RHEL. On peut alors le compiler soi-même :

#!/bin/bash
# Centos 7/8 John the Ripper Installation
#release=(j 1.8.0)
release=(k 1.9.0)
# Check Centos version
if [ -f /etc/redhat-release ] ; then
  source /etc/os-release
  if [ $VERSION_ID == "8" ] ; then
    packager=dnf
  elif [ $VERSION_ID == "7" ] ; then
    packager=yum
  fi
else exit ; fi
sudo ${packager} -y install wget gpgme
sudo ${packager} -y group install "Development Tools"
cd
wget http://www.openwall.com/john/${release[0]}/john-${release[1]}.tar.xz
wget http://www.openwall.com/john/${release[0]}/john-${release[1]}.tar.xz.sign
wget http://www.openwall.com/signatures/openwall-signatures.asc
gpg --import openwall-signatures.asc
gpg --verify john-${release[1]}.tar.xz.sign
tar xvfJ john-${release[1]}.tar.xz
cd john-${release[1]}/src
make clean linux-x86-64
cd ../run/
./john --test
#password dictionary download
wget -O - http://mirrors.kernel.org/openwall/wordlists/all.gz | gunzip -c > openwall.dico

et puis :

cd john-*/run
./john /etc/shadow
Loaded 4 password hashes with 4 different salts (generic crypt(3) [?/64])
testtest         (tintin)
testtest         (root)
testtest         (francois)
testtest         (gustave)
guesses: 4  time: 0:00:02:25 DONE (Tue Feb  3 23:06:29 2015)  c/s: 170  trying: spazz - dasha
Use the "--show" option to display all of the cracked passwords reliably

8. Groupes

Un utilisateur UNIX appartient à un ou plusieurs groupes.

Les groupes servent à rassembler des utilisateurs afin de leur attribuer des droits communs.

Le groupe principal est le groupe initial de l’utilisateur.

L’utilisateur peut appartenir à des groupes secondaires.

9. Fichiers /etc/group et /etc/gshadow

Les fichiers /etc/group et /etc/gshadow définissent les groupes.

Le fichier /etc/group comporte 4 champs séparés par “:” :

  1. nom du groupe
  2. mot de passe du groupe (ou x si le fichier gshadow existe)
  3. le GID
  4. liste des membres séparés par une virgule

10. Appartenance à un groupe

On peut vérifier son identifiant et l’appartenance aux groupes via les commandes id et groups :

La commande

id

offre par exemple ce résultat :

uid=1000(francois) gid=1000(francois) groupes=1000(francois),10(wheel) contexte=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

La commande

groups

donne ceci :

francois wheel