<!-- CVS revision of original english document "1.34" -->

<appendix id="harden-step">Der Abhärtungsprozess Schritt für
Schritt

<!--
# I took the liberty to change this from "checklist" to
# "process step by step" because this doesn't really have the
# form of a checklist, and I had added a different sort of
# checklist. The renaming is more to avoid confusion than
# anything else. // era
-->

<p>Eine Anleitung, die Schritt für Schritt darstellt, wie ein Debian 2.2
GNU/Linux-System nach der Installation abgehärtet wird, ist unten
aufgeführt. Das ist nur eine denkbare Herangehensweise von einem solchen
Vorgang. Sie ist am Absichern von Netzwerkdiensten orientiert und stellt den
gesamten Anlauf der Konfiguration vor.
Vergleichen Sie auch <ref id="checklist">.

<list>

<item>Installieren Sie das System. Beachten Sie dabei die Informationen dieses
HOWTOs bezüglich der Partitionierung. Nach der Basis-Installation nehmen Sie
eine angepasste Installation vor. Wählen Sie keine Task-Pakete aus. Aktivieren
Sie shadow passwords.

<item>Entfernen Sie mit <prgn>dselect</prgn> alle nicht
benötigten aber ausgewählten Pakete, bevor Sie [I]nstallation
wählen. Behalten Sie nur die absolut notwendige Software auf dem System.

<item>Aktualisieren Sie die ganze Software mit den aktuellen Paketen von
security.debian.org, wie bereits unter <ref id="security-update"> beschrieben.

<item>Implementieren Sie die in dieser Anleitung vorgeschlagenen
Maßnahmen zu User-Quotas, Ausgestaltung des Logins und <prgn>Lilo</prgn>.

<item>Machen Sie sich eine Liste von allen Diensten, die derzeit auf Ihrem
System laufen. Versuchen Sie dazu Folgendes:
<example>
  $ ps aux
  $ netstat -pn -l -A inet 
  # /usr/sbin/lsof -i | grep LISTEN
</example>

Damit das dritte Kommando funktioniert, werden Sie
<package>lsof-2.2</package> installieren müssen (und es als Root
laufen lassen). Beachten Sie, dass <prgn>lsof</prgn> das Wort LISTEN passend zu
Ihrer 
Lokalisation übersetzen kann.

<item>Um einen unnötigen Dienst zu entfernen, stellen Sie zunächst fest, wie er
gestartet wird, und welches Paket ihn zur Verfügung stellt. Sie können dies
ganz einfach machen, indem Sie das Programm prüfen, das auf dem Socket
lauscht. Das nachfolgende Shell-Skript, das die Programme <prgn>lsof</prgn> und
<prgn>dpkg</prgn> verwendet, macht genau das:

<example>
#!/bin/sh
# FIXME: this is quick and dirty; replace with a more robust script snippet
for i in `sudo lsof -i | grep LISTEN | cut -d " " -f 1 |sort -u` ; do
  pack=`dpkg -S $i |grep bin |cut -f 1 -d : | uniq`
  echo "Service $i is installed by $pack";
  init=`dpkg -L $pack |grep init.d/ `
  if [ ! -z "$init" ]; then
    echo "and is run by $init"
  fi
done
</example>

<item>Wenn Sie einen unerwünschten Dienst finden, entfernen Sie das Paket
(mit <prgn>dpkg --purge</prgn>). Oder benutzen Sie
<prgn>update-rc.d</prgn> (siehe <ref id="disableserv">), um ihn aus
dem Start-Prozess zu entfernen.

<item>Überprüfen Sie bei inetd-Diensten (werden durch den Superdaemon
gestartet), welche Dienste in <file>/etc/inetd.conf</file> aktiviert
sind. Verwenden Sie dazu Folgendes:

<example>
  $ grep -v "^#" /etc/inetd.conf | sort -u
</example>

Deaktivieren Sie dann diejenigen Dienste, die Sie nicht benötigen, indem Sie
die Zeile in <file>/etc/inetd.conf</file> auskommentieren, das Paket entfernen,
oder indem Sie
<prgn>update-inetd</prgn> benutzen.

<item>Wenn Sie Dienste eingehüllt haben (und
<prgn>/usr/sbin/tcpd</prgn> benutzen) prüfen Sie, ob die Dateien
<file>/etc/hosts.allow</file> und <file>/etc/hosts.deny</file> passend zu
Ihren Richtlinien für die Dienste konfiguriert sind.

<item>Wenn der Server mehr als eine externe Schnittstelle benutzt, sollten Sie
vielleicht Dienste darauf beschränken, auf bestimmten Schnittstellen zu
lauschen. Ob das möglich ist, hängt aber von den Diensten ab. Wenn Sie zum
Beispiel internen FTP-Zugriff erlauben wollen, lassen Sie den 
FTP-Daemon nur auf der internen Schnittstelle lauschen, nicht auf allen (d.h.
<!-- SB (20050307): "listen only on your management interface" -->
0.0.0.0:21).

<item>Booten Sie die Maschine neu, oder wechseln Sie in den Single-User-Modus
und zurück in den Multi-User-Modus mit:
<example>
  # init 1
  (....)
  # init 2
</example>

<item>Prüfen Sie die nun angebotenen Dienste und wiederholen Sie
gegebenenfalls die letzten Schritte.

<item>Installieren Sie jetzt die benötigten Dienste, falls es noch
nicht geschehen ist, und konfigurieren Sie sie passend.

<item>Prüfen Sie mit folgendem Shell-Befehl, unter welchem Nutzer die
verfügbaren Dienste laufen:

<example>
  # for i in `/usr/sbin/lsof -i |grep LISTEN |cut -d " " -f 1 |sort -u`; \
  > do user=`ps ef |grep $i |grep -v grep |cut -f 1 -d " "` ; \
  > echo "Service $i is running as user $user"; done
</example>

Überlegen Sie, ob Sie diese Dienste einem bestimmten Benutzer oder
Gruppe zuweisen wollen und sie vielleicht auch in
einer chroot-Umgebung einsperren wollen, um die Sicherheit zu erhöhen.
Sie können dies tun, indem Sie die <file>/etc/init.d</file>-Skripte
ändern, die den Dienst starten. Die meisten Dienste benutzen unter
Debian <prgn>start-stop-daemon</prgn>, der die dafür Optionen
(<tt>--change-uid</tt> und <tt>--chroot</tt>) zur Verfügung stellen.
Ein paar warnende Worte zum Einsperren in eine <prgn>chroot</prgn>-Umgebung:
Sie müssen alle Dateien, die durch das Paket des Dienstes installiert wurden
(verwenden Sie dpkg -L), und alle Pakete, von denen es abhängt, in die
<prgn>Chroot</prgn>-Umgebung legen. Informationen, wie das Programm
<prgn>ssh</prgn> in eine <prgn>chroot</prgn>-Umgebung eingesperrt wird, finden
Sie unter <ref id="chroot-ssh-env">.

<item>Wiederholen Sie die Schritte oben um zu prüfen, ob nur die
gewünschten Dienste laufen, und ob sie unter der gewünschten
Nutzer/Gruppen-Kombination laufen.

<item>Testen Sie die installierten Dienste, um festzustellen, ob sie
wie erwartet arbeiten.

<item>Überprüfen Sie das System, indem Sie einen
Scanner zur Abschätzung der Verwundbarkeit (zum Beispiel
<package>nessus</package>) benutzen, um Angriffsmöglichkeiten
(Fehlkonfigurationen, alte oder nicht benötigte Dienste) zu finden.

<item>Installieren Sie Instrumente zur Entdeckung von Eindringlingen in
Netzwerk und Hosts (wie <package>snort</package> und
<package>logcheck</package>).

<item>Wiederholen Sie den Netzwerk-Scan und prüfen Sie, ob das
System zur Erkennung von Eindringlingen funktioniert.

</list>

Die richtig Paranoiden überlegen sich auch das Folgende:

<list>

<item>Fügen Sie dem System Firewall-Fähigkeiten hinzu, die
eingehende Verbindungen nur zu angebotenen Diensten erlauben und
ungenehmigte ausgehende Verbindungen verhindern.

<item>Überprüfen Sie erneut die Installation auf Angriffspunkte
mit einem Netzwerk-Scanner.

<item>Prüfen Sie ausgehende Verbindungen vom System zu Hosts
außerhalb mit einem Netzwerk-Scanner, um sicherzustellen, dass
ungewollte Verbindungen keinen Weg nach draußen finden.

</list>

<p>FIXME: this procedure considers service hardening but not system
hardening at the user level, include information regarding checking
user permissions, SETUID files and freezing changes in the system
using the ext2 file system.


<appendix id="checklist">Checkliste der Konfiguration

<p>Dieser Anhang wiederholt kurz Punkte aus anderen Abschnitten
dieser Anleitung in einem verdichteten Checklisten-Format. Er ist als
schnelle Zusammenfassung für Leute gedacht, die bereits diese
Anleitung gelesen haben. Es gibt auch andere gute Checklisten, zum Beispiel
Kurt Seifrieds <url 
id="http://seifried.org/security/os/linux/20020324-securing-linux-step-by-step.html"
name="Securing Linux Step by Step"> und <url
id="http://www.cert.org/tech_tips/usc20_full.html" name="CERT's Unix
Security Checklist">.

<!-- Order is slightly different from body text. Consider changing text? -->
<!-- (FIXME) -->

<p>FIXME: This is based on v1.4 of the manual and might need to be updated.

<list>

<item>Schränken Sie physischen Zugriff und Boot-Fähigkeiten ein.
    <list>
		<item>Setzen Sie im BIOS ein Passwort.

		<item>Schalten Sie im BIOS das Booten von Diskette, CD-ROM, ...	ab.

		<item>Setzen Sie ein LILO- bzw. GRUB-Passwort (<file>/etc/lilo.conf</file>
		bzw.  <file>/boot/grub/menu.lst</file>); stellen Sie sicher, dass die LILO-
		oder GRUB-Konfigurationen nicht einsehbar sind.
    </list>
	      
<item>Partitionierung:
	  <list>
		<item>Legen Sie Daten, die von Nutzern geschrieben wurden, Daten, die nicht
    zum System gehören, und sich ständig ändernde Laufzeitdaten
		auf eigenen, getrennten Partitionen ab.

		<item>Setzen Sie die Mount-Optionen <tt>nosuid,noexec,nodev</tt> in
		<file>/etc/fstab</file> bei ext2/3-Partitionen, die keine ausführbaren
		Programme enthalten sollten, wie zum Beispiel <file>/home</file> oder
		<file>/tmp</file>.
    </list>
	      
<item>Passwort-Hygiene und Login-Sicherheit:
	  <list>
		<item>Wählen Sie ein gutes Root-Passwort.

		<item>Benutzen Sie Shadow- und MD5-Passwörter.

		<item>Installieren und benutzen Sie PAM:
		<list>
		      <item>Fügen Sie die Unterstützung von PAM-MD5 hinzu, und stellen Sie
		      sicher (allgemein gesprochen), dass die Einträge in den
		      <file>/etc/pam.d/</file>-Dateien, die Zugriff auf die Maschine
		      gewähren, das zweite Feld <!-- or is it third?  (FIXME: check) --> in
		      der pam.d-Datei auf <tt>requisite</tt> oder <tt>required</tt> gesetzt
		      haben.

		      <item>Ändern Sie <file>/etc/pam.d/login</file>, so dass nur lokale
		      Root-Logins erlaubt werden.

		      <item>Markieren Sie außerdem autorisierte ttys in
		      <file>/etc/security/access.conf</file> und richten Sie diese Datei
		      überhaupt so ein, dass Root-Logins so weit wie möglich eingeschränkt
		      werden.

		      <item>Fügen Sie pam_limits.so hinzu, wenn Sie Einschränkungen pro
		      Benutzer vornehmen wollen.

		      <item>Ändern Sie <file>/etc/pam.d/passwd</file>: Erhöhen Sie die
		      minimale Länge von Passwörtern (vielleicht sechs Zeichen) und
		      schalten Sie MD5 ein.

		      <item>Wenn Sie es wünschen, fügen Sie <file>/etc/group</file> die
		      Gruppe wheel hinzu; fügen Sie <file>/etc/pam.d/su</file> pam_wheel.so
		      group=wheel hinzu.

		      <item>Für angepasste Kontrollen der einzelnen Nutzer nehmen Sie
		      pam_listfile.so-Einträge an den passenden Stellen vor.

		      <item>Erstellen Sie eine Datei <file>/etc/pam.d/other</file> und
		      setzen Sie sie mit strenger Sicherheit auf.

		</list>

		<item>Setzen Sie in <file>/etc/security/limits.conf</file> Schranken
		(beachten Sie, dass <file>/etc/limits</file> nicht benutzt wird, wenn Sie
		PAM verwenden).

		<item>Nehmen Sie Einschränkungen in <file>/etc/login.defs</file> vor; wenn
		Sie MD5 oder PAM einschalten, machen Sie auch hier ebenfalls die
		gleichbedeutenden Änderungen.

		<item>Nehmen Sie Einschränkungen in <file>/etc/pam.d/login</file> vor.

		<item>Schalten Sie den FTP-Zugriff von Root in <file>/etc/ftpusers</file> ab.

		<item>Schalten Sie Root-Logins über das Netzwerk ab; benutzen Sie <manref
		name="su" section="1"> oder <manref name="sudo" section="1"> (denken Sie über
		die Installation von <package>sudo</package> nach).

		<item>Benutzen Sie PAM, um zusätzliche Auflagen auf Logins zu ermöglichen.

