Apache2

Aus crazylinux.de
Zur Navigation springen Zur Suche springen

als Webserver verwenden wir Apache2 mit PHP4, mod_security, mod_auth_pam, mod_deflate und ZendOptimizer. Desweiteren lassen wir die Logfiles nach einem Tag rotieren. Rotiert wird nach UTC, d.h. wir müssen eine Stunde wieder abziehen (-60).

Multihome-Umgebung

In einer Multihome-Umgebung laufen z.b. mehrere verschiedene Domains/Apache-Prozesse auf einem Server. Diese Domains haben aber überhaupt nichts miteinander zu tun. D. h. wiederrum, daß die Domains bzw. der User, die dahinter stehen, natürlich auch kein Zugriff auf die jeweiligen Dateien der andere Domains haben. Gleiches gilt natürlich für den Apache-Prozess! Desweiteren sollten die Apache-Prozesse aus Sicherheitsgründen in einem Chroot laufen. Diese Funktionalität bringt mod-security mit. Alternativen zu Chroot wären noch z.b. BSD-Jails, Xen, uml (user mode linux), virtuozzo(openvz), bochs, Sun-Zones, qemu bzw. vmware, da chroot auch nicht immer das beste ist, siehe hier. Der Vorteil beim chroot von mod-security ist, das man selbst kein eigenes Chroot bauen muß, da mod-security den chroot-call erst am Ende der Konfiguration macht. Der Apache-Prozess ist also in seinem Document-Root gefangen.

Für die technische Umsetzung bedeutet das folgendes:

  • Jede Domain hat eine eigenen User/Gruppe (der User ist nicht in seiner eigene Gruppe!, der User bekommt nur r-Rechte, die Gruppe rw-Rechte. In dieser Gruppe muß auch der User sein, der die Seiten der Website pflegt.)
  • Chroot ins Document-Root
  • Jede Domain hat eigene apache2_xxx.conf
  • init-script "multidomain"-fähig machen
  • Der Sitename darf keine Zahlen am anfang haben, sonst gehen die Scripts nicht.

apache2.conf

Bisher war die globale Config in der Datei apache2.conf. Das wollen wir jetzt ändern, aber so, daß die orginal-apache-scripts noch funktionieren. Deshalb kopieren wir apache2.conf nach apache2_common.conf und entfernen die letzte Zeile. Nun eine neue apache2.conf:

