Dies ist etwas, über das ich nicht viele Informationen finden konnte, daher wäre jede Hilfe dankbar.
Mein Verständnis ist also. Nehmen Sie die folgende Datei:
-rw-r----- 1 root adm 69524 May 21 17:31 debug.1
Der Benutzer phil
kann nicht auf diese Datei zugreifen:
phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied
Wenn phil
es der adm
Gruppe hinzugefügt wird , kann es:
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
Wenn jedoch ein Prozess gestartet wird, während das explizit user:group
auf gesetzt ist phil:phil
, kann die Datei nicht gelesen werden. Der Prozess begann folgendermaßen:
nice -n 19 chroot --userspec phil:phil / sh -c "process"
Wenn der Prozess als gestartet wird phil:adm
, kann er die Datei lesen:
nice -n 19 chroot --userspec phil:adm / sh -c "process"
Die Frage ist also wirklich:
Was ist das Besondere daran, einen Prozess mit einer bestimmten Benutzer- / Gruppenkombination auszuführen, die verhindert, dass der Prozess auf Dateien zugreifen kann, die zusätzlichen Gruppen dieses Benutzers gehören, und gibt es eine Möglichkeit, dies zu umgehen?
Antworten:
Ein Prozess wird mit einer UID und einer GID ausgeführt. Beiden sind Berechtigungen zugewiesen. Sie können chroot mit einer Benutzerspezifikation eines Benutzers und einer Gruppe aufrufen, wobei sich der Benutzer tatsächlich nicht in dieser Gruppe befindet. Der Prozess würde dann mit der Benutzer-UID und der angegebenen Gruppen-GID ausgeführt.
Siehe ein Beispiel. Ich habe einen Benutzer namens
user
und er ist in der Gruppestudent
:Ich habe eine Datei wie folgt:
Er kann es nicht lesen:
Jetzt kann ich den
cat
Prozess im Kontext des Benutzersuser
UND der Gruppe ausführenroot
. Jetzt verfügt der Cat-Prozess über die erforderlichen Berechtigungen:Es ist interessant zu sehen, was
id
sagt:Hm, aber der Benutzer
user
ist nicht in dieser Gruppe (root
). Woherid
kommen die Informationen? Wenn ohne Argument aufgerufen,id
verwendet die Systemaufrufegetuid()
,getgid()
undgetgroups()
. So wird der Prozesskontext vonid
selbst gedruckt. Diesen Kontext haben wir geändert--userspec
.Wenn mit einem Argument aufgerufen, werden
id
nur die Gruppenzuweisungen des Benutzers bestimmt:Zu Ihrer Frage:
Sie können den Sicherheitsprozesskontext festlegen, der zur Lösung der Aufgaben erforderlich ist, die der Prozess ausführen muss. Jeder Prozess hat eine UID und ein GID-Set, unter denen er ausgeführt wird. Normalerweise "nimmt" der Prozess die aufrufenden Benutzer uid und gid als seinen Kontext. Mit "Takes" meine ich, dass der Kernel dies tut, sonst wäre es ein Sicherheitsproblem.
Es ist also eigentlich nicht der Benutzer, der keine Berechtigungen zum Lesen der Datei hat, sondern die Berechtigungen des Prozesses (
cat
). Der Prozess wird jedoch mit der UID / GID des aufrufenden Benutzers ausgeführt.Sie müssen sich also nicht in einer bestimmten Gruppe befinden, damit ein Prozess mit Ihrer UID und der GID dieser Gruppe ausgeführt werden kann.
quelle
EUID
es gehörtinitgroups(3)
. Diesinitgroups(3)
ist jedoch eine relativ teure Operation, da alle Gruppen aufgelistet werden müssen. Aus diesem Grund rufen Prozesse nur auf,initgroups(3)
wenn sie einen bestimmten Grund dafür haben.Wenn Sie die
--userspec
Option ein verwenden,chroot
werden der Benutzer und eine einzelne Gruppe angegeben, die beim Ausführen von verwendet werden sollenchroot
. Um zusätzliche Gruppen zu definieren, müssen Sie auch die--groups
Option verwenden.Standardmäßig erben Prozesse die primären und zusätzlichen Gruppen des Benutzers, der sie ausführt. Wenn Sie sie jedoch verwenden, müssen
--userspec
Siechmod
diese mit der angegebenen Einzelgruppe überschreiben.Eine ausführliche Dokumentation der Berechtigungen unter Linux finden Sie in der
credentials(7)
Manpage.quelle
Wenn Sie sich bei Linux anmelden, erhält der Anmeldevorgang¹ - nachdem Sie überprüft haben, dass Sie sich als phil anmelden können - die UID von phil und den Gruppen, zu denen er gehört, und legt diese als Prozess fest, der dann als Ihre Shell gestartet wird. Die Gruppen uid, gid und supplemental sind eine Eigenschaft des Prozesses.
Jedes spätere Programm, das danach gestartet wird, ist ein Nachkomme dieser Shell und erhält einfach eine Kopie dieser Anmeldeinformationen. * Dies erklärt, warum das Ändern der Rechte des Benutzers keine Auswirkungen auf die ausgeführten Prozesse hat. Die Änderungen werden jedoch beim nächsten Login übernommen.
* Die Ausnahme bilden Programme, deren setuid- oder setgid-Bits gesetzt sind und die eine andere effektive Benutzer-ID haben . Dies wird beispielsweise in su (1) verwendet, damit es
root
auch bei Ausführung mit ausgeführt werden kannphil
.Nachdem Sie
phil
deradm
Gruppe hinzugefügt haben , kann er ausgeführtsu phil
werden undsu
wird - als Root ausgeführt - überprüfen, ob er tatsächlich Phils Passwort bereitstellt, und ihn dann in einer Shell mit den UID-, GID- und Zusatzgruppen landen, zu denen Phil gehört. Und da dies nach dem Hinzufügen des Benutzers zur Gruppe erfolgt, befindet sich diese Shell bereits in deradm
Gruppe.Ich halte chroot (1) nicht für das am besten geeignete Programm, um als anderer Benutzer ausgeführt zu werden , aber es erledigt die Arbeit auf jeden Fall. Der Parameter
--userspec phil:phil
lässt es mit der UID vonphil
und der GID von laufenphil
. Es sind keine zusätzlichen Gruppen festgelegt (für die Sie angeben würden--groups
). Somit ist der Kinderprozess nicht in deradm
Gruppe.Ein normaler Weg, um Ihren Prozess so auszuführen, wie es phil wäre
su phil -c "process"
. Beimsu
Laden der UID-, GID- und Zusatzgruppen aus den Benutzerdatenbankinformationenprocess
werden dieselben Anmeldeinformationen verwendet , über die der Benutzer derzeit verfügt.¹ Dies können Login (1) , sshd, su, gdb oder andere Programme sein. Außerdem wird es wahrscheinlich über Pam-Module verwaltet.
quelle