</list>

<item>Andere lokale Sicherheitsangelegenheiten:
<list>
		<item>Kernel-Tweaks (siehe <ref id="kernel-conf">).
		    
		<item>Kernel-Patches (siehe <ref id="kernel-patches">).
		    
		<item>Schränken Sie die Zugriffsrechte auf Log-Dateien
		(<file>/var/log/{last,fail}log</file>, Apache-Logs) ein.
		    
		<item>Stellen Sie sicher, dass in <file>/etc/checksecurity.conf</file>
		SETUID-Checks eingeschaltet sind.

		<item>Überlegen Sie sich, an Log-Dateien nur anhängen zu lassen
		(append-only) und Konfigurationsdateien unveränderbar (immutable) zu
		machen, indem Sie chattr benutzen (nur ext2/3-Dateisystem).

		<item>Setzen Sie eine Integritätsprüfung des Dateisystems auf (siehe <ref
		id="check-integ">). Installieren Sie <package>debsums</package>.

		<item>Überlegen Sie, locate durch slocate zu ersetzen.

		<item>Alles auf einem lokalen Drucker mitloggen?

		<item>Brennen Sie Ihre Konfiguration auf eine bootbare CD und booten Sie
		hiervon?

		<item>Abschalten von Kernel-Modulen?

</list>
	      
<item>Einschränkung des Netzwerkzugriffs:
    <list>

		<item>Installieren und konfigurieren Sie <prgn>ssh</prgn> (Vorschlag:
		PermitRootLogin No in <file>/etc/ssh/sshd_config</file>,
		PermitEmptyPasswords No; beachten Sie auch die anderen Vorschläge im Text).

		<item>Schalten Sie <prgn>in.telnetd</prgn> ab oder
		entfernen Sie ihn, falls er installiert ist.

    <item>Deaktivieren Sie ganz allgemein alle überflüssigen Dienste in
    <file>/etc/inetd.conf</file>. Benutzen Sie dazu <prgn>update-inetd
    --disable</prgn> (oder Sie schalten <prgn>inetd</prgn> ganz ab oder
    benutzen einen Ersatz wie <prgn>xinetd</prgn> oder <prgn>rlinetd</prgn>).

		<item>Schalten Sie andere überflüssige Netzwerkdienste ab. ftp, DNS,
		www, usw. sollten nicht laufen, wenn Sie sie nicht brauchen und nicht
		regelmäßig überwachen. In den meisten Fällen muss ein Mail-Server betrieben
		werden, sollte aber so konfiguriert sein, dass er nur lokal Mails zustellt.

		<item>Installieren Sie von den Diensten, die Sie brauchen, nicht einfach
		das weit verbreitetste Programm, sondern schauen Sie nach sichereren
		Versionen, die Debian liefert (oder aus anderen Quellen). Was auch immer
		Sie schließlich benutzen: Stellen Sie sicher, dass Sie die Risiken
		verstanden haben.

		<item>Setzen Sie <prgn>Chroot</prgn>-Gefängnisse für auswärtige Nutzer und
		Daemonen auf.

		<item>Konfigurieren Sie die Firewall und die tcp-Wrapper (d.h. <manref
		name="hosts_access" section="5">); beachten Sie den Trick für
		<file>/etc/hosts.deny</file> im Text.

		<item>Wenn Sie FTP laufen lassen, setzen Sie den ftpd-Server so auf, dass
		er immer in einer <prgn>chroot</prgn>-Umgebung im Home-Verzeichnis des
		Benutzers läuft.

		<item>Wenn Sie X laufen lassen, schalten Sie xhost-Authentifizierung ab und
		benutzen Sie stattdessen <prgn>ssh</prgn>.  Oder noch besser: Deaktivieren
		Sie die Weiterleitung von X komplett, falls das möglich ist (fügen Sie
		-nolisten tcp zu der X-Kommando-Zeile hinzu und schalten Sie XDMCP in
		<file>/etc/X11/xdm/xdm-config</file> ab, indem Sie den requestPort auf 0
		setzen).

		<item>Schalten Sie Zugriff von außerhalb auf den Drucker ab.

		<item>Tunneln Sie alle IMAP- oder POP-Sitzungen durch SSL oder
		<prgn>ssh</prgn>. Installieren Sie stunnel, wenn Sie diesen Dienst anderen
		Mail-Nutzern anbieten wollen.

		<item>Setzen Sie einen Log-Host auf, und konfigurieren Sie andere
		Maschinen, ihre Logs an diesen Host zu senden
		(<file>/etc/syslog.conf</file>)

		<item>Sichern Sie BIND, Sendmail und andere komplexe Daemonen ab (starten
		Sie sie in einer <prgn>chroot</prgn>-Umgebung und als nicht-Root
		Pseudonutzer).

		<item>Installieren Sie tiger oder ein ähnliches Werkzeug zur Erkennung von
		Eindringlingen in Ihr Netzwerk.

		<item>Installieren Sie snort oder ein ähnliches Werkzeug zur Erkennung von
		Eindringlingen in Ihr Netzwerk.

		<item>Verzichten Sie, falls möglich, auf NIS und RPC (Abschalten von
		portmap).

</list>

<item>Angelegenheiten mit Richtlinien:
<list>

		<item>Klären Sie die Nutzer über das Wie und Warum Ihrer Richtlinien
		auf. Wenn Sie etwas verboten haben, das auf anderen Systemen normalerweise
		verfügbar ist, stellen Sie Dokumentation bereit, die erklärt, wie man die
		gleichen Resultate erreicht, indem man andere, sichere Mittel anwendet.

		<item>Verbieten Sie die Nutzung von Protokollen, die Klartext-Passwörter
		benutzen (<prgn>telnet</prgn>, <prgn>rsh</prgn> und Freunde, ftp, imap,
		pop, http, ...).

		<item>Verbieten Sie Programme, die SVGAlib benutzen.

		<item>Benutzen Sie Disk-Quotas.

</list>
	      
<item>Bleiben Sie über Sicherheitsangelegenheiten informiert:
<list>

		<item>Abonnieren Sie sicherheitsrelevante Mailinglisten.

		<item>Richten Sie Sicherheitsaktualisierungen für <package>apt</package>
		ein &ndash; fügen Sie <file>/etc/apt/sources.list</file> einen Eintrag
		(oder Einträge) für http://security.debian.org/ hinzu.

		<item>Vergessen Sie auch nicht, regelmäßig <prgn>apt-get update ; apt-get
		upgrade</prgn> (vielleicht als <prgn>Cron</prgn>-Job?) laufen zu lassen,
		wie unter <ref id="security-update"> beschrieben.

</list>

</list>


<appendix id="snort-box">Aufsetzen eines autonomen IDS

<p>Sie können sehr leicht eine Debian-Box als eigenständiges
Eindringlings-Erkennungs-System (Intrusion Detection System, IDS)
aufsetzen, indem Sie <package>snort</package> benutzen und eine webbasierte
Schnittstelle zur Überwachung der Alarme über Eindringlinge einrichten:

<list>
<item>Installieren Sie ein Debian-Basis-System ohne zusätzliche
Pakete.

<item>Installieren Sie eine Version von Snort, die Datenbanken unterstützt, und
richten Sie Snort so ein, dass die Alarme in der Datenbank protokolliert
werden.

<item>Laden Sie BASE (Basic Analysis and Security Engine) oder ACID (Analysis
Console for Intrusion Databases, Konsole zur Analyse für
Eindringling-Datenbanken) herunter und installieren Sie es. Konfigurieren Sie
es so, dass es die gleiche Datenbank wie Snort verwendet.

<item>Installieren Sie die notwendigen Pakete.<footnote>Normalerweise werden
alle benötigten Pakete installiert, um Abhängigkeiten aufzulösen.</footnote>

</list>

<p>BASE wird derzeit für Debian im Paket <package>acidbase</package> geliefert,
ACID im Paket <package>acidlab</package>.<footnote>Es kann auch von <url
id="http://www.cert.org/kb/acid/">, <url id="http://acidlab.sourceforge.net">
oder <url id="http://www.andrew.cmu.edu/~rdanyliw/snort/"> heruntergeladen
werden.</footnote> Beide stellen eine graphische WWW-Schnittstelle zur Ausgabe von
Snort zur Verfügung.

<p>Neben der Grundinstallationen benötigen Sie auch einen Webserver (wie
<package>apache</package>), einen <prgn>PHP</prgn>-Interpreter und eine
relationale Datenbank (wie <package>postgresql</package> oder
<package>mysql</package>), wo Snort seine Alarme ablegen kann.

<p>Dieses System sollte mit wenigstens zwei Netzwerk-Schnittstellen
ausgestattet sein: Eine verbunden mit einem Verwaltungs-LAN (um die
Resultate abzufragen und das System zu verwalten), und eine ohne
IP-Adresse, das an mit dem zu beobachtenden Abschnitt des Netzwerks verbunden
ist. Sie sollten den Webserver so einrichten, dass er nur auf der Schnittstelle
lauscht, die mit dem Verwaltungs-LAN verbunden ist.

<p>Sie sollten beide Schnittstellen in der Standardkonfigurationsdatei von
Debian <file>/etc/network/interfaces</file> einrichten. Eine Adresse, nämlich
die des Verwaltungs-LANs, sollten Sie wie gewöhnlich einrichten. Die andere
Schnittstelle muss so konfiguriert werden, dass sie aktiviert wird, wenn das
System startet, ihr darf aber keine Interface-Adresse zugewiesen sein. Eine
Konfiguration der Schnittstelle könnte folgendermaßen aussehen:

<example>
auto eth0
iface eth0 inet manual
      up ifconfig $IFACE 0.0.0.0 up
      up ip link set $IFACE promisc on
      down ip link set $IFACE promisc off
      down ifconfig $IFACE down
</example>

<p>Diese Konfiguration führt dazu, dass die Schnittstelle den gesamten
Netzwerkverkehr <em>heimlich</em> mitliest. Damit wird verhindert, dass das
NIDS in einem feindlichen Netzwerk direkt angegriffen werden kann, da die
Sensoren im Netzwerk keine IP-Adresse haben. Beachten Sie aber, dass es im Lauf
der Zeit Fehler im Sensorenteil des NIDS gab (z.B. <url
id="http://www.debian.org/security/2003/dsa-297" name="DSA-297"> im
Zusammenhang mit Snort), und dass Pufferüberläufe auch entfernt durch die
Verarbeitung von Netzwerkpaketen ausgelöst werden können.

<p>Sie sollten auch einen Blick in das <url
id="http://www.faqs.org/docs/Linux-HOWTO/Snort-Statistics-HOWTO.html"
name="Snort Statistics HOWTO"> und in die Dokumentation auf der <url
id="http://www.snort.org/docs/" name="offiziellen Seite von Snort"> werfen.


<appendix id="bridge-fw">Aufsetzen einer überbrückenden <!--
AUA! Wie waers mit weiterleitend? --> Firewall (bridge Firewall)

<p>Diese Informationen trug Francois Bayart bei, um Benutzern zu helfen, eine
Linux Bridge/Firewall mit 2.4.x Kernel und <package>iptables</package>
aufzusetzen. Ein Kernelpatch wird nicht mehr benötigt, da der Code
Standardinhalt der Linux-Kernel-Distribution wurde.
<!--
Es wird lediglich noch der Bridge-Firewall-Patch
benötigt, den Sie auf der <url name="sourceforge download page"
id="http://bridge.sourceforge.net/download.html"> finden.

<p>Wenn Sie zum Beispiel einen 2.4.18er Kernel benutzen, müssen Sie
den entsprechenden <url name="patch"
id="http://bridge.sourceforge.net/devel/bridge-nf/bridge-nf-0.0.6-against-2.4.18.diff">
herunterladen und anschließend auf die installierten Kernel-Quellen
anwenden:

<example>
Zipowz:/usr/src# apt-get install kernel-source-2.4.18
Zipowz:/usr/src# cd kernel-source-2.4.18
Zipowz:/usr/src/kernel-source-2.4.18# patch -p1 < ../bridge-nf-0.0.6-against-2.4.18.diff 
patching file include/linux/netfilter.h
patching file include/linux/netfilter_ipv4.h
patching file include/linux/skbuff.h
patching file net/bridge/br.c
patching file net/bridge/br_forward.c
patching file net/bridge/br_input.c
patching file net/bridge/br_netfilter.c
patching file net/bridge/br_private.h
patching file net/bridge/Makefile
patching file net/Config.in
patching file net/core/netfilter.c
patching file net/core/skbuff.c
patching file net/ipv4/ip_output.c
patching file net/ipv4/netfilter/ip_tables.c
patching file net/ipv4/netfilter/ipt_LOG.c
</example>-->

<p>Um die notwendigen Einstellungen im Kernel vorzunehmen, rufen Sie <tt>make
menuconfig</tt> oder <tt>make xconfig</tt> auf. Aktivieren Sie im Abschnitt
<em>Networking options</em> folgende Optionen:

<example>
[*] Network packet filtering (replaces ipchains)
[ ]   Network packet filtering debugging (NEW)
<*> 802.1d Ethernet Bridging
[*]   netfilter (firewalling) support (NEW)
</example>

