chroot()



Da ich in letzter Zeit immer wieder Fragen a 'la "Was is ne chroot()", "Wie richt ich ne chroot() ein?", .. gelesen hab, werd ich mal in diesem Tutorial auf die haeufigsten Fragen eingehen und ein paar Beispiele nennen. Sollten anschlieszend noch immer Fragen vorhanden sein, koennt ihr entweder im Forum fragen oder ihr schickt mir einfach ne Mail ;o)

Was ist eine chroot() ?

Eine chroot() Umgebung ist eine Umgebung, aus der man nicht mehr herauskommt. Dazu wird ein beliebiges Verzeichnis zum root - Verzeichnis; das hat dann die Folge, dasz man in kein anderes Verzeichnis wechseln kann, weil man ja schon in der "Wurzel ist. Der ftpd benoetigt aber zum Betrieb (wenn die chroot() bei einem Anonymous-Zugang verwendet wird) einige Dateien, die man dann in dieses Verzeichnis kopiert. Die abgespeckte Version ist:

                 bin/tar
                 bin/compress
                 bin/gzip
                 dev/zero
                 etc/group
                 etc/passwd
                 lib/ld-linux.so.1
                 lib/libc.so.5.2.28
                 lib/libc.so.5
                 usr/bin/tar
                 usr/bin/compress
                 usr/bin/gzip

Normalerweise ersetzt man sogar alle Programme durch eine statisch gelinkte Version, damit keine Shared-Libraries benoetigt werden.
 

Wie richtet man eine chroot() Umgebung ein ?

Dazu nehmen wir mal die Konfigurationsdatei von Proftp (/etc/proftp.conf) her, oeffnen diese mit nem Editor und fuegen folgendes an eine beliebige Stelle in der Konfigurationsdatei ein:
 

# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use.  It establishes a single server
# and a single anonymous login.  It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.

....
....

# Do a chroot for all Users
# Hier ist die chroot() angegeben
#
DefaultRoot ~/

....
....
 

Wenn sich jetz ein User mit einem regulaeren Account bei euch einloggen will, kann er nicht mehr aus seinem Homedirectory heraus, weil er ja schon im Wurzelverzeichnis "/" ist. Diese chroot() Umgebung gilt fuer _alle_ User; es spielt keine Rolle ob diese einen Account haben oder nicht. Wenn man nur den "Anonymous-User" in eine solche Umgebung einsperren will und die realen User sich weiterhin frei bewegen koennen sollen (scheisz Satz *g*), dann fuegt man diese Zeile in den Abschnitt ein, der fuer Anonymous-Zugriff zustaendig ist.
Das sieht dann folgendermaszen aus:

# A basic anonymous configuration, no upload directories.
<Anonymous ~ftp>
  User                         ftp
  Group                                ftp
# We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias                    anonymous ftp
#
#  # Limit the maximum number of anonymous logins
  MaxClients                   10
#
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
  DisplayLogin                 welcome.msg
  DisplayFirstChdir            .message
#
# Do a chroot for all Users
# root & Admins can't use ftp
#
DefaultRoot ~/

# Limit WRITE everywhere in the anonymous chroot
  <Limit WRITE>
    DenyAll
  </Limit>
#
</Anonymous>

Jetz koennen sich alle User mit einem regulaerem Account frei bewegen und es ist nur den Usern "anonymous" und "ftp" der Verzeichniswechsel untersagt. Man kann aber auch mit chroot() nur bestimmte User sperren (weil man sie nicht mag oder weil sie stinken *scnr*). Dazu musz man zuerst Virtual Hosts fuer diese User anlegen und diese chroot() soll eine eigene Passwort-Datei nutzten. Diesen Eintrag sollte man  (nur wegen der Uebersichtlichkeit) am Ende  der Konfigurationsdatei anfuegen. Ein Eintrag  fuer einen  Virtual Host sieht  folgendermaszen aus:

<VirtualHost 192.168.0.1>
  ServerName "user1.do.main"
  ServerAdmin admin@user1.do.main
  DeferWelcome off
  DefaultRoot /home/user1/
  AuthUserFile /var/auth/user1.passwd
  AuthGroupFile /var/auth/ftpgroup
  <Directory />
  AllowOverwrite on
  </Directory>
  </VirtualHost>

Hier kann sich User1 nur im Verzeichnis "/home/user1/" bewegen und kommt auch mit "cd", "cd .." nicht aus diesem heraus. Er kann lediglich in Verzeichnisse wechseln, die sich in seinem Directory befinden. Sobald er sich einloggt und das Command "pwd" eingibt, sieht er folgendes:

dope@dreckskind:~ > ftp 127.0.0.1
Connected to localhost.
220 ProFTPD 1.2.2rc2 Server (Welcome to the ultimativ Unix *rofl*) [dreckskind.local]
Name (127.0.0.1:user2): user1
331 Password required for user1.
Password:
230 User dope logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is current directory.
ftp> cd ..
250 CWD command successful.
ftp> pwd
257 "/" is current directory.
ftp>

Auf diese Weise kann man jedem User sein eigenes Wurzelverzeichnis zuweisen aus dem er nicht mehr ausbrechen kann.  Will man mehrere User "verwalten", musz man lediglich fuer jeden User einen Virtual Host anlegen und ihm dann die chroot() dementsprechend zuweisen.
Es kann sein, dasz man zu einrichten einer chroot() bestimmte Packages benoetigt; diese sollte man aber auf der Page des Daemons finden

So.. mehr faellt mir dazu im Moment nicht ein. Sollte ich irgendwas vergessen haben, schickt mir einfach ne Mail und ich bau das noch mit ein ;o)

(c)by strcat