RE: user in chroot einsperren
Hey there,
-----Original Message----- From: age@ifak-system.com [mailto:age@ifak-system.com] Sent: dinsdag 15 maart 2005 10:32 To: suse-linux@suse.com Subject: user in chroot einsperren
Hallo Liste,
ich möchte eine user in ein chroot-jail sperren. Ich habe diese howto http://www.tjw.org/chroot-login-HOWTO/ ausprobiert. Es funktioniert bei mir aber nicht. Der Befehl sudo /usr/bin/chroot /home/user /bin/su - user bringt aber die Fehler-Meldung "user does not exist".
Hat jemand eine Idee? Die Verzeichnisse /etc und /home/user/etc haben den gleichen Inhalt (testweise). Und ohne chroot-shell funktioniert das Login. Als Betriebssystem nutze ich Suse 9.2
Hab das vor 1,2 Jahren ein paar mal erfolgreich hinbekommen. Anbei meine alte doku, da wird auch auf ein paar Fehler eingegangen, Vielleicht haste ja Glueck und es hilft: ######## Chroot-Umgebung Prinzip der "chroot-Umgebung": Mit dem Befehl chroot unter linux kann einem eingeloggten User ein falsches root-Verzeichnis vorgespielt werden. Man setzt bsp. das Home-Verzeichnis eines users über chroot als root-Verzeichnis. In diesem Fall endet der Verzeichnisbaum hier, das Home-Verzeichnis wird als "/" angezeigt und man kann nicht mehr in eine höhere Ebene wechseln. Nachteil daran ist, dass das Betriebssystem diese Illusion ebenfalls für wahr nimmt und daher keine Befehle, Konfigurationsdateien, Libraries etc. mehr findet, die sich alle im wirklichen Hauptpfad befinden. Will man also einem User die Möglichkeit geben, in seiner neuen Umgebung Befehle wie "ls" oder "rm" auszuführen, müssen diese Befehle samt Bibliotheken in den neuen Pfad kopiert bzw. dort neu kompiliert werden. Daher muß man innerhalb der chroot-Umgebung noch mal einen kleinen Verzeichnisbaum installieren, in dem alle gewünschten Funktionalitäten implementiert sind. Hat man dies getan, muß der Login-Vorgang noch so verändert werden, dass beim Einloggen die chroot-Umgebung aktiviert wird. So kann man einen User in einen Käfig sperren, den er nicht verlassen kann und stellt ihm nur genau die Befehle und Programme zur Verfügung, die man noch einmal extra für ihn in seiner Umgebung implementiert hat. Login-prinzip: User startet "login" Seine shell startet "sudo(root)" root führt "chroot $home" aus root führt "su $user" aus shell nun im Normalbetrieb User befindet sich in chroot-Umgebung SSH2 über Public-Key: Möglicherweise soll auch ein ssh2 über public key in die chroot-Umgebung ausgeführt werden. In diesem Fall sollte noch vor der Installation dieser Umgebung der ssh2 vorbereitet werden, da ein Entpacken, Konfigurieren und Installieren von Paketen sowie die Ausführung etwa des ssh-keygen2 danach nicht mehr funktioniert. Denken Sie daran, dass der eingesperrte User den ssh-keygen2 ausführen muß. Ändern Sie den unter Step 2 beschriebenen Eintrag in der /etc/passwd: user:x:user-id:group-id::/tmp:/bin/chroot-shell folgendermaßen ab : user:x:user-id:group-id::/home/user:/bin/chroot-shell Die übrige Installation des ssh2 public key erfolgt wie in jeder anderen Umgebung. Howto in 8 Steps Step 1: Neue Shell Zuerst muß eine neue Login-shell für den User geschrieben werden. Diese muß dann unter /bin gespeichert werden, der Name der shell ist egal, hier wird "chroot-shell" verwendet. #!/bin/bash if [ "$1" = "-c" ]; then i=0; PARAMS=""; for param in $*; do if [ $i -gt 0 ]; then PARAMS="$PARAMS $param"; fi let i++; done; sudo /usr/bin/chroot /home/$USER /bin/su - $USER -c "$PARAMS" else sudo /usr/bin/chroot /home/$USER /bin/su - $USER fi; Diese shell sollte nun noch durch Rechteänderung "executable" werden. Step 2: User-Einstellungen Der Eintrag für den User in der /etc/passwd sollte folgendermaßen aussehen: user:x:user-id:group-id::/tmp:/bin/chroot-shell wwwdocs:x:503:103::/tmp:/bin/chroot-shell (Beispiel) Das Anlegen des Users über Yast2 allein ist nicht möglich, da dort keine alternative Login-shell gewählt werden kann. Es empfiehlt sich daher ein useradd. useradd -d /tmp -s /bin/chroot-shell user passwd user Step 3: Neuer Hauptpfad In dem Home-Verzeichnis, welches über chroot neuer Hauptpfad wird, werden einige directories benötigt. Diese können mit mkdir angelegt werden. (/home/user ist ggf. schon vorhanden) mkdir /home/user mkdir /home/user/etc mkdir /home/user/dev mkdir /home/user/bin mkdir /home/user/lib mkdir /home/user/usr mkdir /home/user/usr/bin mkdir /home/user/home Über chown sollte nun noch das neue Home-Verzeichnis /home/user/home dem User gegeben werden. chown user:group /home/user/home Die anderen Verzeichnisse (etc, bin...) inklusive der Befehle in bin müssen unbedingt weiter root gehören. Step 4: Neue passwd und group Die neue Umgebung benötigt nun noch eine passwd sowie eine group, da sie nicht mehr auf die originalen Files im echten Hauptpfad zugreifen kann. vi /home/user/etc/passwd root:x:0:0::/:/bin/bash user:x:user-id:group-id::/home:/bin/bash und vi /home/user/etc/group root:x:0: user:x:group-id: Step 5: Installiere bash Die bash samt benötigter libraries muß in die chroot-Umgebung kopiert werden. cp /bin/bash /home/user/bin/ Um die benötigten libraries zu erfahren, kann man folgenden Befehl nutzen: ldd /bin/bash Es empfiehlt sich allerdings, alle libraries unter /lib zu kopieren, da auch die noch benötigten Befehle auf diese zurückgreifen müssen und ein einzelnes herauspicken unnötig mühsam ist. cp /lib/* /home/user/lib/ Step 6: Benötigte Befehle Sobald man sich klar darüber ist, welche Befehle dem User zur Verfügung gestellt werden sollen, können diese samt ihrer libraries in die chroot-Umgebung kopiert werden. cp /bin/Befehl /home/user/bin/ cp /bin ls rm mv cp /home/wwwdocs/bin/ (Beispiel) Auch hier können die Libraries wieder abgefragt werden. ldd /bin/Befehl Hat man allerdings schon alle Bibliotheken kopiert, kann man sich dies ersparen. Step 7: "su" neu bilden Der Befehl "su" wird in jedem Fall benötigt, da er im Login-Prozess verwendet wird. Er kann jedoch nicht einfach kopiert werden wie die übrigen Befehle, sondern muß in der Chroot-Umgebung neu gebildet werden. Dazu sollte man sich den Code des Befehls besorgen. Eine Adresse hierfür ist : ftp://alpha.gnu.org/pub/gnu, dort nach "sh-utils" suchen. Hat man den Code, muß man in der "configure"-Anweisung den neuen Pfad bedenken. ./configure --prefix=/home/user make check make install <Optional> Step 8: OpenSSH für den user einrichten Hierfür müssen die benötigten Befehle wie zuvor auch in die chroot-Umgebung kopiert werden. cp /usr/bin/ssh /home/user/usr/bin/ cp /usr/bin/scp /home/user/usr/bin/ cp /usr/bin/env /home/user/usr/bin/ Weiterhin werden auch hier Libraries benötigt, der ldd-Befehl kann wie schon oben verwendet werden. Zusätzlich benötigte Konfiguration: mknod -m 0666 /home/user/dev/tty c 5 0 mknod -m 0644 /home/user/dev/urandom c 1 9 </Optional> Step 9: sudo Als letztes muß nun noch die Ausführung des "sudo" beim Login-Vorgang ermöglicht werden. Das kann nur mit dem Befehl "visudo" durchgeführt werden. In der nun geöffneten Konfigurationsdatei muß folgende Zeile eingefügt werden: user ALL = NOPASSWD: /usr/bin/chroot /home/user /bin/su - user* Gegebenenfalls muß dafür erst das Paket "visudo.rpm" installiert werden. Troubleshooting: /bin/su: cannot set groups: Operation not permitted Hier hatten alle Befehle unter /home/user/bin/ den Besitzer user statt root. su: cannot run /bin/chroot-shell: No such file or directory Hier wurde die "chroot-shell.txt" aus windoof nach linux kopiert. Dabei wurden alle fremden Formatierungen mitgenommen. Stattdessen muß auf dem linux der Inhalt der txt-Datei in eine neue Datei "chroot-shell" geschrieben werden. Sorry, user nonhome is not allowed to execute '/usr/bin/chroot /h/nonhome /bin/su - nonhome' as root on Einstein. Fehler: In der chroot-shell stimmt der Pfad des Home-Verzeichnisses nicht. /bin/chroot-non: /bin/chroot-non: Permission denied Fehler: Chroot-shell ist nicht executeable. su: cannot run /bin/chroot-non: No such file or directory Fehler: Chroot-shell liegt nicht unter /bin. su: user nonhome does not exist Einstein:~ # Fehler: Kein Eintrag in der /etc/passwd. /bin/su: user nonhome does not exist Fehler: In der Chroot-Umgebung existiert keine /chrootpfad/etc/passwd. /bin/su: cannot run /bin/bash: No such file or directory Fehler: In der Chroot-Umgebung existiert keine /chrootpfad/bin/bash /bin/su: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory Fehler: In der Chroot-Umgebung existieren die benötigten libraries nicht unter /chrootpfad/lib/. /bin/su: incorrect password Fehler: Der Befehl "su" wurde einfach in die chroot-Umgebung kopiert, statt ihn dort zu kompilieren. nonhome is not in the sudoers file. This incident will be reported. Fehler: Der Eintrag in "visudo" fehlt. Sorry, user nonhome is not allowed to execute '/usr/bin/chroot /nonhome /bin/su - nonhome' as root on Einstein. Fehler: Hier stimmt der Eintrag in "visudo" nicht. In diesem Beispiel ist der Pfad /nonhome nicht korrekt. ######## Viel Glueck, Bernd This e-mail and any attachment is for authorised use by the intended recipient(s) only. It may contain proprietary material, confidential information and/or be subject to legal privilege. It should not be copied, disclosed to, retained or used by, any other party. If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender. Thank you.
Hallo, Am Tue, 15 Mar 2005, Bernd Tannenbaum schrieb:
Step 1: Neue Shell Zuerst muß eine neue Login-shell für den User geschrieben werden. Diese muß dann unter /bin gespeichert werden, der Name der shell ist egal, hier wird "chroot-shell" verwendet.
#!/bin/bash if [ "$1" = "-c" ]; then i=0; PARAMS=""; for param in $*; do if [ $i -gt 0 ]; then PARAMS="$PARAMS $param"; fi let i++; done; sudo /usr/bin/chroot /home/$USER /bin/su - $USER -c "$PARAMS" else sudo /usr/bin/chroot /home/$USER /bin/su - $USER fi;
*ARGH* Du machst doch genau nix mit den Argumenten. Und wenn der erste -c ist, dann gibst du alle ausser diesem auch so weiter und stellst ein '-c' voran. Allerdings vermurkst du die Argumente, wenn diese z.B. ein Tab enthalten, $* ist nicht dafuer geeignet. $ foo() { i=0; PARAMS=""; for x in $*; do if test $i -gt 0; then PARAMS="$PARAMS $x"; fi; let i+=1; done; ls $PARAMS; } Ich quote das $PARAMS am Ende nicht, weil das bei der shell, die das hinter dem -c uebergeben bekommt, dies ohne die "" sieht. $ foo '"a"' 'a b' 'foo bar' ls: a: No such file or directory ls: b: No such file or directory ls: foo: No such file or directory ls: bar: No such file or directory (Alle 3 Dateien existieren! -- und "a" wird hier komplett verschluckt). Korrekt waere folgende Loesung: $ foo() { i=0; PARAMS=""; for x in "$@"; do PARAMS[i]="$x"; let i+=1; done; ls -lb "${PARAMS[@]}"; } $ foo '"a"' 'a b' 'foo bar' -rw-r--r-- 1 dh dh 0 Apr 13 2004 "a" -rw-r--r-- 1 dh dh 0 Aug 20 2002 a\ b -rw-r--r-- 1 dh dh 0 Mar 15 20:19 foo\tbar Oder: if test $# -gt 0 && test "x$1" = "x-c"; then shift; # weg mit dem '-c' for param; ## bashism, iteriert ueber "$@" do : # mach was mit "$param" done fi Die Parameterkette muss man dann aber wieder wie oben zusammenbauen. Im konkreten Fall werden aber ja die Parameter _NICHT_ veraendert, hoechstens vermurkst, ergo sollte einfach folgendes verwendet werden: ==== #!/bin/bash exec /usr/bin/sudo /usr/bin/chroot "/home/${USER}" /bin/su - "$USER" "$@" ==== -dnh, Zufallssig! *dem sigmonster einen Keks gebend* -- Sufficiently advanced incompetence is indistinguishable from malice. -- dima
Hallo Bernd, hallo Leute, Am Dienstag, 15. März 2005 14:04 schrieb Bernd Tannenbaum:
#!/bin/bash if [ "$1" = "-c" ]; then i=0; PARAMS=""; for param in $*; do
Besser: for param in "$@"; do Deine Variante dürfte bei Leerzeichen innerhalb eines Parameters explodieren - einmal beim $* und einmal beim wieder-Zusammensetzen in $PARAMS.
if [ $i -gt 0 ]; then PARAMS="$PARAMS $param"; fi let i++; done;
Wenn ich das richtig verstanden habe, packt das alle Parameter außer dem ersten nach $PARAMS. Statt der Schleife kannst Du einmal shift aufrufen ;-) und bist gleich noch den Ärger mit Leerzeichen los.
sudo /usr/bin/chroot /home/$USER /bin/su - $USER -c "$PARAMS"
... und statt "$PARAMS" verwendest Du dann einfach "$@" Gruß Christian Boltz --
Auch ein Profi stößt immer wieder auf Fragestellungen, die er nicht aus dem Stehgreis beantworten kann. ^^^^^^^^^ Ist das ein 80jähriger auf Viagra? [> Bernhard Lindenau und Thorsten von Plotho-Kettner in suse-linux]
hallo leutz ich möchte mal mein netz debuggen und weis das es das tool tcpdump gibt!! nur wie wird das benutzt ? wie kann ich den inhalt lesen und auswerten ? gibt's da eine lesbare anleitung in deutsch ? thanks
Am Mittwoch, 16. März 2005 09:53 schrieb Uwe Grosskinsky - IAS GmbH: [..]
nur wie wird das benutzt ?
Also auf dem eigenen Host selber musst du einfach nur "tcpdump" ausführen.
wie kann ich den inhalt lesen und auswerten ?
gibt's da eine lesbare anleitung in deutsch ?
http://www.64-bit.de/dokumentationen/howto/de/html/DE-NET2-HOWTO-14.html siehe Artikel : "Retter in der Not" c't 4/2003 S.104 Untertitel Knoppix als Werkzeug zur Systemwartung und Netzwerkdiagnose Ansonsten kannst du dir für tcpdump auch noch die GUI "iptraf" oder "iptop" besorgen... Gruß Sören PS: http://www.eschkitai.de/suse-etikette/etikette.html#neu
jaaaaa sowas in der art dachte ich mir erster schritt für mich nur die parameter wann man was am besten nutzt um welche infos zu bekommen das würde mich noch brennend interssieren Am Mittwoch, 16. März 2005 16:06 schrieb Sören Wengerowsky:
Am Mittwoch, 16. März 2005 09:53 schrieb Uwe Grosskinsky - IAS GmbH: [..]
nur wie wird das benutzt ?
Also auf dem eigenen Host selber musst du einfach nur "tcpdump" ausführen.
wie kann ich den inhalt lesen und auswerten ?
gibt's da eine lesbare anleitung in deutsch ?
http://www.64-bit.de/dokumentationen/howto/de/html/DE-NET2-HOWTO-14.html
siehe Artikel : "Retter in der Not" c't 4/2003 S.104 Untertitel Knoppix als Werkzeug zur Systemwartung und Netzwerkdiagnose
Ansonsten kannst du dir für tcpdump auch noch die GUI "iptraf" oder "iptop" besorgen...
Gruß Sören
Am Mittwoch, 16. März 2005 16:24 schrieb Uwe Grosskinsky - IAS GmbH:
nur die parameter wann man was am besten nutzt um welche infos zu bekommen das würde mich noch brennend interssieren
Naja.. da wirst du um "man tcpdump" kaum herum kommen. http://www.tcpdump.org/tcpdump_man.html Zumindest kenne ich keine deutsche Version... http://weidner.in-bad-schmiedeberg http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/examples-tcpdump.html.de/com... http://www.tcpdump.org/ http://seclists.org/lists/security-basics/2002/Oct/0430.html HTH Gruß Sören
hallo leute ich möchte das mein proxyserver der auch als gateway tut ein icmp redirect für alle clients im netz xyz zurückgibt nur weis ich nicht wie und wo man das aktiviert ?? ich hab zwar gegoogelt .... leider für meinen wissensstand nichts gefunden (ich habe keinen plan wo man das eintragen muss ??) hat hierzu jemand einen tipp ich habe eine firewall und dahintern den proxy (incl. routerfunktion) ipweilterleitung ist aktiv hinter dem proxy stzen die clients nun gehts darum einen bypass für einen vpn router zu setzen !!!!!! der proxy soll sagen wenn ein vpn tunnel aufgebaut wird und eine entsprechende anfrage kommt das der client dann auf die ip des vpnrouters geht. und nun soll der client die vpn aufbaun und sich bei der gebenstelle einloggen. ich möchte verhindern das jeder user immer sein gateway umstellen muss kann mir damit jemand helfen ?? danke
participants (5)
-
Bernd Tannenbaum
-
Christian Boltz
-
David Haller
-
Sören Wengerowsky
-
Uwe Grosskinsky - IAS GmbH