<p>Passen Sie auf, dass Sie dieses hier deaktiviert haben, wenn Sie
Firewall-Regeln anwenden wollen. Anderenfalls wird iptables nicht funktioniert.

<example>
[ ]   Network packet filtering debugging (NEW)
</example>

<p>Anschließend müssen Sie die korrekten Optionen im Abschnitt
<em>IP: Netfilter Configuration</em> setzen. Dann kompilieren und
installieren Sie den Kernel. Wenn Sie dies auf die <em>Debian-Art</em>
machen wollen, installieren Sie <package>kernel-package</package> und
benutzen Sie <prgn>make-kpkg</prgn> um ein maßgeschneidertes Debian-Kernelpaket
zu erstellen, das Sie mit dpkg auf Ihrem Server installieren können. Sobald der
neue Kernel kompiliert und installiert ist, müssen Sie das Paket
<package>bridge-utils</package> installieren.

<p>Wenn Sie diesen Schritt abgeschlossen haben, können Sie die Konfiguration
Ihrer Bridge fertigstellen. Im nächsten Abschnitt werden Ihnen zwei
verschiedene mögliche Konfigurationen einer Bridge vorgestellt. Beide sind mit
einer Übersicht eines hypothetischen Netzwerks und den notwendigen Befehlen
versehen.


<sect>Eine Bridge mit NAT- und Firewall-Fähigkeiten

<p>Die erste Konfigurationsmöglichkeit benutzt die Bridge als Firewall mit
Network Address Translation (NAT, Übersetzung der Netzwerkadressen), die einen
Server und interne LAN-Clienten schützt. Unten wird eine Darstellung der
Anordnung des Netzwerks gezeigt:

<example>
Internet ---- router ( 62.3.3.25 ) ---- bridge (62.3.3.26 gw 62.3.3.25 / 192.168.0.1)
                                          |
                                          |
                                          |---- WWW Server (62.3.3.27 gw 62.3.3.25)
                                          |
                                          |
                                         LAN --- Zipowz (192.168.0.2 gw 192.168.0.1)
</example>


<p>Die folgenden Befehle zeigen, wie diese Bridge konfiguriert werden kann:

<example>
# So wird die Schnittstelle br0 erstellt:
/usr/sbin/brctl addbr br0

# Hinzufügen der Ethernet-Schnittstelle, die die Bridge benutzen
# soll
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1

# Starten der Ethernet-Schnittstelle
/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig eth1 0.0.0.0

# Konfigurieren der Ethernet-Bridge
# Die Bridge wird korrekt und unsichtbar (transparente Firewall) sein.
# In einem traceroute ist sie versteckt, und Sie behalten Ihr echtes
# Gateway auf Ihren anderen Computern. Jetzt können Sie ein Gateway
# auf Ihrer Bridge konfigurieren und es auf Ihren anderen Computern als
# neues Gateway einsetzen

/sbin/ifconfig br0 62.3.3.26 netmask 255.255.255.248 broadcast 62.3.3.31

# Ich habe diese internen IPs für mein NAT benutzt
ip addr add 192.168.0.1/24 dev br0
/sbin/route add default gw 62.3.3.25
</example>


<sect>Eine Bridge mit Firewall-Fähigkeiten

<p>Eine zweite denkbare Konfiguration ist ein System, das als transparente
Firewall für ein LAN mit einer öffentlichen IP-Adresse aufgesetzt ist.

<example>
Internet ---- router (62.3.3.25) ---- bridge (62.3.3.26)
                                        |
                                        |
                                        |---- WWW Server (62.3.3.28 gw 62.3.3.25)
                                        |
                                        |
                                        |---- Mail Server (62.3.3.27 gw 62.3.3.25)
</example>

<p>Die folgenden Kommandos zeigen, wie diese Bridge konfiguriert werden kann:
<example>
# So wird die Schnittstelle br0 erstellt:
/usr/sbin/brctl addbr br0

# Hinzufügen der Ethernet-Schnittstelle, die die Bridge benutzen
# soll
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1

# Starten der Schnittstelle
/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig eth1 0.0.0.0

# Konfigurieren der Ethernet-Bridge
# Die Bridge wird korrekt und unsichtbar (transparente Firewall) sein.
# In einem traceroute ist sie versteckt, und Sie behalten Ihr echtes
# Gateway auf Ihren anderen Computern. Jetzt können Sie ein Gateway
# auf Ihrer Bridge konfigurieren und es auf Ihren anderen Computern als
# neues Gateway einsetzen

/sbin/ifconfig br0 62.3.3.26 netmask 255.255.255.248 broadcast 62.3.3.31
</example>

<p>Wenn Sie mit <prgn>traceroute</prgn> die Route des Linux-Mail-Servers
verfolgen, sehen Sie die Bridge nicht. Wenn Sie mit <prgn>ssh</prgn> auf die
Bridge zugreifen wollen, müssen Sie ein Gateway haben oder erst auf einen
anderen Server wie den "Mail Server" zugreifen, um dann über die interne
Netzwerkkarte auf die Bridge zuzugreifen.


<sect>Grundlegende Iptables-Regeln

<p>Dies ist ein Beispiel für grundlegende Regeln, die für beide
Einstellungen benutzt werden können:

<example>
iptables -F FORWARD
iptables -P FORWARD DROP
iptables -A FORWARD -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Zwei lustige Regeln, aber nicht bei klassischen Iptables. Sorry ...
# Limit ICMP 
# iptables -A FORWARD -p icmp -m limit --limit 4/s -j ACCEPT
# Übereinstimmende Strings, eine gute, einfache Methode, um Viren sehr
# schnell abzublocken
# iptables -I FORWARD -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"

# Abblocken aller MySQL-Verbindungen, nur um ganz sicher zu gehen
iptables -A FORWARD -p tcp -s 0/0 -d 62.3.3.0/24 --dport 3306 -j DROP

# Regeln für den Linux Mail Server
#

# Erlaube FTP-DATA (20), FTP (21), SSH (22) 
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.27/32 --dport 20:22 -j ACCEPT

# Dem Mail-Server erlauben, sich mit der Außenwelt zu verbinden
# Beachten Sie: Dies ist *nicht* für die vorherigen Verbindungen
# notwendig (erinnern Sie sich: stateful filtering) und könnte entfernt
# werden:
iptables -A FORWARD -p tcp -s 62.3.3.27/32 -d 0/0 -j ACCEPT

# Regeln für den WWW-Server
#

# Erlaube HTTP ( 80 ) Verbindungen mit dem WWW-Server
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.28/32 --dport 80 -j ACCEPT

# Erlaube HTTPS ( 443 ) Verbindungen mit dem WWW-Server
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.28/32 --dport 443 -j ACCEPT

# Dem WWW-Server erlauben, sich mit der Außenwelt zu verbinden
# Beachten Sie: Dies ist *nicht* für die vorherigen Verbindungen
# notwendig (erinnern Sie sich: stateful filtering) und könnte entfernt
# werden:
iptables -A FORWARD -p tcp -s 62.3.3.28/32 -d 0/0 -j ACCEPT
</example>


<appendix id="bind-chuser">Beispielskript, um die Standard-Installation
von Bind zu ändern

<p>Dieses Skript automatisiert den Vorgang, die Standardinstallation
des Name-Servers <prgn>bind</prgn> in der Version 8 zu ändern, so dass er
<em>nicht</em> als
Root läuft. Bei <prgn>bind</prgn> in der Version 9 in Debian ist dies
standardmäßig so.<footnote>Ab der Version 9.2.1-5, also seit der
Veröffentlichung von <em>Sarge</em>.</footnote> Diese Version ist demnach der
Version 8 von <prgn>bind</prgn> vorzuziehen.

<p>Dieses Skript ist hier aus historischen Gründen aufgeführt und soll zeigen,
wie man diese Art von Veränderungen systemweit automatisieren kann. Das Skript
wird den Benutzer und die Gruppe für den Name-Server erstellen und
<file>/etc/default/bind</file> und <file>/etc/init.d/bind</file> so ändern,
dass das Programm unter diesem Benutzer läuft. Benutzen Sie es äußerst
vorsichtig, da es nicht ausreichend getestet wurde.

<p>Sie können die Benutzer auch von Hand erstellen und dann den Patch für das
Standard-Init.d-Skript verwenden, der im <url
id="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=157245"
name="Fehlerbericht #157245"> enthalten ist.

<example>
  #!/bin/sh
  # Change the default Debian bind v8 configuration to have it run
  # with a non-root user and group.
  #
  # DO NOT USE this with version 9, use debconf for configure this instead
  #
  # WARN: This script has not been tested thoroughly, please
  # verify the changes made to the INITD script

  # (c) 2002 Javier Fernández-Sanguino Peña
  #
  #    This program is free software; you can redistribute it and/or modify
  #    it under the terms of the GNU General Public License as published by
  #    the Free Software Foundation; either version 1, or (at your option)
  #    any later version.
  #
  #    This program is distributed in the hope that it will be useful,
  #    but WITHOUT ANY WARRANTY; without even the implied warranty of
  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  #    GNU General Public License for more details.
  #
  #     Please see the file `COPYING' for the complete copyright notice.
  #

  restore() {
  # Just in case, restore the system if the changes fail
    echo "WARN: Restoring to the previous setup since I'm unable to properly change it."
    echo "WARN: Please check the $INITDERR script."
    mv $INITD $INITDERR
    cp $INITDBAK $INITD
  }


  USER=named
  GROUP=named
  INITD=/etc/init.d/bind
  DEFAULT=/etc/default/bind
  INITDBAK=$INITD.preuserchange
  INITDERR=$INITD.changeerror
  AWKS="awk ' /\/usr\/sbin\/ndc reload/ { print \"stop; sleep 2; start;\"; noprint = 1; } /\\\\$/ { if ( noprint != 0 ) { noprint = noprint + 1;} } /^.*$/ { if ( noprint != 0 ) { noprint = noprint - 1; } else { print \$0; } } '"

  [ `id -u` -ne 0 ] && {
    echo "This program must be run by the root user"
    exit 1
  }

  RUNUSER=`ps eo user,fname |grep named |cut -f 1 -d " "`

  if [ "$RUNUSER" = "$USER" ] 
  then
    echo "WARN: The name server running daemon is already running as $USER"
    echo "ERR:  This script will not do any changes to your setup."
    exit 1
  fi
  if [ ! -f "$INITD" ]
  then
    echo "ERR:  This system does not have $INITD (which this script tries to change)"
    RUNNING=`ps eo fname |grep named`
    [ -z "$RUNNING" ] && \
      echo "ERR:  In fact the name server daemon is not even running (is it installed?)"
    echo "ERR:  No changes will be made to your system"
    exit 1
  fi

  # Check if there are options already setup 
  if [ -e "$DEFAULT" ]
  then
    if grep -q ^OPTIONS $DEFAULT; then
      echo "ERR: The $DEFAULT file already has options set."
      echo "ERR:  No changes will be made to your system"
    fi
  fi

  # Check if named group exists
  if [ -z "`grep $GROUP /etc/group`" ] 
  then
    echo "Creating group $GROUP:"
    addgroup $GROUP
  else
    echo "WARN: Group $GROUP already exists. Will not create it"
  fi
  # Same for the user
  if [ -z "`grep $USER /etc/passwd`" ] 
  then
    echo "Creating user $USER:"
    adduser --system --home /home/$USER \
      --no-create-home --ingroup $GROUP \
      --disabled-password --disabled-login $USER
  else
    echo "WARN: The user $USER already exists. Will not create it"
  fi

  # Change the init.d script

  # First make a backup (check that there is not already
  # one there first)
  if [ ! -f $INITDBAK ] 
  then
    cp $INITD $INITDBAK
  fi

  # Then use it to change it
  cat $INITDBAK |
  eval $AWKS &gt; $INITD

  # Now put the options in the /etc/default/bind file:
  cat &gt;&gt;$DEFAULT &lt;&lt;EOF
  # Make bind run with the user we defined
  OPTIONS="-u $USER -g $GROUP"
  EOF

  echo "WARN: The script $INITD has been changed, trying to test the changes."
  echo "Restarting the named daemon (check for errors here)."

  $INITD restart
  if [ $? -ne 0 ] 
  then
    echo "ERR:  Failed to restart the daemon."
    restore
    exit 1
  fi

  RUNNING=`ps eo fname |grep named`
  if [ -z "$RUNNING" ] 
  then
    echo "ERR:  Named is not running, probably due to a problem with the changes."
    restore
    exit 1
  fi

  # Check if it's running as expected
  RUNUSER=`ps eo user,fname |grep named |cut -f 1 -d " "`

  if [ "$RUNUSER" = "$USER" ] 
  then
    echo "All has gone well, named seems to be running now as $USER."
  else
    echo "ERR:  The script failed to automatically change the system."
    echo "ERR:  Named is currently running as $RUNUSER."
    restore
    exit 1
  fi

  exit 0
</example>

<p>Dieses Skript, wenn es auf Woodys (Debian 3.0) angepassten <prgn>bind</prgn>
(Version 8)
angewendet wird, wird die initd-Datei verändern, nachdem der Benutzer
und die Gruppe "named" erstellt wurde.


<appendix id="fw-security-update">Schutz der Sicherheitsaktualisierung durch
eine Firewall

