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.

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:

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