Re: chroot
Bernd Tannenbaum <[email protected]>
| Newsgroups | gmane.linux.redhat.general.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo auch,
Am Dienstag, 2. März 2004 13:59 schrieb Jörg Linnenkohl:
> Hallo Liste,
>
> leider bin ich kein Sysadmin-Held, daher frage ich lieber nach,
> ehe ich etwas kaputt mache.
>
> Ich habe einen User-Account, den ich auf ein spezielles Verzeichnis
> einschränken möchte. Ein eingeloggter User soll sich nur hier
> bewegen können.
>
> Ich dachte immer, sowas macht man mit chroot(), aber die manpage
> sagt mir nicht viel. Wie kann ich also ein solches Verhalten
> einrichten?
Falls sich der user auf der Maschiene selbst einloggt, hätte ich da ne
Anleitung. Aber sei gewarnt, das ist etwas komplizierter.
Falls sich der User nur remote einloggt, z.B. über ssh, so kann ssh
selbst das gewährleisten.
Die Anleitung ist was älter, hat aber bei mir unter Suse damals zum
Erfolg geführt.
############################################
Anleitung:
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
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
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 Glück,
Bernd
--
[Zufallssig 9]
[NightGhost] on AO forum: "Perhaps it doesn't take two to make an
idiotic argument, although you have proven for a fact, that one man
indeed can make two idiotic arguments."