<p>Nach einer Standard-Installation könnten immer noch Sicherheitslücken auf
dem System vorhanden sein. Falls Sie die Aktualisierungen für die verwundbaren
Paket nicht auf einem anderen System
herunterladen können (oder security.debian.org zu lokalen Zwecken
spiegeln können), müssen Sie sich mit dem Internet verbinden, um
die Pakete herunterzuladen.

<p>Wenn Sie sich jedoch mit dem Internet verbinden, setzen Sie Ihr System einer
Gefahr aus. Wenn einer Ihrer lokalen Dienste angreifbar ist, könnten Sie
kompromittiert sein, noch bevor die Aktualisierung beendet ist!
Sie mögen dies paranoid finden, aber eine Analyse vom <url
id="http://www.honeynet.org" name="Honeynet Project"> zeigt
tatsächlich, dass ein System in weniger als drei Tagen kompromittiert
werden kann, sogar wenn das System gar nicht der Öffentlichkeit
bekannt ist (d.h. nicht in DNS-Einträgen auftaucht).

<p>Wenn Sie eine Aktualisierung Ihres Systems durchführen, das nicht von einem
externen System (z.B. einer Firewall) geschützt ist, können Sie trotzdem eine
lokale Firewall so konfigurieren, dass Sie nur die Sicherheitsaktualisierung
selbst erlaubt. Das Beispiel unten zeigt, wie die lokalen Firewall-Fähigkeiten
aufgesetzt werden müssen, um ein eingeschränktes Setup zu erreichen, in dem nur
Verbindungen zu security.debian.org erlaubt werden, während der Rest
geloggt wird.

<p>Im nachfolgenden Beispiel wird ein strenges Regelwerk für eine Firewall
dargestellt. Führen Sie diese Befehle auf einer lokalen Konsole aus (und nicht
auf einer entfernten), um das Risiko zu verringern, sich aus Ihrem System
auszusperren.

<example>
  # iptables -F
  # iptables -L
  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination

  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination
  # iptables -A OUTPUT -d security.debian.org --dport 80 -j ACCEPT
  # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  # iptables -A INPUT -p icmp -j ACCEPT
  # iptables -A INPUT -j LOG
  # iptables -A OUTPUT -j LOG
  # iptables -P INPUT DROP
  # iptables -P FORWARD DROP
  # iptables -P OUTPUT DROP
  # iptables -L
  Chain INPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED
  ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
  LOG        all  --  anywhere             anywhere           LOG level warning

  Chain FORWARD (policy DROP)
  target     prot opt source               destination

  Chain OUTPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     80   --  anywhere             security.debian.org
  LOG        all  --  anywhere             anywhere           LOG level warning
</example>

<p>Hinweis: Es ist die vorzugswürdige Verfahrensweise, die Policy-Regel
<em>DROP</em> für die Input-Kette zu verwenden. Seien Sie aber <em>äußerst</em>
vorsichtig, wenn Sie dies bei einer entfernten Verbindung unternehmen. Wenn Sie
das Regelwerk Ihrer Firewall aus der Ferne testen, ist es am besten, wenn Sie
ein Skript mit dem Regelwerk laufen lassen (anstatt jede Regel Zeile für Zeile
von der Befehlszeile aus einzugeben) und sich vorsorglich eine
Hintertür<footnote>Wie z.B. <em>knockd</em>. Alternativ dazu können Sie auch
eine separate Konsole öffnen und das System nachfragen lassen, ob sich jemand
auf der Gegenseite befindet. Wenn keine Eingabe erfolgt, werden die
Firewall-Regeln zurückgesetzt. Ein Beispiel dafür ist:
<example>
#!/bin/bash

while true; do
    read -n 1 -p "Are you there? " -t 30 ayt
    if [ -z "$ayt" ] ; then
        break
    fi
done

# Reset the firewall chain, user is not available
echo
echo "Resetting firewall chain!"
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
exit 1
</example>
<p>Selbstverständlich müssen Sie alle Hintertüren abschalten, ehe Sie Ihr
System in Betrieb nehmen.</footnote> offen
halten, so dass Sie wieder Zugriff auf Ihr System bekommen, wenn Sie einen
Fehler gemacht haben. Auf diese Weise müssen Sie sich nicht auf den Weg zum
entfernten Rechner machen, um die Firewall-Regel, mit der Sie sich
ausgeschlossen haben, zu korrigieren.

<p>FIXME: This needs DNS to be working properly since it is required
for security.debian.org  to work. You can add security.debian.org to
/etc/hosts but now it is a CNAME to several hosts (there is more than
one security mirror)

<p>FIXME: this will only work with HTTP URLs since ftp might need 
the ip_conntrack_ftp module, or use passive mode.


<appendix id="chroot-ssh-env"><prgn>Chroot</prgn>-Umgebung für <prgn>SSH</prgn>

<p>Es ist eine schwere Aufgabe, eine eingeschränkte Umgebung für
<prgn>SSH</prgn> zu erstellen. Das liegt zum einen an seinen Abhängigkeiten und
zum anderen daran, dass <prgn>SSH</prgn> im Gegensatz zu anderen Servern den
Benutzern eine entfernte Shell zur Verfügung stellt. Daher müssen Sie sich
überlegen, welche Programme Benutzer in der Umgebung verwenden sollen.

<p>Sie haben zwei Möglichkeiten, eine beschränkte entfernte Shell einzurichten:

<list>
<item>die SSH-Benutzer in ein Chroot-Gefängnis einsperren: Dazu müssen Sie den
SSH-Daemon so konfigurieren, dass er Benutzer nach der Authentifizierung in
ein Chroot-Gefängnis einsperrt, bevor sie eine Shell bekommen. Jeder Benutzer
kann seine eigene Umgebung haben.

<item>den SSH-Server in ein Chroot-Gefängnis einsperren: Wenn die SSH-Anwendung
sich selbst in einer Chroot-Umgebung befindet, sind auch alle Benutzer in
diese Umgebung eingesperrt.

</list>

<p>Die erste Möglichkeit hat den Vorteil, dass es möglich ist, sowohl
unbeschränkte als auch beschränkte Benutzer zu haben. Falls Sie keine
Setuid-Anwendungen in der Chroot-Umgebung zur Verfügung stellen, wird es
schwieriger, aus dem Gefängnis auszubrechen. Allerdings müssen Sie
gegebenenfalls Chroot-Umgebungen für jeden Benutzer einzeln
einrichten. Außerdem ist die Konfiguration schwieriger, da es Zusammenarbeit
mit dem SSH-Server erfordert. Die zweite Möglichkeit ist leichter zu
verwirklichen und schützt vor dem Ausnutzen eines Exploits des SSH-Servers, da
auch dieser im Chroot-Gefängnis ist. Jedoch müssen alle Benutzer die gleiche
Chroot-Umgebung verwenden. Verschiedene Umgebungen für verschiedene Benutzer
sind nicht möglich.


<sect>SSH-Benutzer in ein Chroot-Gefängnis einsperren

<p>Sie können den SSH-Server so einrichten, dass er bestimmte Benutzer in eine
Chroot-Umgebung einsperrt, so dass sie eine Shell mit nur einer beschränkten
Anzahl von Anwendungen zur Verfügung haben.


<sect1>Einsatz von <package>libpam-chroot</package>

<p>Der wahrscheinlich leichteste Weg ist, das Paket
<package>libpam-chroot</package>, das in Debian vorhanden ist, zu verwenden. Wenn
Sie es installiert haben, müssen Sie:

<list>

<item><file>/etc/pam.d/ssh</file> verändern, um dieses PAM-Modul zu
verwenden. Fügen Sie dazu als letzte Zeile Folgendes ein<footnote>Sie können
die Option <em>debug</em> verwenden. Damit wird der Fortschritt des Moduls
unter <em>authpriv.notice</em> protokolliert.</footnote>:
<example>
session    required   pam_chroot.so
</example>

<item>eine passende Chroot-Umgebung für die Benutzer einrichten. Sie können
versuchen, die Skripte unter
<file>/usr/share/doc/libpam-chroot/examples/</file> zu verwenden, das Programm
<package>makejail</package> benutzen<footnote>Mit
folgendem Python-Aufruf können Sie eine sehr eingeschränkte
Bash-Umgebung für makejail erstellen. Erstellen Sie das Verzeichnis
<file>/var/chroots/users/foo</file> und eine Datei mit dem Namen
<file>bash.py</file> und folgendem Inhalt:
<example>
  chroot="/var/chroots/users/foo"
  cleanJailFirst=1
  testCommandsInsideJail=["bash ls"]
</example>
Führen Sie dann <em>makejail bash.py</em> aus, um eine Benutzer-Umgebung unter
<file>/var/chroots/users/foo</file> zu erstellen. So testen Sie die Umgebung:
<example>
  # chroot /var/chroots/users/foo/ ls
  bin  dev  etc  lib  proc  sbin  usr
</example>
</footnote>
oder eine minimale Debian-Umgebung mit
<package>debootstrap</package> aufsetzen. Stellen Sie sicher, dass die Umgebung
die notwendigen Geräte enthält.<footnote>
Unter Umständen benötigen Sie die Geräte <file>/dev/ptmx</file> und
<file>/dev/pty*</file> und das Unterverzeichnis <file>/dev/pts/</file>. Es
sollte ausreichen, MAKEDEV im <file>/dev</file>-Verzeichnis der Chroot-Umgebung
auszuführen, um sie zu erstellen, falls sie nicht existieren. Wenn Sie einen
Kernel einsetzen, der die Gerätedateien dynamisch erstellt (Version 2.6),
müssen Sie die Dateien /dev/pts/ selbst erstellen und mit den passenden Rechten
ausstatten.</footnote>

<item><file>/etc/security/chroot.conf</file> bearbeiten, damit die ausgewählten
Nutzer in das Verzeichnis eingesperrt werden, das Sie zuvor eingerichtet
haben. Sie sollten unabhängige Verzeichnisse für verschiedene Nutzer haben,
damit sie weder das ganze System noch sich gegenseitig sehen können.

<item>SSH konfigurieren: Je nach der eingesetzten OpenSSH-Version funktioniert
die Chroot-Umgebung sofort. Seit 3.6.1p2 wird die Funktion
<em>do_pam_session()</em> aufgerufen, nachdem sshd seine Rechte abgelegt
hat. Da chroot() Root-Rechte benötigt, wird es mit Rechtetrennung nicht
funktionieren. Allerdings wurde in neueren OpenSSH-Versionen der PAM-Code
verändert, so dass do_pam_session vor dem Ablegen der Rechte aufgerufen
wird. Daher funktioniert es auch mit aktivierter Rechtetrennung. Falls Sie sie
abschalten müssen, müssen Sie <file>/etc/ssh/sshd_config</file> so verändern:
<example>
UsePrivilegeSeparation no
</example>

<p>Beachten Sie, dass das die Sicherheit Ihres Systems verringern wird, da dann
der OpenSSH-Server als <em>Root</em> laufen wird. Das bedeutet, dass wenn eine
Angriffsmöglichkeit aus der Ferne gegen OpenSSH entdeckt wird, ein Angreifer
<em>Root</em>-Rechte anstatt nur <em>Sshd</em>-Rechte erlangen wird und somit
das gesamte System kompromittiert.<footnote>
Wenn Sie einen Kernel verwenden, der Mandatory-Access-Control (RSBAC/SElinux)
unterstützt, müssen Sie die Konfiguration nicht ändern, wenn Sie dem
<em>Sshd</em>-Benutzer die notwendigen Rechte einräumen, um den Systemaufruf
chroot() ausführen zu können.
</footnote>

</list>

<p>Wenn Sie die <em>Rechtetrennung</em> nicht deaktivieren, brauchen Sie im
Chroot-Gefängnis <file>/etc/passwd</file>, welches die Benutzer-UID enthält,
damit die <em>Rechtetrennung</em> funktioniert.

<p>Wenn Sie die Option <em>Rechtetrennung</em> auf <strong>yes</strong> gesetzt
haben und Ihre Version von OpenSSH nicht richtig läuft, müssen Sie sie
abschalten. Wenn Sie das unterlassen, werden Benutzer, die sich mit Ihrem
Server verbinden wollen und von diesem Modul in eine Chroot-Umgebung
eingesperrt werden sollen, Folgendes zu sehen bekommen:

<example>
$ ssh -l user server
user@server's password:
Connection to server closed by remote host.
Connection to server closed.
</example>

<p>Dies geschieht, weil der SSH-Daemon, der als 'sshd' läuft, nicht den
Systemaufruf chroot() ausführen kann. Um die Rechtetrennung abzuschalten,
müssen Sie die Konfigurationsdatei <file>/etc/ssh/sshd_config</file> wie oben
beschrieben verändern.

<p>Beachten Sie, dass, wenn Folgendes fehlt, sich die Benutzer nicht in der
Chroot-Umgebung anmelden können:

<list>

<item>Das Dateisystem <file>/proc</file> muss in der Chroot-Umgebung des
Benutzers gemountet sein.

<item>Die notwendigen Geräte unter <file>/dev/pts/</file> müssen
vorliegen. Falls diese Dateien automatisch vom Kernel erstellt werden, müssen
Sie sie von Hand unter <file>/dev/</file> in der Chroot-Umgebung erstellen.

<item>Das Home-Verzeichnis des Benutzers muss in der Chroot-Umgebung
existieren. Ansonsten wird der SSH-Daemon nicht fortfahren.

</list>

