2010-09-17 11 views
21

Ich richte eine minimale Chroot ein und möchte vermeiden, dass sudo oder su drin ist, aber meine Prozesse immer noch als nicht root ausführen. Das ist ein kleiner Trick, da root chroot requers root benötigt. Ich kann ein Programm schreiben, das dies tut, dass so etwas aussehen würde:Wie führe ich einen Befehl in einem Chroot-Gefängnis nicht als root und ohne sudo aus?

uid = LookupUser(args[username]) // no /etc/passwd in jail 
chroot(args[newroot]) 
cd("/") 
setuids(uid) 
execve(args[exe:]) 

Ist die meine beste Wette oder gibt es ein Standard-Tool, das für mich macht das?


Ich rollte meinen eigenen here:

Antwort

23

Wenn Sie chroot von Root aufrufen, chroot Option wird Ihnen helfen. Der Befehl chroot verfügt über die Option --userspec=USER:GROUP, die unter einer Nicht-Root-UID/GID ausgeführt werden soll.

Übrigens wird die Option '--userspec' zuerst in coreutils-7.5 nach einem Git-Repository git://git.sv.gnu.org/coreutils eingeführt.

+0

Das sieht genau so aus, was ich will, aber ich kann keine Dokumentation darüber finden. (Ich betrachte die Man- und Infoseiten.) Haben Sie einen Link zu einigen Dokumenten? – BCS

+0

Es tut mir leid, aber es scheint, dass die Option '--userspec' RHEL> = 6.0 oder Fedora> = 13 eingeführt wird. – kamae

16

fakechroot, in Kombination mit fakeroot, ermöglicht es Ihnen, dies zu tun. Sie werden dafür sorgen, dass alle laufenden Programme so funktionieren, als würden sie in einer chroot als root ausgeführt, aber sie laufen tatsächlich wie Sie.

Siehe auch fakechroot's man page.

+2

Ich brauche eine echte chroot, wie ich sein werde kompilieren und nicht vertrauenswürdigen Code ausgeführt wird, die Inline-ASM enthalten könnte. – BCS

+1

Da ich selbst Jahre später auf diesen Thread gestoßen bin, muss ich hinzufügen: Verwenden Sie niemals chroot zur Sicherheit. https://lwn.net/Articles/252794/ – domenukk

8

Sie können Linux-Funktionen nutzen, um Ihrer Binärdatei die Möglichkeit zu geben, chroot() ohne root aufzurufen. Als Beispiel können Sie dies mit der Binärdatei chroot tun. Als Nicht-Wurzel, in der Regel würden Sie diese:

$ chroot /tmp/ 
chroot: cannot change root directory to /tmp/: Operation not permitted 

Aber nachdem Sie den setcap Befehl ausführen:

sudo setcap cap_sys_chroot+ep /usr/sbin/chroot 

Es wird Ihnen die chroot Anruf tun.

Ich empfehle nicht, dass Sie dies mit dem System chroot tun, dass Sie es stattdessen zu Ihrem eigenen Programm tun und chroot aufrufen. Auf diese Weise haben Sie mehr Kontrolle über das, was passiert, und Sie können sogar die cap_sys_chroot-Berechtigung löschen, nachdem Sie sie aufgerufen haben, sodass nachfolgende Aufrufe von chroot in Ihrem Programm fehlschlagen.

+0

So wird es einem beliebigen Benutzer erlauben, den chroot sys-Aufruf über jede binäre Zugriffe als aufzurufen '/ usr/sbin/chroot'? Das würde dann jedem Prozess innerhalb einer Chroot ermöglichen, den Chroot-Sys-Aufruf aufzurufen, vorausgesetzt, er kann eine ausführbare Datei mit dem Namen '/ usr/sbin/chroot' relativ zum aktuellen root erzeugen. - Ich würde das lieber nicht tun, indem ich das Kernel-Sicherheitsmodell lockere. – BCS

+0

Ich habe die Antwort aktualisiert, um zu reflektieren, dass es nur ein Beispiel war, sie auf die Chroot-Binärdatei zu setzen. Du würdest diesen Setcap auf deiner eigenen Binärdatei machen wollen. –

8

Ein benutzerdefinierter chrooter ist nicht schwer zu schreiben:

#define _BSD_SOURCE 
#include <stdio.h> 
#include <unistd.h> 
const char newroot[]="/path/to/chroot"; 
int main(int c, char **v, char **e) { 
    int rc; const char *m; 
    if ((m="chdir" ,rc=chdir(newroot)) == 0 
     && (m="chroot",rc=chroot(newroot)) == 0 
     && (m="setuid",rc=setuid(getuid())) == 0) 
      m="execve", execve(v[1],v+2,e); 
    perror(m); 
    return 1; 
} 

Machen Sie, dass setuid root und im Besitz von einer benutzerdefinierten Gruppe Sie Ihren gewünschten Benutzer (und keinen ‚anderen‘ Zugang) hinzuzufügen.

1

könnten Sie Linux Container verwenden, um eine chroot-Umgebung zu schaffen, die in einem ganz anderen Namespace ist (IPC, Dateisystem-und sogar Netzwerk)

Es gibt sogar LXD das in der Lage ist, die Erzeugung von bildbasierten Containern zu verwalten und konfigurieren Sie sie so, dass sie als nicht privilegierte Benutzer ausgeführt werden. Wenn der nicht vertrauenswürdige Code den Container irgendwie verlassen kann, kann er nur Code als nicht privilegierter Benutzer und nicht als Root des Systems ausführen.

Search ‚Linux Container‘ und ‚LXD‘ auf Ihrer bevorzugte Suchmaschine;)