Si vous regardez l'exécutable sudo
:
$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun 3 2011 /usr/bin/sudo
Vous remarquerez qu'il porte les bits d'autorisation ---s--x--x
. Ceux-ci peuvent être décomposés comme suit:
-|--s|--x|--x
- - first dash denotes if a directory or a file ("d" = dir, "-" = file)
--s - only the setuid bit is enabled for user who owns file
--x - only the group execute bit is enabled
--x - only the other execute bit is enabled
Ainsi, lorsqu'un programme a son bit setuid activé (également appelé SUID), cela signifie que lorsque quelqu'un l'exécutera, il s'exécutera avec les informations d'identification de l'utilisateur propriétaire du fichier, à savoir. racine dans ce cas.
Exemple
Si j'exécute la commande suivante en tant qu'utilisateur saml:
$ whoami
saml
$ sudo su -
[sudo] password for saml:
Vous remarquerez que l'exécution de sudo
est en cours d'exécution en tant que root:
$ ps -eaf|grep sudo
root 20399 2353 0 05:07 pts/13 00:00:00 sudo su -
mécanisme setuid
Si vous êtes curieux de savoir comment fonctionne le SUID, jetez un coup d'œil man setuid
. Voici un extrait de la page de manuel qui l'explique mieux que je ne pourrais le faire:
setuid () définit l'ID utilisateur effectif du processus appelant. Si l'UID effectif de l'appelant est la racine, l'UID réel et l'identifiant set-user-ID enregistré sont également définis. Sous Linux, setuid () est implémenté comme la version POSIX avec la fonctionnalité _POSIX_SAVED_IDS. Cela permet à un programme set-user-ID (autre que root) de supprimer tous ses privilèges utilisateur, d'effectuer un travail non privilégié, puis de réengager l'ID utilisateur d'origine de manière sécurisée.
Si l'utilisateur est root ou que le programme est set-user-ID-root, des précautions particulières doivent être prises. La fonction setuid () vérifie l'ID utilisateur effectif de l'appelant et, s'il s'agit du superutilisateur, tous les ID utilisateur liés au processus sont définis sur uid. Après que cela se soit produit, il est impossible pour le programme de récupérer les privilèges root.
Le concept clé ici est que les programmes ont un véritable ID utilisateur (UID) et un effectif (EUID). Setuid définit l'ID utilisateur effectif (EUID) lorsque ce bit est activé.
Ainsi, du point de vue du noyau, nous saml
savons que, dans notre exemple, est toujours le propriétaire d'origine (UID), mais le EUID a été défini avec le propriétaire de l'exécutable.
setgid
Je devrais également mentionner que lorsque nous décomposons les autorisations de la commande sudo, le deuxième groupe de bits concerne les autorisations de groupe. Les bits de groupe ont également quelque chose de similaire à setuid appelé set group id (alias setgid, SGID). Cela fait la même chose que SUID sauf qu'il exécute le processus avec les informations d'identification du groupe au lieu des informations d'identification du propriétaire.
Références
sudo -s
au lieu desudo su
parce que c'est une utilisation inutile desu
. :)Le vrai
sudo
fichier binaire est setuid root , et vous ne pouvez pas simplement créer des fichiers créés de cette manière.la source
Pour répondre à la partie sur les appels système que personne ne semble avoir touchée, l'un des appels système importants est setresuid () ou setresgid (). Je suis sûr qu'il y en a d'autres, mais ces 2 semblent plutôt spécifiques à setuid / sudo.
la source