<p>Sie können diese Probleme mit dem Schlüsselwort <em>debug</em> in der
PAM-Konfiguration <file>/etc/pam.d/ssh</file> debuggen. Falls Sie auf Probleme
stoßen, kann es sich als nützlich erweisen, auch den Debugging-Modus des
SSH-Clients zu aktivieren.

<p>Hinweis: Diese Informationen sind auch in
<file>/usr/share/doc/libpam-chroot/README.Debian.gz</file> enthalten (und
vielleicht aktueller). Bitte überprüfen Sie, ob dort aktualisierte
Informationen vorhanden sind, bevor Sie die oben aufgezeigten Schritte
ausführen.


<sect1>Patchen des <prgn>ssh</prgn>-Servers

<p>Debians <prgn>sshd</prgn> gestattet nicht, die Bewegungen eines Benutzer
durch den Server zu beschränken, da er keine <prgn>Chroot</prgn>-Funktionalität
besitzt. Diese ist im Gegensatz dazu Bestandteil des kommerziellen Programms
<prgn>sshd2</prgn> (es verwendet 'ChrootGroups' oder 'ChrootUsers', siehe
<manref name="sshd2_config" section="5">). Allerdings gibt es einen Patch, der
<prgn>sshd</prgn> um diese Funktion erweitert. Den Patch erhalten Sie unter
<url id="http://chrootssh.sourceforge.net" name="ChrootSSH project"> (wurde in
<url id="http://bugs.debian.org/139047" name="Fehlerbericht #139047">
nachgefragt).  Der Patch könnte Bestandteil von zukünftigen Veröffentlichungen
des OpenSSH-Pakets werden. Emmanuel Lacour bietet <prgn>ssh</prgn>-Pakete als
Debs mit diesen Fähigkeiten für <em>Sarge</em> an. Sie sind unter <url
id="http://debian.home-dn.net/sarge/ssh/"> verfügbar. Beachten Sie aber, dass
sie nicht aktuell sein müssen, daher wird empfohlen, den Weg der Kompilierung
zu gehen.

<!-- No longer available
<p>Eine Beschreibung der notwendigen Schritte finden Sie unter <url
id="http://mail.incredimail.com/howto/openssh/"> (so ziemlich alles dort trifft
auch auf Debian zu, auch wenn von Red Hat 7.3 die Rede ist).
-->

<p>Nachdem Sie den
Patch angewendet haben, müssen Sie <file>/etc/passwd</file> anpassen und darin
das Home-Verzeichnis der Benutzer ändern (mit dem speziellen <tt>/./</tt>
Kürzel).

<example>
  joeuser:x:1099:1099:Joe Random User:/home/joe/./:/bin/bash
</example>

<p>Dies wird <em>sowohl</em> den Fernzugriff auf die Shell <em>als auch</em>
Fernkopien über den <prgn>ssh</prgn>-Kanal einschränken.

<p>Gehen Sie sicher, dass Sie alle benötigten Programme und Bibliotheken in den
<prgn>Chroot</prgn>-Pfaden der Benutzer haben. Diese Dateien sollten Root als Eigentümer
haben, um Manipulationen durch den Benutzer zu verhindern (zum Beispiel um
das <prgn>chroot</prgn>-Gefängnis zu verlassen). Ein Beispiel könnte so
aussehen:

<example>
./bin:
total 660
drwxr-xr-x    2 root     root         4096 Mar 18 13:36 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
-r-xr-xr-x    1 root     root       531160 Feb  6 22:36 bash
-r-xr-xr-x    1 root     root        43916 Nov 29 13:19 ls
-r-xr-xr-x    1 root     root        16684 Nov 29 13:19 mkdir
-rwxr-xr-x    1 root     root        23960 Mar 18 13:36 more
-r-xr-xr-x    1 root     root         9916 Jul 26  2001 pwd
-r-xr-xr-x    1 root     root        24780 Nov 29 13:19 rm
lrwxrwxrwx    1 root     root            4 Mar 30 16:29 sh -> bash
</example>
<example>
./etc:
total 24
drwxr-xr-x    2 root     root         4096 Mar 15 16:13 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
-rw-r--r--    1 root     root           54 Mar 15 13:23 group
-rw-r--r--    1 root     root          428 Mar 15 15:56 hosts
-rw-r--r--    1 root     root           44 Mar 15 15:53 passwd
-rw-r--r--    1 root     root           52 Mar 15 13:23 shells
</example>
<example>
./lib:
total 1848
drwxr-xr-x    2 root     root         4096 Mar 18 13:37 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
-rwxr-xr-x    1 root     root        92511 Mar 15 12:49 ld-linux.so.2
-rwxr-xr-x    1 root     root      1170812 Mar 15 12:49 libc.so.6
-rw-r--r--    1 root     root        20900 Mar 15 13:01 libcrypt.so.1
-rw-r--r--    1 root     root         9436 Mar 15 12:49 libdl.so.2
-rw-r--r--    1 root     root       248132 Mar 15 12:48 libncurses.so.5
-rw-r--r--    1 root     root        71332 Mar 15 13:00 libnsl.so.1
-rw-r--r--    1 root     root        34144 Mar 15 16:10
libnss_files.so.2
-rw-r--r--    1 root     root        29420 Mar 15 12:57 libpam.so.0
-rw-r--r--    1 root     root       105498 Mar 15 12:51 libpthread.so.0
-rw-r--r--    1 root     root        25596 Mar 15 12:51 librt.so.1
-rw-r--r--    1 root     root         7760 Mar 15 12:59 libutil.so.1
-rw-r--r--    1 root     root        24328 Mar 15 12:57 libwrap.so.0
</example>
<example>
./usr:
total 16
drwxr-xr-x    4 root     root         4096 Mar 15 13:00 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
drwxr-xr-x    2 root     root         4096 Mar 15 15:55 bin
drwxr-xr-x    2 root     root         4096 Mar 15 15:37 lib
</example>
<example>
./usr/bin:
total 340
drwxr-xr-x    2 root     root         4096 Mar 15 15:55 .
drwxr-xr-x    4 root     root         4096 Mar 15 13:00 ..
-rwxr-xr-x    1 root     root        10332 Mar 15 15:55 env
-rwxr-xr-x    1 root     root        13052 Mar 15 13:13 id
-r-xr-xr-x    1 root     root        25432 Mar 15 12:40 scp
-rwxr-xr-x    1 root     root        43768 Mar 15 15:15 sftp
-r-sr-xr-x    1 root     root       218456 Mar 15 12:40 ssh
-rwxr-xr-x    1 root     root         9692 Mar 15 13:17 tty
</example>
<example>
./usr/lib:
total 852
drwxr-xr-x    2 root     root         4096 Mar 15 15:37 .
drwxr-xr-x    4 root     root         4096 Mar 15 13:00 ..
-rw-r--r--    1 root     root       771088 Mar 15 13:01
libcrypto.so.0.9.6
-rw-r--r--    1 root     root        54548 Mar 15 13:00 libz.so.1
-rwxr-xr-x    1 root     root        23096 Mar 15 15:37 sftp-server
</example>


<sect>Einsperren des SSH-Servers in einem Chroot-Gefängnis

<p>Wenn Sie eine Chroot-Umgebung erstellen, welche die Dateien des SSH-Servers
enthält, z.B. unter <file>/var/chroot/ssh</file>, sollten Sie den im
<prgn>chroot</prgn>-Gefängnis eingesperrten <prgn>ssh</prgn>-Server mit diesem
Befehl starten:

<example>
  # chroot /var/chroot/ssh /sbin/sshd -f /etc/sshd_config
</example>

<p>Das führt dazu, dass der <prgn>sshd</prgn>-Daemon innerhalb des
Chroot-Gefängnisses gestartet wird. Dazu müssen Sie zunächst dafür sorgen, dass
das Verzeichnis <file>/var/chroot/ssh</file> den SSH-Server und die Werkzeuge
enthält, die Benutzer benötigen, die mit dem Server verbunden sind. Wenn Sie
das vorhaben, sollten Sie sicherstellen, dass OpenSSH <em>Rechtetrennung (Privilege
Separation)</em> einsetzt
(was standardmäßig so ist). Dazu muss in der Konfigurationsdatei
<file>/etc/ssh/sshd_config</file> folgende Zeile enthalten sein:

<example>
  UsePrivilegeSeparation yes
</example>

<p>Dadurch wird der entfernte Daemon so wenig Dinge wie möglich als Root
ausführen. Wenn er also einen Fehler enthalten sollte, kann damit nicht aus dem
Chroot-Gefängnis ausgebrochen werden. Beachten Sie, dass, anders als wenn Sie
eine Chroot-Umgebung für jeden Benutzer einzeln einrichten, in diesem Fall der
SSH-Daemon im selben Chroot-Gefängnis wie die Benutzer läuft. Es gibt also
mindestens einen Prozess in der Chroot-Umgebung, der als Root läuft. Mit ihm ist
es möglich, aus dem Chroot-Gefängnis auszubrechen.

<p>Beachten Sie auch, dass SSH nur funktioniert, wenn die Partition, auf der
die Chroot-Umgebung eingerichtet wurde, nicht mit der Option <em>nodev</em>
gemountet wurde. Wenn Sie diese Option verwenden, bekommen Sie folgende
Fehlermeldung: <em>PRNG is not seeded</em>, weil <file>/dev/urandom</file>
nicht in der Chroot-Umgebung funktioniert.


<sect1>Einrichten eines minimalen Systems (der wirklich leichte Weg)

<p>Sie können mit <package>debootstrap</package> eine minimale Umgebung
einrichten, die ausschließlich den SSH-Server enthält. Dafür müssen Sie nur
eine Chroot-Umgebung einrichten, wie es im <url
id="http://www.debian.org/doc/manuals/reference/ch09#_chroot_system"
name="Chroot-Abschnitt der Debian-Referenz"> beschrieben wird. Diese
Vorgehensweise ist idiotensicher (Sie werden alle für die Chroot-Umgebung
notwendigen Bestandteile erhalten), aber dies geht auf Kosten von
Plattenspeicher. Eine minimale Installation von Debian benötigt einige hundert
Megabyte. Dieses minimale System könnte auch Setuid-Dateien enthalten, mit
denen ein Benutzer aus dem Chroot-Gefängnis ausbrechen könnte, wenn sie eine
Rechteerweiterung zulassen.


<sect1>Automatisches Erstellen der Umgebung (der leichte Weg)

<p>Mit dem Paket <package>makejail</package> können Sie leicht eine
eingeschränkte Umgebung erstellen, da es automatisch den Trace des
Server-Daemons verfolgt (mit <prgn>strace</prgn>) und dafür sorgt, dass er in
der eingeschränkten Umgebung läuft.

<p>Der Vorteil von Programmen, die automatisch die <prgn>chroot</prgn>-Umgebung
einrichten, liegt darin, dass sie im Stande sind, Pakete in die
<prgn>chroot</prgn>-Umgebung zu kopieren (und verfolgen sogar die
Abhängigkeiten der Pakete, um sicherzustellen, dass sie vollständig
sind). Dadurch wird das Bereitstellen von Anwendungen für Benutzer leichter.

<p>Um ein Chroot-Gefängnis aus den von <prgn>makejail</prgn> zur Verfügung
gestellten Beispielen einzurichten, müssen Sie <file>/var/chroot/sshd</file>
erstellen und folgenden Befehl ausführen:

<example>
  # makejail /usr/share/doc/makejail/examples/sshd.py
</example>

<p>Dies wird eine Chroot-Umgebung im Verzeichnis <file>/var/chroot/sshd</file>
erstellen. Beachten Sie, dass diese Chroot-Umgebung nicht voll funktionstüchtig
ist, bis Sie:

<list>
<item><p>Das Dateisystem <em>procfs</em> in <file>/var/chroot/sshd/proc</file>
eingebunden haben. <prgn>Makejail</prgn> wird es für Sie einbinden. Aber nach
einem Neustart werden Sie es erneut einbinden müssen:
<example>
  # mount -t proc proc /var/chroot/sshd/proc
</example>
<p>Es kann auch automatisch eingebunden werden. Dazu müssen Sie
<file>/etc/fstab</file> bearbeiten und folgende Zeile eintragen:
<example>
  proc-ssh /var/chroot/sshd/proc  proc none 0 0
</example>

<item>Syslog auf das Geräte <file>/dev/log</file> in der Chroot-Umgebung
horchen lassen. Dazu müssen Sie <file>/etc/default/syslogd</file> ändern und
<em>-a /var/chroot/sshd/dev/log</em> zur Definition der Variablen
<strong>SYSLOGD</strong> hinzufügen.

</list>

<p>Sehen Sie sich die Beispielsdatei an, um herauszufinden, welche Änderungen
an der Umgebung vorgenommen werden müssen. Einige diese Änderungen können nicht
automatisch vorgenommen werden, wie z.B. das Kopieren des Home-Verzeichnisses
eines Benutzers. Außerdem sollten Sie die Gefährdung von sensiblen Informationen
begrenzen, indem Sie nur die Daten bestimmter Benutzer aus den Dateien
<file>/etc/shadow</file> und <file>/etc/group</file> kopieren.
Beachten Sie, dass, falls Sie Rechtetrennung verwenden, der Benutzer
<em>sshd</em> in diesen Dateien vorhanden sein muss.

<p>Die folgende Beispielumgebung wurde (ein wenig) unter Debian 3.0 getestet. Sie basiert auf
der Konfigurationsdatei, die mit dem Paket geliefert wird, und beinhaltet das
Paket <package>fileutils</package>.

<example>
.
|-- bin
|   |-- ash
|   |-- bash
|   |-- chgrp
|   |-- chmod
|   |-- chown
|   |-- cp
|   |-- csh -> /etc/alternatives/csh
|   |-- dd
|   |-- df
|   |-- dir
|   |-- fdflush
|   |-- ksh
|   |-- ln
|   |-- ls
|   |-- mkdir
|   |-- mknod
|   |-- mv
|   |-- rbash -> bash
|   |-- rm
|   |-- rmdir
|   |-- sh -> bash
|   |-- sync
|   |-- tcsh
|   |-- touch
|   |-- vdir
|   |-- zsh -> /etc/alternatives/zsh
|   `-- zsh4
|-- dev
|   |-- null
|   |-- ptmx
|   |-- pts
|   |-- ptya0
(...)
|   |-- tty
|   |-- tty0
(...)
|   `-- urandom
|-- etc
|   |-- alternatives
|   |   |-- csh -> /bin/tcsh
|   |   `-- zsh -> /bin/zsh4
|   |-- environment
|   |-- hosts
|   |-- hosts.allow
|   |-- hosts.deny
|   |-- ld.so.conf
|   |-- localtime -> /usr/share/zoneinfo/Europe/Madrid
|   |-- motd
|   |-- nsswitch.conf
|   |-- pam.conf
|   |-- pam.d
|   |   |-- other
|   |   `-- ssh
|   |-- passwd
|   |-- resolv.conf
|   |-- security
|   |   |-- access.conf
|   |   |-- chroot.conf
|   |   |-- group.conf
|   |   |-- limits.conf
|   |   |-- pam_env.conf
|   |   `-- time.conf
|   |-- shadow
|   |-- shells
|   `-- ssh
|       |-- moduli
|       |-- ssh_host_dsa_key
|       |-- ssh_host_dsa_key.pub
|       |-- ssh_host_rsa_key
|       |-- ssh_host_rsa_key.pub
|       `-- sshd_config
|-- home
|   `-- userX
|-- lib
|   |-- ld-2.2.5.so
|   |-- ld-linux.so.2 -> ld-2.2.5.so
|   |-- libc-2.2.5.so
|   |-- libc.so.6 -> libc-2.2.5.so
|   |-- libcap.so.1 -> libcap.so.1.10
|   |-- libcap.so.1.10
|   |-- libcrypt-2.2.5.so
|   |-- libcrypt.so.1 -> libcrypt-2.2.5.so
|   |-- libdl-2.2.5.so
|   |-- libdl.so.2 -> libdl-2.2.5.so
|   |-- libm-2.2.5.so
|   |-- libm.so.6 -> libm-2.2.5.so
|   |-- libncurses.so.5 -> libncurses.so.5.2
|   |-- libncurses.so.5.2
|   |-- libnsl-2.2.5.so
|   |-- libnsl.so.1 -> libnsl-2.2.5.so
|   |-- libnss_compat-2.2.5.so
|   |-- libnss_compat.so.2 -> libnss_compat-2.2.5.so
|   |-- libnss_db-2.2.so
|   |-- libnss_db.so.2 -> libnss_db-2.2.so
|   |-- libnss_dns-2.2.5.so
|   |-- libnss_dns.so.2 -> libnss_dns-2.2.5.so
|   |-- libnss_files-2.2.5.so
|   |-- libnss_files.so.2 -> libnss_files-2.2.5.so
|   |-- libnss_hesiod-2.2.5.so
|   |-- libnss_hesiod.so.2 -> libnss_hesiod-2.2.5.so
|   |-- libnss_nis-2.2.5.so
|   |-- libnss_nis.so.2 -> libnss_nis-2.2.5.so
|   |-- libnss_nisplus-2.2.5.so
|   |-- libnss_nisplus.so.2 -> libnss_nisplus-2.2.5.so
|   |-- libpam.so.0 -> libpam.so.0.72
|   |-- libpam.so.0.72
|   |-- libpthread-0.9.so
|   |-- libpthread.so.0 -> libpthread-0.9.so
|   |-- libresolv-2.2.5.so
|   |-- libresolv.so.2 -> libresolv-2.2.5.so
|   |-- librt-2.2.5.so
|   |-- librt.so.1 -> librt-2.2.5.so
|   |-- libutil-2.2.5.so
|   |-- libutil.so.1 -> libutil-2.2.5.so
|   |-- libwrap.so.0 -> libwrap.so.0.7.6
|   |-- libwrap.so.0.7.6
|   `-- security
|       |-- pam_access.so
|       |-- pam_chroot.so
|       |-- pam_deny.so
|       |-- pam_env.so
|       |-- pam_filter.so
|       |-- pam_ftp.so
|       |-- pam_group.so
|       |-- pam_issue.so
|       |-- pam_lastlog.so
|       |-- pam_limits.so
|       |-- pam_listfile.so
|       |-- pam_mail.so
|       |-- pam_mkhomedir.so
|       |-- pam_motd.so
|       |-- pam_nologin.so
|       |-- pam_permit.so
|       |-- pam_rhosts_auth.so
|       |-- pam_rootok.so
|       |-- pam_securetty.so
|       |-- pam_shells.so
|       |-- pam_stress.so
|       |-- pam_tally.so
|       |-- pam_time.so
|       |-- pam_unix.so
|       |-- pam_unix_acct.so -> pam_unix.so
|       |-- pam_unix_auth.so -> pam_unix.so
|       |-- pam_unix_passwd.so -> pam_unix.so
|       |-- pam_unix_session.so -> pam_unix.so
|       |-- pam_userdb.so
|       |-- pam_warn.so
|       `-- pam_wheel.so
|-- sbin
|   `-- start-stop-daemon
|-- usr
|   |-- bin
|   |   |-- dircolors
|   |   |-- du
|   |   |-- install
|   |   |-- link
|   |   |-- mkfifo
|   |   |-- shred
|   |   |-- touch -> /bin/touch
|   |   `-- unlink
|   |-- lib
|   |   |-- libcrypto.so.0.9.6
|   |   |-- libdb3.so.3 -> libdb3.so.3.0.2
|   |   |-- libdb3.so.3.0.2
|   |   |-- libz.so.1 -> libz.so.1.1.4
|   |   `-- libz.so.1.1.4
|   |-- sbin
|   |   `-- sshd
|   `-- share
|       |-- locale
|       |   `-- es
|       |       |-- LC_MESSAGES
|       |       |   |-- fileutils.mo
|       |       |   |-- libc.mo
|       |       |   `-- sh-utils.mo
|       |       `-- LC_TIME -> LC_MESSAGES
|       `-- zoneinfo
|           `-- Europe
|               `-- Madrid
`-- var
    `-- run
        |-- sshd
        `-- sshd.pid

27 directories, 733 files
</example>

<p>Bei Debian 3.1 müssen Sie sicherstellen, dass das Gefängnis auch die Dateien
für PAM enthält. Falls es nicht schon <prgn>makejail</prgn> für Sie erledigt
hat, müssen Sie folgende Dateien in die Chroot-Umgebung kopiert:

<example>
  $ ls /etc/pam.d/common-*
  /etc/pam.d/common-account  /etc/pam.d/common-password
  /etc/pam.d/common-auth     /etc/pam.d/common-session
</example>


<sect1>Die Chroot-Umgebung von Hand erstellen (der schwierige Weg)

<p>Es ist möglich, eine Umgebung mit der Trial-and-Error-Methode zu
erstellen. Dazu müssen Sie die Traces und die Logdateien des
<prgn>sshd</prgn>-Servers überwachen, um die notwendigen Dateien
herauszufinden. Die folgende Umgebung, die von José Luis Ledesma zur Verfügung
gestellt wurde, ist eine beispielhafte Auflistung der Dateien in einer
<prgn>chroot</prgn>-Umgebung für <prgn>ssh</prgn> unter Debian
3.0:

<!-- FIXME: This is seriously out of date, it needs to be updated -->

<footnote>
Beachten Sie, dass keine SETUID-Dateien vorhanden sind. Das erschwert es
entfernten Benutzern, aus der <prgn>chroot</prgn>-Umgebung auszubrechen. Es
verhindert allerdings auch, dass Nutzer ihr Passwort ändern, da
<prgn>passwd</prgn> nicht die Dateien <file>/etc/passwd</file> und
<file>/etc/shadow</file> verändern kann.
</footnote>