# include global-apache2.conf
include /etc/apache2/apache2_common.conf
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/[^.#]

apache2_website.conf

Nun kommt die eigentliche Website-Config /etc/apache2/chroot/xxx.conf

# include global-apache2.conf
include /etc/apache2/apache2_common.conf
LockFile /data/www/meine.de/www/var/lock/apache2/accept.lock

User wwwtietz
Group wwwtietz
ServerRoot "/data/www/meine.de/www"
SecChrootLock /data/www/meine.de/www/log/modsec_chroot.lock
SecChrootDir /data/www/meine.de/www

# PidFile: The file in which the server should record its process
# identification number when it starts.
PidFile /data/www/meine.de/www/var/run/apache2.pid

Listen 10.0.0.2:82
<VirtualHost 10.0.0.2:82>
        ServerName www.meine.de
        ServerAdmin webmaster@website.tld
        DocumentRoot htdocs/
        <Directory />
                Options FollowSymLinks
                AllowOverride all
        </Directory>
        <Directory /data/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all
                Order allow,deny
                allow from all
                # This directive allows us to have apache2's default start page
                # in /apache2-default/, but still have / go to the right place
                #RedirectMatch ^/$ /apache2-default/
        </Directory>

        ErrorLog log/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog "|/usr/sbin/rotatelogs log/access.log.%Y-%m-%d 86400 -60" combined
        ServerSignature Off
</VirtualHost>

virt. Host

bsp site-conf /etc/apache2/sites-available/xxxtemplate:

Listen 62.146.xxx.xxx:80
<VirtualHost 62.146.xxx.xxx:80>
       ServerAdmin webmaster@xxx
       ServerName www.xxxx
       ServerAlias xxxx2
       DocumentRoot /home/www/xxxx/htdocs
       <Directory />
               Options FollowSymLinks
               AllowOverride None
       </Directory>
       ErrorLog "|/usr/sbin/rotatelogs /home/www/xxxx/logs/error.log.%Y.%m.%d 86400 -60"
       # Possible values include: debug, info, notice, warn, error, crit,
       # alert, emerg.
       LogLevel warn
       CustomLog "|/usr/sbin/rotatelogs /home/www/xxxx/logs/access.log.%Y.%m.%d 86400 -60" combined
</VirtualHost>

mod_auth_pam/Verzeichnisschutz

Für den Verzeichnisschutz verwenden wir mod_auth_pam, d.h. wir können die gleichen Logindaten wie am System nutzen. Damit man eine Gruppe nutzen kann, wird libapache2-mod-auth-sys-group benötigt!

eine bsp. .htaccess:

AuthPAM_Enabled on
AuthType Basic
AuthName "secure area"
require group staff

mod_security

/etc/apache2/mods-avaible/mod-security.conf:

<IfModule mod_security.c>
   # Turn the filtering engine On or Off
   SecFilterEngine On
   # Make sure that URL encoding is valid
   SecFilterCheckURLEncoding On
   # Only allow bytes from this range
   SecFilterForceByteRange 1 255
   # The audit engine works independently and
   # can be turned On of Off on the per-server or
   # on the per-directory basis
   SecAuditEngine RelevantOnly
   # The name of the audit log file
   SecAuditLog /var/log/apache2/audit_log
   SecFilterDebugLog /var/log/apache2/modsec_debug_log
   SecFilterDebugLevel 0
   # Should mod_security inspect POST payloads
   SecFilterScanPOST On
   # Action to take by default
   SecFilterDefaultAction "deny,log,status:406"
   # Prevent OS specific keywords
   SecFilter /etc/ password
   SecFilter /bin/ ls
   # Prevent path traversal (..) attacks
   SecFilter "\.\./"
   # Weaker XSS protection but allows common HTML tags
   SecFilter "<( |\n)*script"
   # Prevent XSS atacks (HTML/Javascript injection)
   #SecFilter "<(.|\n)+>"
</IfModule>

Für bestimmte Verzeichnisse kann man den Filter auch ausstellen:

<Location /upload.php>
   # Do not inherit filters from the parent folder
   SecFilterInheritance Off
</Location>

Web Services using Mod Security (Apache) Methodology and Filtering Techniques by Shreeraj Shah on 19/01/05

mod_php

Aus Sicherheitsgründen vestecken wir die PHP-Version im HTTP-Header /etc/php4/apache2/php.ini

expose_php = off
memory_limit = 50M      ; Maximum amount of memory a script may consume (8MB)
[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer=/usr/lib/php4/Zend/lib/Optimizer-2.5.10
zend_extension_manager.optimizer_ts=/usr/lib/php4/Zend/lib/Optimizer_TS-2.5.10
zend_optimizer.version=2.5.10a
#zend_extension=/usr/lib/php4/Zend/lib/ZendExtensionManager.so
zend_extension=/usr/lib/php4/20020429/php_accelerator_1.3.3r2.so
#zend_extension_ts=/usr/lib/php4/Zend/lib/ZendExtensionManager_TS.so
phpa.ignore_files ="graph_image.php"
phpa.shm_user = www-data
phpa.shm_group = www-data

mod_dav

WEBDAV-Modul für Apache. Damit ist es möglich Dateien über https zu manipulieren (ändern, löschen, erstellen usw.).

Alias /phparea /home/gstein/php_files
Alias /php-source /home/gstein/php_files
DavLockDB /tmp/DavLock.myvhost
<Location /php-source>
 Dav On
 AuthType Basic
 AuthName DAV
 AuthPAM_Enabled on
 require group staff
 php_flag engine off # oder  ForceType text/plain
</Location>


Links

http://httpd.apache.org/docs/2.0/programs/rotatelogs.html
http://www.php-accelerator.co.uk/
PHPACA Web Front End http://www.modsecurity.org/