C'est quelque chose sur lequel je n'ai pas pu trouver beaucoup d'informations, donc toute aide serait appréciée.
Ma compréhension est ainsi. Prenez le fichier suivant:
-rw-r----- 1 root adm 69524 May 21 17:31 debug.1
L'utilisateur phil
ne peut pas accéder à ce fichier:
phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied
Si phil
est ajouté au adm
groupe, il peut:
root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [ 0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014
Cependant, si un processus est démarré alors qu'il est défini explicitement user:group
sur, phil:phil
il ne peut pas lire le fichier. Le processus a commencé comme ceci:
nice -n 19 chroot --userspec phil:phil / sh -c "process"
Si le processus est démarré en tant que phil:adm
, il peut lire le fichier:
nice -n 19 chroot --userspec phil:adm / sh -c "process"
La question est donc vraiment:
Quelle est la particularité d'exécuter un processus avec un combo utilisateur / groupe spécifique qui empêche le processus d'accéder aux fichiers appartenant à des groupes supplémentaires de cet utilisateur et existe-t-il un moyen de contourner cela?
Réponses:
Un processus est exécuté avec un uid et un gid. Les deux ont des autorisations qui leur sont attribuées. Vous pouvez appeler chroot avec une spécification utilisateur d'un utilisateur et d'un groupe, alors qu'en réalité l'utilisateur n'est pas dans ce groupe. Le processus serait alors exécuté avec les utilisateurs uid et les groupes donnés gid.
Voir un exemple. J'ai un utilisateur appelé
user
, et il est dans le groupestudent
:J'ai un dossier comme suit:
Il ne peut pas le lire:
Maintenant, je peux exécuter le
cat
processus dans le contexte de l'utilisateuruser
ET du grouperoot
. Maintenant, le processus cat dispose des autorisations nécessaires:C'est intéressant de voir ce qui
id
dit:Hm, mais l'utilisateur
user
n'est pas dans ce groupe (root
). D'oùid
obtient ses informations? Appelée sans argumentid
utilise les appels système,getuid()
,getgid()
etgetgroups()
. Le contexte du processusid
est donc imprimé. Ce contexte avec lequel nous avons changé--userspec
.Lorsqu'il est appelé avec un argument,
id
détermine simplement les affectations de groupe de l'utilisateur:À votre question:
Vous pouvez définir le contexte du processus de sécurité nécessaire pour résoudre toutes les tâches que le processus doit effectuer. Chaque processus a un ensemble uid et gid sous lequel il s'exécute. Normalement, le processus "prend" les utilisateurs appelants uid et gid comme contexte. Avec "prend", je veux dire que le noyau le fait, sinon ce serait un problème de sécurité.
Donc, ce n'est en fait pas l'utilisateur, qui n'a pas l'autorisation de lire le fichier, ce sont les autorisations du processus (
cat
). Mais le processus s'exécute avec l'uid / gid de l'utilisateur appelant.Vous n'avez donc pas besoin d'être dans un groupe spécifique pour qu'un processus s'exécute avec votre uid et le gid de ce groupe.
la source
EUID
fait partie en appelantinitgroups(3)
. Cependant,initgroups(3)
est une opération relativement coûteuse, car elle doit énumérer tous les groupes. Pour cette raison, les processus n'appellentinitgroups(3)
que s'ils ont une raison spécifique de le faire.L'utilisation de l'
--userspec
option onchroot
spécifie l'utilisateur et un seul groupe à utiliser lors de l'exécution dechroot
. Pour définir des groupes supplémentaires, vous devez également utiliser l'--groups
option.Par défaut, les processus héritent des groupes principaux et supplémentaires de l'utilisateur qui les exécute, mais en utilisant,
--userspec
vous diteschmod
de remplacer cela en utilisant le seul groupe spécifié.Une documentation détaillée des autorisations sous Linux est disponible dans la
credentials(7)
page de manuel.la source
Lorsque vous vous connectez à Linux, le processus de connexion¹ - après avoir vérifié que vous pouvez vous connecter en tant que phil - obtient l'uid de phil et les groupes auxquels il appartient, en les définissant comme un processus qui est ensuite démarré comme votre shell. Les groupes uid, gid et supplemental sont une propriété du processus.
Tout programme ultérieur démarré par la suite est un descendant de ce shell et reçoit simplement une copie de ces informations d'identification. * Cela explique pourquoi la modification des droits de l'utilisateur n'affecte pas les processus en cours d'exécution. Cependant, les modifications seront prises en compte lors de la prochaine connexion.
* L'exception concerne les programmes dont les bits setuid ou setgid sont définis, qui auront un ID utilisateur effectif différent . Ceci est utilisé par exemple dans su (1) afin qu'il puisse fonctionner avec des
root
privilèges même lorsqu'il est exécuté parphil
.Une fois que vous avez ajouté
phil
auadm
groupe, il peut s'exécutersu phil
etsu
, en tant que root, vérifiera qu'il fournit bien le mot de passe de phil, puis l'atterrira dans un shell avec les groupes uid, gid et supplémentaires auxquels phil appartient. Et comme cela se fait après l'ajout de l'utilisateur au groupe, ce shell serait déjà dans leadm
groupe.Je ne considère pas chroot (1) le programme le plus adapté pour fonctionner en tant qu'utilisateur différent , mais il fait certainement le travail. Le paramètre le
--userspec phil:phil
fait fonctionner avec l'uid dephil
et le gid dephil
. Aucun groupe supplémentaire n'est défini (pour cela vous fourniriez--groups
). Ainsi, le processus des enfants n'est pas dans leadm
groupe.Une façon plus normale d'exécuter votre processus comme le ferait phil
su phil -c "process"
. Lors dusu
chargement, les groupes uid, gid et supplémentaires des informations de la base de données utilisateurprocess
auront les mêmes informations d'identification que l'utilisateur possède actuellement.¹ Il peut s'agir de login (1) , sshd, su, gdb ou d'autres programmes. En outre, il est probablement géré via des modules pam.
la source