<example>
.:
total 36
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ./
drwxr-xr-x 11 root root 4096 Jun 3 13:43 ../
drwxr-xr-x 2 root root 4096 Jun 4 12:13 bin/
drwxr-xr-x 2 root root 4096 Jun 4 12:16 dev/
drwxr-xr-x 4 root root 4096 Jun 4 12:35 etc/
drwxr-xr-x 3 root root 4096 Jun 4 12:13 lib/
drwxr-xr-x 2 root root 4096 Jun 4 12:35 sbin/
drwxr-xr-x 2 root root 4096 Jun 4 12:32 tmp/
drwxr-xr-x 2 root root 4096 Jun 4 12:16 usr/
./bin:
total 8368
drwxr-xr-x 2 root root 4096 Jun 4 12:13 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rwxr-xr-x 1 root root 109855 Jun 3 13:45 a2p*
-rwxr-xr-x 1 root root 387764 Jun 3 13:45 bash*
-rwxr-xr-x 1 root root 36365 Jun 3 13:45 c2ph*
-rwxr-xr-x 1 root root 20629 Jun 3 13:45 dprofpp*
-rwxr-xr-x 1 root root 6956 Jun 3 13:46 env*
-rwxr-xr-x 1 root root 158116 Jun 3 13:45 fax2ps*
-rwxr-xr-x 1 root root 104008 Jun 3 13:45 faxalter*
-rwxr-xr-x 1 root root 89340 Jun 3 13:45 faxcover*
-rwxr-xr-x 1 root root 441584 Jun 3 13:45 faxmail*
-rwxr-xr-x 1 root root 96036 Jun 3 13:45 faxrm*
-rwxr-xr-x 1 root root 107000 Jun 3 13:45 faxstat*
-rwxr-xr-x 1 root root 77832 Jun 4 11:46 grep*
-rwxr-xr-x 1 root root 19597 Jun 3 13:45 h2ph*
-rwxr-xr-x 1 root root 46979 Jun 3 13:45 h2xs*
-rwxr-xr-x 1 root root 10420 Jun 3 13:46 id*
-rwxr-xr-x 1 root root 4528 Jun 3 13:46 ldd*
-rwxr-xr-x 1 root root 111386 Jun 4 11:46 less*
-r-xr-xr-x 1 root root 26168 Jun 3 13:45 login*
-rwxr-xr-x 1 root root 49164 Jun 3 13:45 ls*
-rwxr-xr-x 1 root root 11600 Jun 3 13:45 mkdir*
-rwxr-xr-x 1 root root 24780 Jun 3 13:45 more*
-rwxr-xr-x 1 root root 154980 Jun 3 13:45 pal2rgb*
-rwxr-xr-x 1 root root 27920 Jun 3 13:46 passwd*
-rwxr-xr-x 1 root root 4241 Jun 3 13:45 pl2pm*
-rwxr-xr-x 1 root root 2350 Jun 3 13:45 pod2html*
-rwxr-xr-x 1 root root 7875 Jun 3 13:45 pod2latex*
-rwxr-xr-x 1 root root 17587 Jun 3 13:45 pod2man*
-rwxr-xr-x 1 root root 6877 Jun 3 13:45 pod2text*
-rwxr-xr-x 1 root root 3300 Jun 3 13:45 pod2usage*
-rwxr-xr-x 1 root root 3341 Jun 3 13:45 podchecker*
-rwxr-xr-x 1 root root 2483 Jun 3 13:45 podselect*
-r-xr-xr-x 1 root root 82412 Jun 4 11:46 ps*
-rwxr-xr-x 1 root root 36365 Jun 3 13:45 pstruct*
-rwxr-xr-x 1 root root 7120 Jun 3 13:45 pwd*
-rwxr-xr-x 1 root root 179884 Jun 3 13:45 rgb2ycbcr*
-rwxr-xr-x 1 root root 20532 Jun 3 13:45 rm*
-rwxr-xr-x 1 root root 6720 Jun 4 10:15 rmdir*
-rwxr-xr-x 1 root root 14705 Jun 3 13:45 s2p*
-rwxr-xr-x 1 root root 28764 Jun 3 13:46 scp*
-rwxr-xr-x 1 root root 385000 Jun 3 13:45 sendfax*
-rwxr-xr-x 1 root root 67548 Jun 3 13:45 sendpage*
-rwxr-xr-x 1 root root 88632 Jun 3 13:46 sftp*
-rwxr-xr-x 1 root root 387764 Jun 3 13:45 sh*
-rws--x--x 1 root root 744500 Jun 3 13:46 slogin*
-rwxr-xr-x 1 root root 14523 Jun 3 13:46 splain*
-rws--x--x 1 root root 744500 Jun 3 13:46 ssh*
-rwxr-xr-x 1 root root 570960 Jun 3 13:46 ssh-add*
-rwxr-xr-x 1 root root 502952 Jun 3 13:46 ssh-agent*
-rwxr-xr-x 1 root root 575740 Jun 3 13:46 ssh-keygen*
-rwxr-xr-x 1 root root 383480 Jun 3 13:46 ssh-keyscan*
-rwxr-xr-x 1 root root 39 Jun 3 13:46 ssh_europa*
-rwxr-xr-x 1 root root 107252 Jun 4 10:14 strace*
-rwxr-xr-x 1 root root 8323 Jun 4 10:14 strace-graph*
-rwxr-xr-x 1 root root 158088 Jun 3 13:46 thumbnail*
-rwxr-xr-x 1 root root 6312 Jun 3 13:46 tty*
-rwxr-xr-x 1 root root 55904 Jun 4 11:46 useradd*
-rwxr-xr-x 1 root root 585656 Jun 4 11:47 vi*
-rwxr-xr-x 1 root root 6444 Jun 4 11:45 whoami*
./dev:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:16 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
crw-r--r-- 1 root root 1, 9 Jun 3 13:43 urandom
./etc:
total 208
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rw------- 1 root root 0 Jun 4 11:46 .pwd.lock
-rw-r--r-- 1 root root 653 Jun 3 13:46 group
-rw-r--r-- 1 root root 242 Jun 4 11:33 host.conf
-rw-r--r-- 1 root root 857 Jun 4 12:04 hosts
-rw-r--r-- 1 root root 1050 Jun 4 11:29 ld.so.cache
-rw-r--r-- 1 root root 304 Jun 4 11:28 ld.so.conf
-rw-r--r-- 1 root root 235 Jun 4 11:27 ld.so.conf~
-rw-r--r-- 1 root root 88039 Jun 3 13:46 moduli
-rw-r--r-- 1 root root 1342 Jun 4 11:34 nsswitch.conf
drwxr-xr-x 2 root root 4096 Jun 4 12:02 pam.d/
-rw-r--r-- 1 root root 28 Jun 4 12:00 pam_smb.conf
-rw-r--r-- 1 root root 2520 Jun 4 11:57 passwd
-rw-r--r-- 1 root root 7228 Jun 3 13:48 profile
-rw-r--r-- 1 root root 1339 Jun 4 11:33 protocols
-rw-r--r-- 1 root root 274 Jun 4 11:44 resolv.conf
drwxr-xr-x 2 root root 4096 Jun 3 13:43 security/
-rw-r----- 1 root root 1178 Jun 4 11:51 shadow
-rw------- 1 root root 80 Jun 4 11:45 shadow-
-rw-r----- 1 root root 1178 Jun 4 11:48 shadow.old
-rw-r--r-- 1 root root 161 Jun 3 13:46 shells
-rw-r--r-- 1 root root 1144 Jun 3 13:46 ssh_config
-rw------- 1 root root 668 Jun 3 13:46 ssh_host_dsa_key
-rw-r--r-- 1 root root 602 Jun 3 13:46 ssh_host_dsa_key.pub
-rw------- 1 root root 527 Jun 3 13:46 ssh_host_key
-rw-r--r-- 1 root root 331 Jun 3 13:46 ssh_host_key.pub
-rw------- 1 root root 883 Jun 3 13:46 ssh_host_rsa_key
-rw-r--r-- 1 root root 222 Jun 3 13:46 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 2471 Jun 4 12:15 sshd_config
./etc/pam.d:
total 24
drwxr-xr-x 2 root root 4096 Jun 4 12:02 ./
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ../
lrwxrwxrwx 1 root root 4 Jun 4 12:02 other -> sshd
-rw-r--r-- 1 root root 318 Jun 3 13:46 passwd
-rw-r--r-- 1 root root 546 Jun 4 11:36 ssh
-rw-r--r-- 1 root root 479 Jun 4 12:02 sshd
-rw-r--r-- 1 root root 370 Jun 3 13:46 su
./etc/security:
total 32
drwxr-xr-x 2 root root 4096 Jun 3 13:43 ./
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ../
-rw-r--r-- 1 root root 1971 Jun 3 13:46 access.conf
-rw-r--r-- 1 root root 184 Jun 3 13:46 chroot.conf
-rw-r--r-- 1 root root 2145 Jun 3 13:46 group.conf
-rw-r--r-- 1 root root 1356 Jun 3 13:46 limits.conf
-rw-r--r-- 1 root root 2858 Jun 3 13:46 pam_env.conf
-rw-r--r-- 1 root root 2154 Jun 3 13:46 time.conf
./lib:
total 8316
drwxr-xr-x 3 root root 4096 Jun 4 12:13 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rw-r--r-- 1 root root 1024 Jun 4 11:51 cracklib_dict.hwm
-rw-r--r-- 1 root root 214324 Jun 4 11:51 cracklib_dict.pwd
-rw-r--r-- 1 root root 11360 Jun 4 11:51 cracklib_dict.pwi
-rwxr-xr-x 1 root root 342427 Jun 3 13:46 ld-linux.so.2*
-rwxr-xr-x 1 root root 4061504 Jun 3 13:46 libc.so.6*
lrwxrwxrwx 1 root root 15 Jun 4 12:11 libcrack.so -> libcrack.so.2.7*
lrwxrwxrwx 1 root root 15 Jun 4 12:11 libcrack.so.2 -> libcrack.so.2.7*
-rwxr-xr-x 1 root root 33291 Jun 4 11:39 libcrack.so.2.7*
-rwxr-xr-x 1 root root 60988 Jun 3 13:46 libcrypt.so.1*
-rwxr-xr-x 1 root root 71846 Jun 3 13:46 libdl.so.2*
-rwxr-xr-x 1 root root 27762 Jun 3 13:46 libhistory.so.4.0*
lrwxrwxrwx 1 root root 17 Jun 4 12:12 libncurses.so.4 -> libncurses.so.4.2*
-rwxr-xr-x 1 root root 503903 Jun 3 13:46 libncurses.so.4.2*
lrwxrwxrwx 1 root root 17 Jun 4 12:12 libncurses.so.5 -> libncurses.so.5.0*
-rwxr-xr-x 1 root root 549429 Jun 3 13:46 libncurses.so.5.0*
-rwxr-xr-x 1 root root 369801 Jun 3 13:46 libnsl.so.1*
-rwxr-xr-x 1 root root 142563 Jun 4 11:49 libnss_compat.so.1*
-rwxr-xr-x 1 root root 215569 Jun 4 11:49 libnss_compat.so.2*
-rwxr-xr-x 1 root root 61648 Jun 4 11:34 libnss_dns.so.1*
-rwxr-xr-x 1 root root 63453 Jun 4 11:34 libnss_dns.so.2*
-rwxr-xr-x 1 root root 63782 Jun 4 11:34 libnss_dns6.so.2*
-rwxr-xr-x 1 root root 205715 Jun 3 13:46 libnss_files.so.1*
-rwxr-xr-x 1 root root 235932 Jun 3 13:49 libnss_files.so.2*
-rwxr-xr-x 1 root root 204383 Jun 4 11:33 libnss_nis.so.1*
-rwxr-xr-x 1 root root 254023 Jun 4 11:33 libnss_nis.so.2*
-rwxr-xr-x 1 root root 256465 Jun 4 11:33 libnss_nisplus.so.2*
lrwxrwxrwx 1 root root 14 Jun 4 12:12 libpam.so.0 -> libpam.so.0.72*
-rwxr-xr-x 1 root root 31449 Jun 3 13:46 libpam.so.0.72*
lrwxrwxrwx 1 root root 19 Jun 4 12:12 libpam_misc.so.0 ->
libpam_misc.so.0.72*
-rwxr-xr-x 1 root root 8125 Jun 3 13:46 libpam_misc.so.0.72*
lrwxrwxrwx 1 root root 15 Jun 4 12:12 libpamc.so.0 -> libpamc.so.0.72*
-rwxr-xr-x 1 root root 10499 Jun 3 13:46 libpamc.so.0.72*
-rwxr-xr-x 1 root root 176427 Jun 3 13:46 libreadline.so.4.0*
-rwxr-xr-x 1 root root 44729 Jun 3 13:46 libutil.so.1*
-rwxr-xr-x 1 root root 70254 Jun 3 13:46 libz.a*
lrwxrwxrwx 1 root root 13 Jun 4 12:13 libz.so -> libz.so.1.1.3*
lrwxrwxrwx 1 root root 13 Jun 4 12:13 libz.so.1 -> libz.so.1.1.3*
-rwxr-xr-x 1 root root 63312 Jun 3 13:46 libz.so.1.1.3*
drwxr-xr-x 2 root root 4096 Jun 4 12:00 security/
./lib/security:
total 668
drwxr-xr-x 2 root root 4096 Jun 4 12:00 ./
drwxr-xr-x 3 root root 4096 Jun 4 12:13 ../
-rwxr-xr-x 1 root root 10067 Jun 3 13:46 pam_access.so*
-rwxr-xr-x 1 root root 8300 Jun 3 13:46 pam_chroot.so*
-rwxr-xr-x 1 root root 14397 Jun 3 13:46 pam_cracklib.so*
-rwxr-xr-x 1 root root 5082 Jun 3 13:46 pam_deny.so*
-rwxr-xr-x 1 root root 13153 Jun 3 13:46 pam_env.so*
-rwxr-xr-x 1 root root 13371 Jun 3 13:46 pam_filter.so*
-rwxr-xr-x 1 root root 7957 Jun 3 13:46 pam_ftp.so*
-rwxr-xr-x 1 root root 12771 Jun 3 13:46 pam_group.so*
-rwxr-xr-x 1 root root 10174 Jun 3 13:46 pam_issue.so*
-rwxr-xr-x 1 root root 9774 Jun 3 13:46 pam_lastlog.so*
-rwxr-xr-x 1 root root 13591 Jun 3 13:46 pam_limits.so*
-rwxr-xr-x 1 root root 11268 Jun 3 13:46 pam_listfile.so*
-rwxr-xr-x 1 root root 11182 Jun 3 13:46 pam_mail.so*
-rwxr-xr-x 1 root root 5923 Jun 3 13:46 pam_nologin.so*
-rwxr-xr-x 1 root root 5460 Jun 3 13:46 pam_permit.so*
-rwxr-xr-x 1 root root 18226 Jun 3 13:46 pam_pwcheck.so*
-rwxr-xr-x 1 root root 12590 Jun 3 13:46 pam_rhosts_auth.so*
-rwxr-xr-x 1 root root 5551 Jun 3 13:46 pam_rootok.so*
-rwxr-xr-x 1 root root 7239 Jun 3 13:46 pam_securetty.so*
-rwxr-xr-x 1 root root 6551 Jun 3 13:46 pam_shells.so*
-rwxr-xr-x 1 root root 55925 Jun 4 12:00 pam_smb_auth.so*
-rwxr-xr-x 1 root root 12678 Jun 3 13:46 pam_stress.so*
-rwxr-xr-x 1 root root 11170 Jun 3 13:46 pam_tally.so*
-rwxr-xr-x 1 root root 11124 Jun 3 13:46 pam_time.so*
-rwxr-xr-x 1 root root 45703 Jun 3 13:46 pam_unix.so*
-rwxr-xr-x 1 root root 45703 Jun 3 13:46 pam_unix2.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_acct.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_auth.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_passwd.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_session.so*
-rwxr-xr-x 1 root root 9726 Jun 3 13:46 pam_userdb.so*
-rwxr-xr-x 1 root root 6424 Jun 3 13:46 pam_warn.so*
-rwxr-xr-x 1 root root 7460 Jun 3 13:46 pam_wheel.so*
./sbin:
total 3132
drwxr-xr-x 2 root root 4096 Jun 4 12:35 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rwxr-xr-x 1 root root 178256 Jun 3 13:46 choptest*
-rwxr-xr-x 1 root root 184032 Jun 3 13:46 cqtest*
-rwxr-xr-x 1 root root 81096 Jun 3 13:46 dialtest*
-rwxr-xr-x 1 root root 1142128 Jun 4 11:28 ldconfig*
-rwxr-xr-x 1 root root 2868 Jun 3 13:46 lockname*
-rwxr-xr-x 1 root root 3340 Jun 3 13:46 ondelay*
-rwxr-xr-x 1 root root 376796 Jun 3 13:46 pagesend*
-rwxr-xr-x 1 root root 13950 Jun 3 13:46 probemodem*
-rwxr-xr-x 1 root root 9234 Jun 3 13:46 recvstats*
-rwxr-xr-x 1 root root 64480 Jun 3 13:46 sftp-server*
-rwxr-xr-x 1 root root 744412 Jun 3 13:46 sshd*
-rwxr-xr-x 1 root root 30750 Jun 4 11:46 su*
-rwxr-xr-x 1 root root 194632 Jun 3 13:46 tagtest*
-rwxr-xr-x 1 root root 69892 Jun 3 13:46 tsitest*
-rwxr-xr-x 1 root root 43792 Jun 3 13:46 typetest*
./tmp:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:32 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
./usr:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:16 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
lrwxrwxrwx 1 root root 7 Jun 4 12:14 bin -> ../bin//
lrwxrwxrwx 1 root root 7 Jun 4 11:33 lib -> ../lib//
lrwxrwxrwx 1 root root 8 Jun 4 12:13 sbin -> ../sbin//
</example>


<appendix id="chroot-apache-env"><prgn>Chroot</prgn>-Umgebung für
<prgn>Apache</prgn>

<sect>Einleitung

