Apache
Virtual Hosts mit SSL
Echte IP-based Virtual Hosts
Die beliebten named-based Virtual Hosts lassen sich eigentlich mit SSL nicht verwenden (Begründung siehe hier). Man muss also pro Virtual Host eine separate IP-Adresse verwenden, z.B. durch Zuweisung einer Alias-IP-Adresse und (bei NAT) Umleitung eines zusätzlichen Ports vom Router.
Die Konfig sieht dann so aus:
<IfDefine SSL>
<IfDefine !NOSSL>
<Directory "/srv/www/vhosts/server1">
Options None
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
<Directory "/srv/www/vhosts/server2">
Options None
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
<VirtualHost 1.1.1.1:443>
...
DocumentRoot "/srv/www/vhosts/server1"
...
SSLCertificateFile /etc/apache2/ssl.crt/server1.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server1.key
...
</VirtualHost>
<VirtualHost 1.1.1.2:443>
...
DocumentRoot "/srv/www/vhosts/server2"
...
SSLCertificateFile /etc/apache2/ssl.crt/server2.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server2.key
...
</VirtualHost>
</IfDefine>
</IfDefine>
Vorteil: Man kann jedem Virtual Host eigene Keys und SSL-Zertifikate zuordnen.
Named-based Virtual Hosts
Es ist jedoch mit named-based Virtual Hosts zumindest möglich, Server mit verschiedenen DocumentRoot Verzeichnissen aufzusetzen . Allerdings wird dabei immer nur das SSL-Zertifikat des ersten Hosts verwendet, da der Host-Header erst nach dem SSL-Handshake ausgewertet wird (so dass es am Client ggf. eine Fehlermeldung gibt).
Die Konfig sieht dann so aus:
NameVirtualHost *:443
<IfDefine SSL>
<IfDefine !NOSSL>
<Directory "/srv/www/vhosts/server1">
Options None
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
<Directory "/srv/www/vhosts/server2">
Options None
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:443>
...
DocumentRoot "/srv/www/vhosts/server1"
...
SSLCertificateFile /etc/apache2/ssl.crt/server1.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server1.key
...
</VirtualHost>
<VirtualHost *:443>
...
DocumentRoot "/srv/www/vhosts/server2"
...
SSLCertificateFile /etc/apache2/ssl.crt/server1.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server1.key
...
</VirtualHost>
</IfDefine>
</IfDefine>
SSL-Proxy
Das Problem mit mehreren IP-Adressen kann man umgehen, wenn man das Modul mod_rewrite einsetzt, um einen "SSL-Proxy" zu bauen. Siehe z.B. http://www.serversupportforum.de/forum/faqs-anleitungen/2558-howto-ssl-proxy.html.
Nachteil: Unschöne URLs.
mod_rewrite
siehe
- http://www.whoopis.com/howtos/apache-rewrite.html
- http://www.webhostgear.com/109.html
- http://www.pro-linux.de/news/2006/9325.html
- http://www.modrewrite.de/foren/ftopic82.html
- Workshop: Redirect und Modrewrite
Alle Zugriffe von Port 80 auf Port 443 (SSL) umleiten
RewriteEngine on
RewriteCond %{SERVER_PORT} =80
RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI}
bzw.
RewriteEngine on
RewriteCond %{SERVER_PORT} !^430$
RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI}
Diese Konfig funktioniert auch im <Directory>-Kontext, um z.B. nur eine bestimmte URL umzuleiten. Die folgende Konfig leitet nur http://www.kruedewagen.de/path auf https://www.kruedewagen.de/path um (und alle Unterverzeichnisse):
Alias /path /usr/share/path
<Directory /usr/share/path/>
Options FollowSymLinks
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Directory>
Ein / am Ende der URL einfügen
RewriteEngine on
RewriteRule ^/url$ http://www.mydomain.de/url/ [R]
Logging
Um rewrite Logging einzuschalten (für gesamten Server oder auf Virtual Host Ebene):
RewriteEngine on
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 2
Authentifizierung
Apache 2.2
Wenn man eine Basic-Authentifizierung für ein Verzeichnis eingerichtet hat, gilt das normalerweise auch für alle Unterverzeichnisse. Man kann jedoch die Abfrage von Username/Passwort für Unterverzeichnisse ausschließen mittels:
Allow from all
Satisfy Any
siehe:
- http://httpd.apache.org/docs/2.2/mod/core.html#satisfy
- http://www.bluestarweb.on.ca/htaccess.html
- http://webmaster.iu.edu/security_info/index.shtml
Mit der folgenden Konfiguration wird Authentifizierung nur für bestimmte IP-Ranges ausgeschaltet:
<Directory /path/>
AllowOverride None
Order allow,deny
Allow from 127
Allow from 192.168.0.0/16
Allow from 10.1.0.0/16
AuthType Basic
AuthName "Login"
AuthUserFile /path/to/htpasswd
Require user user1
Satisfy Any
</Directory>
Apache 2.4
Die Require-Direktiven werden nun im Modul mod_authz_core behandelt.
Änderung gegenüber Apache 2.2: Statt
Order allow,deny
Allow from all
verwendet man
Require all granted
Hinwiese:
- "Require all denied" ist i.d.R. als Default gesetzt, so dass "Require all granted" in jeder Directory-Direktive gesetzt werden muss, wenn ein Zugriff allgemein erlaubt sein soll.
- Eine Mischung der neuen Require-Direktiven mit "Allow/Deny from" sollte unbedingt vermieden werden.
Beispiele
Login nur mit Basic Auth:
<Directory "/srv/www/vhosts/myhost">
Options FollowSymLinks
AllowOverride None
Require all denied
AuthType Basic
AuthName "MyHost Login"
AuthUserFile /srv/www/passwdfile
<RequireAny>
Require user myuser
</RequireAny>
</Directory>
Erlaube Zugriff über IP-Ranges oder - falls man von anderer IP kommt - alternativ per Basic Auth:
<Directory "/srv/www/vhosts/myhost">
Options FollowSymLinks
AllowOverride None
Require all denied
AuthType Basic
AuthName "MyHost Login"
AuthUserFile /srv/www/passwdfile
<RequireAny>
Require ip 192.168
Require ip ::1
Require user myuser
</RequireAny>
</Directory>
Performance Tuning
Siehe http://httpd.apache.org/docs/2.2/misc/perf-tuning.html.
Möglichst gute Settings:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 255
MaxClients 255
MaxRequestsPerChild 50000
KeepAlive On
MaxKeepAliveRequests 500
KeepAliveTimeout 15
Server Status
- Siehe http://httpd.apache.org/docs/2.2/mod/mod_status.html
- Modul mod_status laden
- Konfig
<IfModule mod_status.c>
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost 127.0.0.1
</Location>
</IfModule>
ExtendedStatus On
- Zugriff über http:/server-status
Hinweis: "ExtendedStatus On" sollte nut temporär gesetzt sein.
Spezialitäten
Folgende Konfiguration ist nötig, falls Dateien von einem Samba-Share über Apache zugänglich gemacht werden sollen, ansonsten werden z.B. größere Dateien nicht vollständig transferiert (nur ca. 60 kByte):
<directory /path_to_dir>
EnableMMAP off
EnableSendfile off
</directory>
/path_to_dir ist das Verzeichnis, welches dann u.U. per symlink auf das Samba Share verweist.