Je connais déjà le véritable identifiant d'utilisateur . C'est le numéro unique d'un utilisateur dans le système.
Dans mon système, mon uid
est
$ echo $UID
1014
$
À quoi servent les deux autres supports d'identification?
Et à quoi sert un identifiant d'utilisateur efficace et un identifiant utilisateur enregistré et où nous les utilisons dans le système?
Réponses:
La distinction entre un identifiant d'utilisateur réel et un identifiant effectif est faite parce que vous pourriez avoir besoin de prendre temporairement l'identité d'un autre utilisateur (la plupart du temps, ce serait le cas
root
, mais cela pourrait être n'importe quel utilisateur). Si vous n'aviez qu'un seul identifiant d'utilisateur, alors il n'y aurait aucun moyen de revenir à votre identifiant d'origine par la suite (autre que de prendre votre parole pour acquise, et au cas où vous l'auriez faitroot
, en utilisantroot
les privilèges de pour passer à n'importe quel utilisateur).Ainsi, l'ID utilisateur réel est qui vous êtes vraiment (celui qui possède le processus), et l'ID utilisateur effectif est ce que le système d'exploitation examine pour décider si vous êtes autorisé ou non à faire quelque chose (la plupart du temps , il y a quelques exceptions).
Lorsque vous vous connectez, le shell de connexion définit à la fois l'ID utilisateur réel et effectif sur la même valeur (votre ID utilisateur réel) que celle fournie par le fichier de mots de passe.
Maintenant, il arrive aussi que vous exécutiez un programme setuid, et en plus de s'exécuter en tant qu'un autre utilisateur (par exemple
root
), le programme setuid est également censé faire quelque chose en votre nom. Comment cela marche-t-il?Après avoir exécuté le programme setuid, il aura votre véritable identifiant (puisque vous êtes le propriétaire du processus) et l'identifiant effectif du propriétaire du fichier (par exemple
root
) puisqu'il est setuid.Le programme fait tout ce qu'il faut de magie avec les privilèges de superutilisateur et souhaite ensuite faire quelque chose en votre nom. Cela signifie que tenter de faire quelque chose que vous ne devriez pas pouvoir faire devrait échouer . Comment fait-il cela? Eh bien, évidemment en changeant son identifiant d'utilisateur effectif en l'identifiant réel de l'utilisateur!
Maintenant, ce programme setuid n'a aucun moyen de revenir en arrière puisque tout ce que le noyau sait, c'est votre identifiant et ... votre identifiant . Bang, tu es mort.
C'est à cela que sert l'ID utilisateur de l'ensemble enregistré.
la source
access
. C'est 99,9% de celui-ci. Aussisetfsuid
(mais rarement nécessaire), et quelques fonctions de très bas niveau, et vous avez besoin (mais pas vérifié) de l'ID utilisateur réel pour obtenir / définir les priorités ou le planificateur, et les ID passés aux gestionnaires de signaux ou renvoyés parwait
et al. sont de vrais identifiants.execve
ne vérifie pas, mais peut échouer si vous avez changé l'ID utilisateur réel. Aussifork
ne vérifie pas, mais peut échouer si vous atteignez le quota de processus maximum sur l'UID réel. Google avecsite:man7.org
est votre ami ici.ping
a besoin d'une prise brute . tout utilisateur peut (généralement) ouvrir une socket, et pour l'écoute, au-dessus de 1024.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
, lesPPID
,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:
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:
Et vérifiez l'UID et le GID du processus:
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
etEGID
sont «redondants» et sont juste égaux àRUID
etRGID
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écutezls -la
:Vous pouvez voir que le propriétaire et le groupe du fichier sont
root
. C'est parce que laping
commande doit ouvrir une socket et que le noyau Linux demande desroot
privilèges pour cela.Mais comment puis-je utiliser
ping
si je n'ai pas deroot
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
etsudo
) qui est connu sous le nom de setuid .C'est là
EUID
etEGID
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éfautRUID
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 leEUID
point surroot
, 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 (commeroot
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érieurSUID
puis changé en une tâche sans privilège. Une fois la tâche non privilégiée terminée, la valeur deEUID
sera prise enSUID
compte et reviendra au compte privilégié.la source