Je vais essayer d'expliquer étape par étape avec quelques exemples.
Bref historique
Chaque processus a ses propres « pouvoirs de processus » qui comprend des attributs tels que PID
, les PPID
, PGID
, session ID
ainsi que les utilisateurs réels et efficaces et des ID de groupe:
RUID
, EUID
, RGID
, EGID
.
Nous allons nous concentrer sur ceux-ci.
Partie 1: Comprendre l'UID et le GID
Maintenant, je vais me connecter à un shell avec mes informations d'identification et exécuter:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Vous pouvez voir mon nom de journal (rotem), l' UID et le GID qui sont tous deux 1000, et d'autres détails comme le shell auquel je suis connecté.
Partie 2: Comprendre RUID et RGID
Chaque processus a un propriétaire et appartient à un groupe .
Dans notre shell, chaque processus que nous allons maintenant exécuter héritera des privilèges de mon compte utilisateur et fonctionnera avec le même UID et GID.
Permet d'exécuter une commande simple pour le vérifier:
$ sleep 10 & ps aux | grep 'sleep'
Et vérifiez l'UID et le GID du processus:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Ce sont l' ID utilisateur réel ( ) et l' ID de groupe réel ( ) du processus .RUID
RGID
(*) Cochez les autres options pour afficher l'UID et le GID et les moyens d'obtenir cela en une seule ligne .
Pour l'instant, acceptez le fait que les attributs EUID
et EGID
sont «redondants» et sont juste égaux à RUID
et RGID
en coulisses.
Partie 3: Comprendre l'EUID et l'EGID
Prenons la ping
commande comme exemple.
Recherchez l'emplacement binaire avec la which
commande puis exécutez ls -la
:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Vous pouvez voir que le propriétaire et le groupe du fichier sont root
. C'est parce que la ping
commande doit ouvrir une socket et que le noyau Linux demande des root
privilèges pour cela.
Mais comment puis-je utiliser ping
si je n'ai pas de root
privilège?
Notez la lettre «s» au lieu de «x» dans la partie propriétaire de l'autorisation de fichier.
Il s'agit d'un bit d'autorisation spécial pour des fichiers exécutables binaires spécifiques (comme ping
et sudo
) qui est connu sous le nom de setuid .
C'est là EUID
et EGID
entre en jeu.
Ce qui se passera, c'est lorsqu'un binaire setuid comme ping
s'exécute, le processus change son ID utilisateur effectif ( EUID
) de la valeur par défaut RUID
au propriétaire de ce fichier exécutable binaire spécial qui dans ce cas est -root
.
Tout cela est fait par le simple fait que ce fichier a le setuid
bit.
Le noyau décide si ce processus a le privilège en regardant sur EUID
le processus. Parce que maintenant le EUID
point sur root
, l'opération ne sera pas rejetée par le noyau.
Remarque : Sur les dernières versions de Linux, la sortie de la ping
commande sera différente du fait qu'elle a adopté l' approche des capacités Linux au lieu de cette approche setuid - pour ceux qui ne sont pas familiers - lisez ici .
Partie 4: Qu'en est-il du SUID et du SGID?
L'ID utilisateur enregistré ( SUID
) est utilisé lorsqu'un processus privilégié est en cours d'exécution (comme root
par exemple) et qu'il doit effectuer des tâches non privilégiées.
Dans ce cas, l'UID effectif ( EUID
) d'avant sera enregistré à l'intérieur SUID
puis changé en une tâche sans privilège. Une fois la tâche non privilégiée terminée, la valeur de EUID
sera prise en SUID
compte et reviendra au compte privilégié.