chroot...

öh joa...

Da mich CGI-PHP (siehe HaBo) langsam zu nerven anfängt hab ich mir gedacht ich mach mich mal daran ein chroot für diverse Server einzurichten...

Naja einfacher gesagt als getan...

Soweit ich das verstanden hab setzt chroot einfach das root-Verzeichnis von / auf zB /chroot/ innerhalb des chroots scheint /chroot/ aber / zu sein...

Desweiteren muss man alle Programme / Libs / Ordner/ etc die aufgerufen werden können sollen (was für ein Satzbau...) in das Chroot kopieren / Hardlinken / Mounten.

Ich hab jetzt folgendes veruscht:

ein Verzeichnis "chroot" erstellt.
Code:
cp /bin/sh /chroot/bin/
cp /bin/echo /chroot/bin/
cp /etc/passwd /chroot/etc/
cp /etc/group /chroot/etc/
cp /etc/shadow /chroot/etc/

Mein Gedanke:
wenn ich jetzt in das chroot wechsle sollte ich eigentlich die shell /bin/sh öffnen, sonst aber eigentlich nix weiter machen können...

Code:
chroot /chroot /bin/sh
ausgeführt und folgende Fehlermeldung bekommen:
Code:
chroot: cannot run command `/bin/sh': No such file or directory


Irgendwei gibt es keine gescheiten Dokus zu chroot - zumindest konnte ich bis jetzt keine finden...
Kann mir jemand erklären wie das mit chroot funktioniert?
 
sh selbst ist auch nicht die Shell, sondern nur ein Link auf die verwendete Shell, die da im Regelfall /bin/bash ist, aber auch was anderes sein kann (ash, csh, ksh etc.). Außerdem brauchst du auch nicht nur Binaries, sondern auch die verwendeten Bibliotheken und Configdateien im Jail.

Ein Jail selber einzurichten ist aber ziemlich mühsam, schau lieber mal ob du da ein Script für findest. Jailkit ist zum Beispiel eins.
 
sh selbst ist auch nicht die Shell, sondern nur ein Link auf die verwendete Shell, die da im Regelfall /bin/bash ist, aber auch was anderes sein kann (ash, csh, ksh etc.).

das stimmt so aber nicht ganz. /bin/sh ist die Bourne-shell die (meineswissens) standartmässig auf jedem *nix system zu finden ist. bash (Bourne-again-shell) ist eine Erweiterung.
Würde man die Shebang eines shellscriptes mit #!/bin/sh einleiten, würde z.B die /etc/bash/bashrc nicht mit eingelesen werden.
 
Original von EL
das stimmt so aber nicht ganz. /bin/sh ist die Bourne-shell die (meineswissens) standartmässig auf jedem *nix system zu finden ist. bash (Bourne-again-shell) ist eine Erweiterung.
Würde man die Shebang eines shellscriptes mit #!/bin/sh einleiten, würde z.B die /etc/bash/bashrc nicht mit eingelesen werden.

Code:
bitmuncher@deepthought:~$ ls -lh /bin/sh
lrwxrwxrwx 1 root root 9 2006-12-20 13:20 /bin/sh -> /bin/bash

Was zu beweisen war. ;)

Abgesehen davon gibt es die Bash nicht auf jedem Unix-System. Es gibt Unixes, die per Default mit der ksh oder der csh arbeiten.

Die bashrc wird übrigens nur dann eingelesen, wenn die Bash als Login-Shell (Parameter '-l') aufgerufen wird und selbst dann nur, wenn das in einer Profile-Datei entsprechend definiert wurde

Code:
       When  bash  is  invoked  as an interactive login shell, or as a non-interactive shell with the --login option, it
       first reads and executes commands from the file /etc/profile, if that file exists.  After reading that  file,  it
       looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the
       first one that exists and is readable.  The --noprofile option may be used when the shell is started  to  inhibit
       this behavior.

Siehe also 'man bash'.

Für das Problem dieses Threads bedeutet das, daß hier nur ein Link kopiert wurde, der natürlich ohne Ziel-Datei nicht ausführbar ist.

Im übrigen würde ich eine chroot-Umgebung eher so bauen, wie es im LFS-Handbuch (Erstellung der Toolchain) beschrieben ist, denn mit Sicherheit werden diverse Bibliotheken fehlen, wenn die Bash nicht explizit statisch gelinkt ist.
 
Nimm dir als Quelle lieber die Manpage. Die ist zuverlässiger. :) Wenn in keiner der Profile-Dateien ein Abschnitt der Art

Code:
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

steht, dann wird die .bashrc auch nicht eingelesen. Meist findet sich dieser Abschnitt in der ~/.bash_profile.
 
Das liegt daran, dass dir die nötigen libs fehlen. Die bekommst du mit "ldd" raus.
Code:
$ ldd /bin/bash
        linux-gate.so.1 =>  (0xffffe000)
        libncurses.so.5 => /lib/libncurses.so.5 (0xb7ef7000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7ef3000)
        libc.so.6 => /lib/libc.so.6 (0xb7dcb000)
        /lib/ld-linux.so.2 (0xb7f54000)
Die liegen in /lib/ und /usr/lib. An die gleichen Stellen in der Chroot umgebung musst du sie kopieren.
 
@oiermann .. oder eben von /bin/sh


denn:

# ls -lah /bin/sh
-r-xr-xr-x 3 root bin 317K Sep 17 2006 /bin/sh

:)
 
Neinein, mit ls bekommst du ja nicht raus, gegen welche libs das jeweilige Programm gelinkt ist.
In meinem Fall:
Code:
$ ldd /bin/sh
        linux-gate.so.1 =>  (0xffffe000)
        libncurses.so.5 => /lib/libncurses.so.5 (0xb7f89000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7f85000)
        libc.so.6 => /lib/libc.so.6 (0xb7e5d000)
        /lib/ld-linux.so.2 (0xb7fe6000)
 
Zurück
Oben