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."
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.