<p>Das Programm <prgn>chroot</prgn> wird häufig dazu benutzt, einen Daemon in
einen beschränkten Verzeichnisbaum einzusperren. Sie können es dazu verwenden,
um Dienste von anderen abzuschirmen, so dass Sicherheitsprobleme mit einem
Softwarepaket den ganzen Server gefährden können. Durch die Verwendung des
Skripts <prgn>makejail</prgn> wird es viel leichter, einen Verzeichnisbaum in
einer <prgn>chroot</prgn>-Umgebung einzurichten und zu aktualisieren.</p>

<p>FIXME: Apache can also be chrooted using 
<url id="http://www.modsecurity.org"> which is available in
<package>libapache-mod-security</package> (for Apache 1.x) and
<package>libapache2-mod-security</package> (for Apache 2.x).


<sect1>Lizenz

<p>Dieses Dokument ist urheberrechtlich von Alexandre Ratti (2002)
geschützt. Es steht unter einer doppelten Lizenz, nämlich der GPL Version 2
(GNU General Public License) und der GNU-FDL 1.2 (GNU Free Documentation Licence). Es
wurde in dieses Handbuch mit seiner ausdrücklichen Genehmigung
aufgenommen. (Siehe auch das <url
id="http://www.gabuzomeu.net/alex/doc/apache/index-en.html"
name="Originaldokument">)

</sect1>
</sect>


<sect>Installation des Servers

<p>Diese Vorgehensweise wurde auf Debian GNU/Linux&nbsp;3.0 (Woody) mit
<prgn>makejail</prgn> 0.0.4-1 (in Debian/Testing) getestet.

<list>

<item> <p>Melden Sie sich als <prgn>Root</prgn> an und erstellen Sie ein neues
Verzeichnis für das Gefängnis:
<example>
$ mkdir -p /var/chroot/apache
</example>
</item>

<item> <p>Erstellen Sie einen neuen Nutzer und eine neue Gruppe. Der Apache in
der <prgn>chroot</prgn>-Umgebung wird als dieser Nutzer und Gruppe laufen, die
für nichts anderes auf dem System verwendet wird. In dem Beispiel heißen sowohl
Nutzer als auch Gruppe <prgn>chrapach</prgn>.
<example> 
  $ adduser --home /var/chroot/apache --shell /bin/false \
  --no-create-home --system --group chrapach
</example>

<p>FIXME: is a new user needed? (Apache already runs as the apache user)</p>
</item>

<item>Installieren Sie ganz normal Apache auf Debian: <tt>apt-get install
apache</tt></item>

<item>Richten Sie Apache ein (z.B. definieren Sie Ihrer Subdomains
usw.). Weisen Sie in der Konfigurationsdatei
<file>/etc/apache/httpd.conf</file> den Optionen <em>Group</em> und
<em>User</em> <tt>chrapach</tt> zu. Starten Sie Apache neu und stellen Sie
sicher, dass der Server korrekt funktioniert. Danach halten Sie den Server
wieder an.</item>

<item>Installieren Sie <prgn>makejail</prgn> (ist fürs Erste in Debian/Testing
vorhanden). Sie sollten auch <prgn>wget</prgn> und <prgn>lynx</prgn>
installieren, da sie von <prgn>makejail</prgn> benutzt werden, um den Server in
der <prgn>chroot</prgn>-Umgebung zu testen: <tt>apt-get install makejail wget
lynx</tt>.</item>

<item>Kopieren Sie die Beispielkonfigurationsdatei für Apache ins Verzeichnis
<file>/etc/makejail</file>:
<example> 
  # cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/ 
</example>
</item>
 
<item>Bearbeiten Sie <file>/etc/makejail/apache.py</file>. Sie müssen die
Optionen <em>chroot</em>, <em>users</em> und <em>groups</em> verändern. Um
diese Version von <prgn>makejail</prgn> laufen zu lassen, können Sie auch die
Option <prgn>packages</prgn> hinzufügen. Vergleichen Sie die <url
id="http://www.floc.net/makejail/current/doc/"
name="Makejail-DoKumentation">. Die Konfigurationsdatei könnte beispielsweise
so aussehen:
<example>
chroot=&quot;/var/chroot/apache&quot;
testCommandsInsideJail=[&quot;/usr/sbin/apachectl start&quot;]
processNames=[&quot;apache&quot;]
testCommandsOutsideJail=[&quot;wget -r --spider http://localhost/&quot;,
                         &quot;lynx --source https://localhost/&quot;]
preserve=[&quot;/var/www&quot;,
          &quot;/var/log/apache&quot;,
          &quot;/dev/log&quot;]
users=[&quot;chrapach&quot;]
groups=[&quot;chrapach&quot;]
packages=[&quot;apache&quot;, &quot;apache-common&quot;]
userFiles=[&quot;/etc/password&quot;,
           &quot;/etc/shadow&quot;]
groupFiles=[&quot;/etc/group&quot;,
            &quot;/etc/gshadow&quot;]
forceCopy=[&quot;/etc/hosts&quot;,
           &quot;/etc/mime.types&quot;]
</example>

<p><em>FIXME:</em> some options do not seem to work properly. For
instance, <file>/etc/shadow</file> and <file>/etc/gshadow</file> are
not copied, whereas <file>/etc/password</file> and
<file>/etc/group</file> are fully copied instead of being
filtered.</p>
</item>

<item>Erstellen Sie den Verzeichnisbaum für chroot: <tt>makejail
/etc/makejail/apache.py</tt>.</item>

<item>Falls <file>/etc/password</file> und <file>/etc/group</file> vollständig
kopiert wurden, geben Sie Folgendes ein, um sie mit gefilterten Fassungen zu
ersetzen:
<example>
      $ grep chrapach /etc/passwd &gt; /var/chroot/apache/etc/passwd
      $ grep chrapach /etc/group &gt; /var/chroot/apache/etc/group
</example>
</item>

<item>Kopieren Sie die Webseiten und die Logs ins Gefängnis. Diese Dateien
werden nicht automatisch mitkopiert (sehen Sie sich dazu die Option
<em>preserve</em> in der Konfigurationsdatei von <prgn>makejail</prgn>
an).
<example>
      # cp -Rp /var/www /var/chroot/apache/var
      # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
</example>
</item>

<item>Editieren Sie das Startskript für den Logging-Daemon des Systems so, dass
er auch den Socket <file>/var/chroot/apache/dev/log</file> beobachtet. Ersetzen
Sie in <file>/etc/default/syslogd</file> <tt>SYSLOGD=&quot;&quot;</tt> mit
<tt>SYSLOGD=&quot; -a /var/chroot/apache/dev/log&quot;</tt> und starten Sie den
Daemon neu (<tt>/etc/init.d/sysklogd restart</tt>).</item>

<item>Editieren Sie das Startskript von Apache
(<file>/etc/init.d/apache</file>). Sie müssen vielleicht ein paar Änderung am
Standardstartskript vornehmen, damit des richtig in einem Verzeichnisbaum in
einer <prgn>chroot</prgn>-Umgebung läuft. Da wäre:
    <list>
      <item>Legen Sie die Variable <em>CHRDIR</em> am Anfang der Datei neu
      fest.</item>

      <item>Bearbeiten Sie die Abschnitte <em>start</em>, <em>stop</em>,
      <em>reload</em> etc.</item>

      <item>Fügen Sie eine Zeile hinzu, um das <file>/proc</file>-Dateisystem
      innerhalb des Gefängnisses zu mounten und abzumounten.</item>
    </list>

<example>
#! /bin/bash
#
# apache        Start the apache HTTP server.
#

CHRDIR=/var/chroot/apache

NAME=apache
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/apache
SUEXEC=/usr/lib/apache/suexec
PIDFILE=/var/run/$NAME.pid
CONF=/etc/apache/httpd.conf
APACHECTL=/usr/sbin/apachectl 

trap "" 1
export LANG=C
export PATH

test -f $DAEMON || exit 0
test -f $APACHECTL || exit 0

# ensure we don't leak environment vars into apachectl
APACHECTL="env -i LANG=${LANG} PATH=${PATH} chroot $CHRDIR $APACHECTL"

if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF
then
    exit 0
fi

case "$1" in
  start)
    echo -n "Starting web server: $NAME"
    mount -t proc proc /var/chroot/apache/proc
    start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON \
      --chroot $CHRDIR
    ;;

  stop)
    echo -n "Stopping web server: $NAME"
    start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo
    umount /var/chroot/apache/proc
    ;;

  reload)
    echo -n "Reloading $NAME configuration"
    start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" \
      --signal USR1 --startas $DAEMON --chroot $CHRDIR
    ;;

  reload-modules)
    echo -n "Reloading $NAME modules"
    start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo \
      --retry 30
    start-stop-daemon --start --pidfile $PIDFILE \
      --exec $DAEMON --chroot $CHRDIR
    ;;

  restart)
    $0 reload-modules
    exit $?
    ;;

  force-reload)
    $0 reload-modules
    exit $?
    ;;

  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|reload|reload-modules|force-reload|restart}"
    exit 1
    ;;
esac

if [ $? == 0 ]; then
  echo .
  exit 0
else
  echo failed
  exit 1
fi
</example>

<p><em>FIXME</em>: should the first Apache process be run as another user than
root (i.e. add --chuid chrapach:chrapach)? Cons: chrapach will need write
access to the logs, which is awkward.</p></item>

<item>Ersetzen Sie in <file>/etc/logrotate.d/apache</file>
<tt>/var/log/apache/*.log</tt> durch
<tt>/var/chroot/apache/var/log/apache/*.log</tt>.</item>

<item>Starten Sie Apache (<prgn>/etc/init.d/apache start</prgn>) und überprüfen
Sie, was im Protokoll des Gefängnisses gemeldet wird
(<file>/var/chroot/apache/var/log/apache/error.log</file>). Wenn Ihre
Einstellung komplexer sein sollte (z.B. wenn Sie auch PHP und MySQL einsetzen),
werden wahrscheinlich Dateien fehlen. Wenn einige Dateien nicht automatisch von
<prgn>makejail</prgn> kopiert werden, können Sie diese in den Optionen
<em>forceCopy</em> (um Dateien direkt zu kopieren) oder <em>packages</em> (um
ganze Pakete mit ihren Abhängigkeiten zu kopieren) in der Konfigurationsdatei
<file>/etc/makejail/apache.py</file> aufführen.</item>

<item><p>Geben Sie <tt>ps aux | grep apache</tt> ein, um sicherzustellen, dass
Apache läuft. Sie sollten etwas in dieser Art sehen:
      <example>
      root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      </example>
</item>

<item>Stellen Sie sicher, dass die Apache-Prozesse in einer
<prgn>chroot</prgn>-Umgebung laufen. Betrachten Sie dazu das
<file>/proc</file>-Dateisystem: <tt>ls -la
/proc/<var>process_number</var>/root/.</tt>, wobei <var>process_number</var> einer der
PID-Nummern ist, die oben aufgeführt wurden (z.B. 189 in der zweiten
Reihe). Die Einträge des eingeschränkten Verzeichnisbaums sollten Sie sich
auflisten lassen:
<example>
    drwxr-sr-x 10 root staff 240 Dec 2 16:06 .
    drwxrwsr-x 4 root staff 72 Dec 2 08:07 ..
    drwxr-xr-x 2 root root 144 Dec 2 16:05 bin
    drwxr-xr-x 2 root root 120 Dec 3 04:03 dev
    drwxr-xr-x 5 root root 408 Dec 3 04:03 etc
    drwxr-xr-x 2 root root 800 Dec 2 16:06 lib
    dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc
    drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin
    drwxr-xr-x 6 root root 144 Dec 2 16:04 usr
    drwxr-xr-x 7 root root 168 Dec 2 16:06 var
</example>
<p>Um diesen Test zu automatisieren, geben Sie <tt>ls -la /proc/`cat
/var/chroot/apache/var/run/apache.pid`/root/.</tt> ein.

<p><em>FIXME</em>: Add other tests that can be run to make sure the
jail is closed?</p>
</item>

</list>

<p>Ich mag das, da es so nicht sehr schwierig ist, das Gefängnis einzurichten,
und der Server mit nur zwei Zeilen aktualisiert werden kann:

<example> 
apt-get update &amp;&amp; apt-get install apache
makejail /etc/makejail/apache.py
</example>

</sect>


<sect>Weiterführende Informationen

<p>Wenn Sie nach weiteren Informationen suchen, sehen Sie sich die Quellen an,
auf denen diese Anleitung beruht:
<list>

<item>Die <url id="http://www.floc.net/makejail/"
name="Makejail-Homepage">. Diese Programm wurde von Alain Tesio geschrieben.
</item>

<!-- Not appropriate for this section 
<item><a href="http://www.easter-eggs.org/article242.html">Bind9 chroot&eacute;
avec <prgn>makejail</prgn></a>, Pascal Brugier, easter-eggs.org,
21/03/2002</item>
 -->

<item>Das <url id="http://zdziarski.com/papers/chroot.html" name="Chrooting
daemons and system processes HOWTO"> von Jonathan A. Zdziarski,
12/03/2003</item>

<!-- Doesn't exist any more 
<item><url
id="http://www.digitaltoad.net/docs/guide/secure_rh/chap29sec254.html"
name="Apache in a chroot jail"> in <em>Securing and Optimizing Linux</em>
written by Gerhard Mourani, 2000</item>
 -->

</list>
</sect>
</appendix>
