htop expliqué, partie 4 : les processus utilisateur

Après une première partie consacrée à l’uptime, la seconde à la load average et une troisième consacrée aux processus, voici la troisième partie traduite de l’excellent article htop explained : Explanation of everything you can see in htop/top on Linux.

Article arrivé 1er sur Hacker News, 1er sur /r/sysadmin, 2nd sur /r/linux), traduit avec l’accord de son auteur Pēteris Ņikiforovs, il présente la commande htop et les notions de base des composants d’un système GNU/Linux que cette commande affiche.

Aujourd’hui : les processus utilisateur.


htop

Processus utilisateur

Chaque processus appartient à un utilisateur. les utilisateurs sont représentés par un identifiant (ID) numérique.

$ sleep 1000 &
[1] 2045
$ grep Uid /proc/2045/status
Uid: 1000 1000 1000 1000

Vous pouvez utiliser la commande id pour trouver le nom pour cet utilisateur.

$ id 1000
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm)

Il se trouve que id obtient cette information depuis les fichiers /etc/passwd et /etc/group.

$ strace -e open id 1000
...
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_compat.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/group", O_RDONLY|O_CLOEXEC) = 3
...

C’est parce que le fichier de configuration /etc/nsswitch.conf du Name Service Switch (NSS) dit utiliser ces fichiers pour résoudre les noms.

$ head -n 9 /etc/nsswitch.conf
# ...
passwd: compat
group: compat
shadow: compat

La valeur de compat (mode de compatibilité) est la même que “files” (ndt : fichiers), à l’exception que les entrées spéciales sont autorisées. “files” signifie que la base de données est stockée dans un fichier (chargé par libnss_files.so). Mais vous pouvez aussi stocker vos utilisateurs dans d’autres bases de données et services ou utiliser le Lightweight Directory Access Protocol (LDAP), par exemple.

/etc/passwd et /etc/group sont des fichiers texte qui font correspondre les identifiants numériques aux noms lisibles par un humain.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
$ cat /etc/group
root:x:0:
adm:x:4:syslog,ubuntu
ubuntu:x:1000:

passwd ? Mais où sont les mots de passe ?

Ils sont en fait dans /etc/shadow.

$ sudo cat /etc/shadow
root:$6$mS9o0QBw$P1ojPSTexV2PQ.Z./rqzYex.k7TJE2nVeIVL0dql/:17126:0:99999:7:::
daemon:*:17109:0:99999:7:::
ubuntu:$6$GIfdqlb/$ms9ZoxfrUq455K6UbmHyOfz7DVf7TWaveyHcp.:17126:0:99999:7:::

C’est quoi ce charabia ?

$6$ est l’algorithme de hachage de mot de passe utilisé, dans ce cas il s’agit de sha512 suivi par un sel généré aléatoirement pour se protéger contre les attaques par les tables arc-en-ciel et finalement le hachage de votre mot de passe + le sel

Quand vous lancez un programme, il va être exécuté en tant que votre utilisateur. Même si le fichier exécutable ne vous appartient pas.

Si vous souhaitez exécuter un programme comme utilisateur root ou un autre utilisateur, c’est pour ça qu’est fait sudo.

$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm)
$ sudo id
uid=0(root) gid=0(root) groups=0(root)
$ sudo -u ubuntu id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm)
$ sudo -u daemon id
uid=1(daemon) gid=1(daemon) groups=1(daemon)

Mais comment faire si vous voulez vous connecter comme un autre utilisateur pour lancer des commandes variées ? Utilisez sudo bash ou sudo -u user bash. Vous serez capable d’utiliser le shell en tant que cet utilisateur.

Si vous n’aimez pas que l’on vous demande votre mot de passe root tout le temps, vous pouvez simplement le désactiver par ajouter votre utilisateur dans le fichier /etc/sudoers.

Essayons ça :

$ echo "$USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
-bash: /etc/sudoers: Permission denied

Bien, seul root peut le faire.

$ sudo echo "$USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
-bash: /etc/sudoers: Permission denied

C’est quoi cette merde ?

Ce qui arrive est que vous êtes en train d’exécuter la commande echo comme utilisateur root mais vous ajoutez la ligne au fichier /etc/sudoers toujours comme votre utilisateur.

D’habitude il y a deux moyens d’y arriver :

echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
sudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"

Dans le premier cas, tee -a ajoutera ce qui est envoyé sur l’entrée standard à la fin du fichier et nous exécuterons cette commande en tant que root.

Dans le second cas, nous exécutons bash en tant que root mais demandons d’exécuter une commande (-c) et la totalité de la commande va être exécutée en tant que root. Notez la complexité du “/’ ici qui dictera quand la variable $USER sera étendue.

Si vous jetez un oeil au fichier /etc/sudoers vous verrez qu’il commence par

$ sudo head -n 3 /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#

Hinhin.

C’est un avertissement utile qui dit que vous devriez éditer ce fichier avec sudo visudo. Cela validera le contenu du fichier avant de le sauver et vous empêchera de faire des erreurs. Si vous n’utilisez pas visudo et faites une erreur, cela pourrait vous enfermer hors de sudo. Ce qui signifie que vous ne pourriez plus corriger votre erreur !

Disons que vous voulez changer votre mot de passe. Vous pouvez le faire avec la commande passwd. Comme nous l’avons vu plus tôt, cela sauvera votre mot de passe dans le fichier /etc/shadow.

Ce fichier est sensible et peut seulement être écrit par root :

$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1122 Nov 27 18:52 /etc/shadow

Donc comment est-il possible qu’un programme passwd qui est exécuté par un utilisateur normal puisse écrire dans un fichier protégé ?

J’ai dit avant que quand vous lancez un processus, il vous appartient, même si le propriétaire du fichier exécutable est un autre utilisateur.

Il s’avère que vous pouvez changer ce comportement en changeant les permissions du fichier. Regardons.

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Mar 29 2016 /usr/bin/passwd

Notez la lettre s. Cela a été accompli par la commande sudo chmod u+s /usr/bin/passwd. Cela signifie que l’exécutable sera lancé en tant que propriétaire du fichier, root dans ce cas précis.

Vous pouvez trouver les exécutables avec le bit setuid avec find /bin -user root -perm -u+s.

Notez que vous pouvez aussi le faire avec les groupes (g+s).


Nous avons pénétré en profondeur dans le détail des sessions de droits des processus. Le prochain article sera consacré aux différents états possible d’un processus sur nos systèmes GNU/Linux.

Laisser un commentaire

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