Mittwoch, 4. Oktober 2006

Sicherheit

Chroot-Umgebung für Apache

Eine Anleitung zum Absichern von Apache in einer Chroot-Umgebung für die Linux Distribution Debian.

Hinweis

Diese Anleitung ist aus dem Debianhandbuch übernommen worden. Das Orginaldokument wurde Alexandre Ratti erstellt.

Anleitung zum Absichern von Debian
Anhang H - Chroot-Umgebung für Apache


H.1 Einleitung

Das Programm chroot 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 makejail wird es viel leichter, einen Verzeichnisbaum in einer chroot-Umgebung einzurichten und zu aktualisieren.

FIXME: Apache can also be chrooted using http://www.modsecurity.org which is available in libapache-mod-security (for Apache 1.x) and libapache2-mod-security (for Apache 2.x).


H.1.1 Lizenz

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 Originaldokument)


H.2 Installation des Servers

Diese Vorgehensweise wurde auf Debian GNU/Linux 3.0 (Woody) mit makejail 0.0.4-1 (in Debian/testing) getestet.

  • Melden Sie sich als Root an und erstellen Sie ein neues Verzeichnis für das Gefängnis:

         $ mkdir -p /var/chroot/apache
    
  • Erstellen Sie einen neuen Nutzer und eine neue Gruppe. Der Apache in der chroot-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 chrapach.

          
           $ adduser --home /var/chroot/apache --shell /bin/false \
           --no-create-home --system --group chrapach
    

    FIXME: is a new user needed? (Apache already runs as the apache user)

  • Installieren Sie ganz normal Apache auf Debian: apt-get install apache

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

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

  • Kopieren Sie die Beispielkonfigurationsdatei für Apache ins Verzeichnis /etc/makejail:

          
           # cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/
    
  • Bearbeiten Sie /etc/makejail/apache.py. Sie müssen die Optionen chroot, users und groups verändern. Um diese Version von makejail laufen zu lassen, können Sie auch die Option packages hinzufügen. Vergleichen Sie die Makejail-DoKumentation. Die Konfigurationsdatei könnte beispielsweise so aussehen:

         chroot="/var/chroot/apache"
         testCommandsInsideJail=["/usr/sbin/apachectl start"]
         processNames=["apache"]
         testCommandsOutsideJail=["wget -r --spider http://localhost/",
                                  "lynx --source https://localhost/"]
         preserve=["/var/www",
                   "/var/log/apache",
                   "/dev/log"]
         users=["chrapach"]
         groups=["chrapach"]
         packages=["apache", "apache-common"]
         userFiles=["/etc/password",
                    "/etc/shadow"]
         groupFiles=["/etc/group",
                     "/etc/gshadow"]
         forceCopy=["/etc/hosts",
                    "/etc/mime.types"]
    
    

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

  • Erstellen Sie den Verzeichnisbaum für chroot: makejail /etc/makejail/apache.py.

  • Falls /etc/password und /etc/group vollständig kopiert wurden, geben Sie Folgendes ein, um sie mit gefilterten Fassungen zu ersetzen:

               $ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd
               $ grep chrapach /etc/group > /var/chroot/apache/etc/group
    
  • Kopieren Sie die Webseiten und die Logs ins Gefängnis. Diese Dateien werden nicht automatisch mitkopiert (sehen Sie sich dazu die Option preserve in der Konfigurationsdatei von makejail an).

               # cp -Rp /var/www /var/chroot/apache/var
               # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
    
  • Editieren Sie das Startskript für den Logging-Daemon des Systems so, dass er auch den Socket /var/chroot/apache/dev/log beobachtet. Ersetzen Sie in /etc/init.d/sysklogd SYSLOGD="" mit SYSLOGD=" -a /var/chroot/apache/dev/log" und starten Sie den Daemon neu (/etc/init.d/sysklogd restart).

  • Editieren Sie das Startskript von Apache (/etc/init.d/apache). Sie müssen vielleicht ein paar Änderung am Standardstartskript vornehmen, damit des richtig in einem Verzeichnisbaum in einer chroot-Umgebung läuft. Da wäre:

    • Legen Sie die Variable CHRDIR am Anfang der Datei neu fest.

    • Bearbeiten Sie die Abschnitte start, stop, reload etc.

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

         #! /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
    

    FIXME: 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.

  • Ersetzen Sie in /etc/logrotate.d/apache /var/log/apache/*.log durch /var/chroot/apache/var/log/apache/*.log.

  • Starten Sie Apache (/etc/init.d/apache start) und überprüfen Sie, was im Protokoll des Gefängnisses gemeldet wird (/var/chroot/apache/var/log/apache/error.log). 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 makejail kopiert werden, können Sie diese in den Optionen forceCopy (um Dateien direkt zu kopieren) oder packages (um ganze Pakete mit ihren Abhängigkeiten zu kopieren) in der Konfigurationsdatei /etc/makejail/apache.py aufführen.

  • Geben Sie ps aux | grep apache ein, um sicherzustellen, dass Apache läuft. Sie sollten etwas in dieser Art sehen:

               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
    
  • Stellen Sie sicher, dass die Apache-Prozesse in einer chroot-Umgebung laufen. Betrachten Sie dazu das /proc-Dateisystem: ls -la /proc/process_number/root/., wobei process_number 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:

             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
    

    Um diesen Test zu automatisieren, geben Sie ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/. ein.

    FIXME: Add other tests that can be run to make sure the jail is closed?

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

      
     apt-get update && apt-get install apache
     makejail /etc/makejail/apache.py

H.3 Weiterführende Informationen

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

  • Die Makejail-Homepage. Diese Programm wurde von Alain Tesio geschrieben.

  • Das Chrooting daemons and system processes HOWTO von Jonathan, Network Dweebs, 21.10.2002.

Bewertung: 5 von 5, 2 Stimme(n) 711 Klicks
Sicherheit
Von Mr.Foo in Sicherheit am 04.10.06@12:40 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

0 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Noch keine Kommentare


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Chroot-Umgebung für Apache

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen