Apache
Contents
1. TODO
Einzelne Seite checken, insb. ?Drupal wirft noch Fehler im Statusbericht.
2. Installation
Installiert wird das Paket apache2.
3. Firewall
Die Details der Firewall-Konfiguration sind auf einer separaten Seite beschrieben.
4. Module
Modul |
Zweck |
Dokumentation |
expires (optional) |
Wiki: Ablaufdatum für statische Inhalte setzen (Performance) |
|
headers |
HTTP-Header für Serverantwort setzen (Sicherheit) |
|
macro |
Makro-Unterstützung in den Konfigurationsdateien |
|
ssl |
HTTPS-Verbindungen aktivieren |
|
wsgi (optional) |
Wiki: WSGI-Schnittstelle einsetzen; ersetzt CGI |
- Zum Aktivieren macht man Folgendes:
$ a2enmod <Modulname> $ service apache2 reload
- und zum Deaktivieren entsprechend:
$ a2dismod <Modulname> $ service apache2 reload
Bitte beachten:
Bei aktiviertem wsgi Modul reicht ein Reload von Apache nicht aus. Wegen der zusätzliche Daemon-Prozesse muss es ein Restart sein!
5. X.509-Zertifikat und TLS-Konfiguration
Für TLS wird das Modul mod_ssl eingesetzt. Alle VirtualHosts verwenden dieselbe Konfiguration von mod_ssl. Details siehe unten bei den Sites-Konfigurationen. Die Auswahl und Reihenfolge der cipher suites wird auf einer separaten Seite erläutert.
Das Zertifikat für
wurde von Let's Encrypt beglaubigt. Wir nehmen dafür das certbot packet, welches die Zertifikate automatisch erneuert. Als Emailadresse ist bei certbot admin@lug-in.de hinterlegt.
Das Zertifikat muss in der Apache Konfiguration eingebunden werden, certbot setzt die Optinen in die Site-Configs automatisch ein, da wir die SSL-Optionen selbst setzen, kann man den Import der letsencypt cipher config wieder rausnehmen. Das Zertifikat liegt im pfad /etc/letsencrypt/live/lug-in.de/.
6. /etc/apache2/apache2.conf
Die Hauptkonfigurationsdatei /etc/apache2/apache2.conf bleibt beinahe unverändert. Durch den mit der Apache-Version 2.4 neu eingeführten Mechanismus mit Konfigurationsdateien in /etc/apache2/conf-{available,enabled} können wir die für die LUG IN spezifischen Änderung und Anpassungen teilweise in die Datei lug-in.conf auslagern.
Konfigurationsabschnitte, bei denen es auf die Reihenfolge der Verarbeitung durch Apache ankommt, müssen trotzdem in apache2.conf bleiben:
Die in lug-in.conf definierten Makros müssen zurückgesetzt werden:
UndefMacro AccessErrorLogging
Zum Aktivieren macht man Folgendes:
$ a2enconf <Konfigurationsdatei> $ service apache2 restart
- und zum Deaktivieren entsprechend:
$ a2disconf <Konfigurationsdatei> $ service apache2 restart
7. /etc/apache2/conf-available/lug-in.conf
Das Logging wird vereinheitlicht und für die VirtualHosts als Makro bereitgestellt:
<Macro AccessErrorLogging ${name}> CustomLog ${APACHE_LOG_DIR}/${name}_access.log combined ErrorLog ${APACHE_LOG_DIR}/${name}_error.log </Macro>
Die Konfigurationsdatei wird aktiviert.
$ a2enmod lug-in
8. /etc/apache2/conf-available/ssl_opts.conf
Übernommen von ?cipherlist.eu
<IfModule mod_ssl.c> # parts from cipherlist.eu SSLCipherSuite EECDH+AESGCM:EDH+AESGCM # Requires Apache 2.4.36 & OpenSSL 1.1.1 SSLProtocol -all +TLSv1.3 +TLSv1.2 SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1 # Older versions # SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" # Requires Apache >= 2.4.11 SSLSessionTickets Off </IfModule>
Die Konfigurationsdatei wird aktiviert.
$ a2enmod ssl_opts
9. /etc/apache2/envvars
Die Datei enthält einige Umgebungsvariablen für Apache. Für das MoinMoin-Wiki, genauer, für dessen CGI-/WSGI-Prozesse, wird die Variable MOINLOGGINGCONF benötigt. Die Variable kann nicht per SetEnv-Anweisung gesetzt werden, da sie dann nicht an die Python-Kind-Prozesse durchgereicht wird!
Die bestehenden Umgebungsvariablen werden nicht verändert. Wir ergänzen nur:
# Moinmoin wiki logging configuration; for details see # /usr/share/pyshared/MoinMoin/log.py export MOINLOGGINGCONF=/etc/moin/logging.conf
10. Sites
Die Konfiguration für Sites befinden sich in /etc/apache2/sites-available. Hier sollten die einzelnen Konfigurationsdateien dokumentiert werden.
Auch hier gilt, dass nach jeder Änderung mit service apache2 reload die Konfiguration neu geladen bzw. mit service apache2 restart der Webserver neu gestartet werden muss.
10.1. default.conf
Die Apache Standardseite ist deaktiviert.
$ a2dissite default
10.2. lug-in-wiki.conf (MoinMoin)
Diese Site stellt das MoinMoin Wiki bereit.
Das Wiki wird im Normalfall über ein Python-Skript /usr/share/moin/server/moin.cgi per CGI angesprochen. Dies ist nicht besonders schnell, weil bei jedem Zugriff auf das Wiki erst die Python-Instanz geladen und initialisiert werden muss. Deswegen ersetzen wir den CGI-Anschluss durch einen WSGI-Anschluss, so dass immer eine gewisse Anzahl von Python-Instanzen im Speicher bereit stehen, um Anfragen sofort bearbeiten zu können.
Dies erledigt das Apache-Modul wsgi, das über das Paket libapache2-mod-wsgi installiert wird. Das alternative Paket python-flup wird nicht benötigt.
Wir erstellen die Konfiguration so, dass immer ein Fallback auf CGI möglich ist, falls wider Erwarten irgendwelche Probleme mit WSGI auftreten sollten. Das ist dann zwar langsam, funktioniert aber. In diesem Fall muss lediglich mit
$ a2dismod wsgi
das Modul wsgi deaktiviert und Apache neu gestartet werden.
Die Konfiguration steht in der /etc/apache2/sites-available/lug-in-wiki.conf
Bemerkungen zur Konfiguration:
Es gibt zwei WSGI-Modi, daemon und embedded. Wir nutzen den daemon-Modus und können den embedded-Modus komplett verbieten. Dies liefert weitere Vorteile bei der Initialisierung der Python-Instanzen (siehe WSGILazyInitialization).
- Die Anmeldung beim Wiki erfolgt ausschließlich verschlüsselt über HTTPS. HTTP-Anfragen werden permanent umgeleitet. Die Behandlung des Session-Cookies wird davon nicht beeinträchtigt.
- Das Wiki enthält statische Inhalte, die gesondert behandelt werden:
Die ursprünglichen Alias-Anweisungen (ausgenommen Alias /static/) stammen aus der MoinMoin-Dokumentation von Debian. Das Alias /static/ habe ich hinzugefügt, um in der Subdomain statische Inhalte ablegen zu können. Dort liegen zur Zeit nur das Logo und das Favicon.
Um flexibler zu sein, können einige Alias-Anweisungen in AliasMatch-Anweisungen umgeschrieben werden. Die Originalversionen behalten wir als Kommentare.
Die Dateien favicon.ico und robots.txt werden direkt behandelt.
Da Apache in der Reihenfolge Location, Alias, Directory auswertet, müssen wir für die Zielverzeichnisse /usr/share/fckeditor, /usr/share/moin/htdocs und /var/www/lug-in-wiki/static schützen.
Das Modul expires steuert in den Antworten des Webservers die HTTP-Kopfzeilen Expires und Cache-Control (Wert für max-age). Da sich die statischen Inhalte nur bei neuen Wiki-Versionen ändern, können wir um der Performance Willen mit den Zeiträumen besonders großzügig sein.
Wenn das Modul wsgi aktiviert ist, wird das Skript /usr/share/moin/server/moin.wsgi verwendet, andernfalls das normale CGI-Skript /usr/share/moin/server/moin.cgi.
Der Apache-Hauptprozess erzeugt beim Start unter einer internen ID einige WSGI-Daemons, deren Anzahl mit den Argumenten processes und threads genauer eingestellt werden kann. (Zur Orientierung: wiki.debian.org verwendet processes=16 und threads=16.) Diese Prozesse gehören www-data:www-data und leben im Verzeichnis /tmp. Zur besseren Unterscheidbarkeit der Prozesse dient ein Anzeigename. Die Lokalisierungen lang='en_US.UTF-8' und locale='en_US.UTF-8' müssen fest vorgeschrieben werden, damit Nicht-ASCII-URLs korrekt behandelt werden.
- Anmelde-Informationen werden von Apache über WSGI an die Python-Skripte weitergereicht.
Die Konfiguration enthält VirtualHost-Anweisungen für HTTP sowie HTTPS.
Aktivieren der Site:
$ a2ensite lug-in-wiki
Bitte beachten:
Bei Änderungen an der WSGI-Konfiguration reicht ein Reload von Apache nicht aus. Wegen der zusätzliche Daemon-Prozesse muss es ein Restart sein!
Weitere Informationen:
Lokal: /usr/share/doc/python-moinmoin/README.Debian und /usr/share/doc/python-moinmoin/examples/apache20.conf
http://code.google.com/p/modwsgi/wiki/IntegrationWithMoinMoin
http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines
http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives
Graham Dumpleton, Setting LANG and LC_ALL when using mod_wsgi
10.3. lug-in-www.conf (Drupal)
Ansprechpartner |
Diese Seite stellt die Startseite der LUG-IN bereit. Diese Seite läuft unter Drupal.
Die Konfiguration enthält VirtualHost-Einträge für HTTP sowie HTTPS.
Die Konfiguration steht in /etc/apache2/sites-available/lug-in-www.conf.
Bemerkungen zur Konfiguration:
- Die Anmeldung bei Drupal erfolgt ausschließlich verschlüsselt über HTTPS. HTTP-Anfragen werden permanent umgeleitet. Die Behandlung des Session-Cookies wird davon nicht beeinträchtigt.
Die erste HTTP-Anfrage http://lug-in.de muss auf https://lug-in.de (HTTPS) umgeleitet werden *bevor* die Subdomain www hinzugefügt wird. Nur damit kann gewährleistet werden, dass Browser den HSTS-Header der Top-Level-Domain lernen und nicht nur die der Subdomains.
Aktivieren der Site:
$ a2ensite lug-in-www
10.4. lug-in-cloud.conf (Nextcloud)
Ansprechpartner |
Für den Nextcloud-Server stellen wir natürlich auch eine eigene Sites-Datei her, damit das mit dem VirtualHost auch klappt.
Bemerkungen zur Konfiguration:
- Die Zugriff auf ownCloud erfolgt ausschließlich über HTTPS. HTTP-Anfragen werden permanent umgeleitet.
PHP kann man mit der folgenden Einstellung in /etc/php5/apache2/php.ini "zum Schweigen" bringen:
expose_php = Off
Aktivieren der Site:
$ a2ensite lug-in-cloud
10.5. lug-in-lists.conf (GNU Mailman)
Ansprechpartner |
Startseite des GNU Mailman, Details siehe unter Mailman.
Die Konfiguration enthält VirtualHost-Einträge für HTTP und HTTPS.
Die Konfiguration in /etc/apache2/sites-available/lug-in-lists.conf.
Aktivieren der Site:
$ a2ensite lug-in-lists
11. Scanner
Die Konfiguration von Web-Servern kann über verschiedene Scanner überprüft werden:
Secruity Headers von Sophos
webbkoll von dadskydd.net
SSL Labs von Qualys