Apache

TU Graz - ZID: Härtung von Webservern (am Beispiel Apache)

Härtung von Webservern (am Beispiel Apache)

Heutzutage werden nur mehr selten Betriebssysteme direkt angegriffen, da sind die gängigen Firewalls zu gut, aber über Applikationen werden dafür umso mehr (Web-)Server attackiert.
Häufige Einfallstore sind z. B. schlecht gewartete WordPress-Installationen oder nicht upgedatete PHP-Versionen - bitte beachten Sie, daß Sie nur gewartete Systeme ans Netz der TU Graz anschließen dürfen und daß wir schlecht gewartete Systeme nach Vorwarnung und gehackte Systeme sofort vom Netz nehmen.

Einfache Härtungsmaßnahmen

Zuallererst sollten Sie sich fragen, ob der Webserver (auch ein Webinterface zur Konfiguration eines Druckers ist ein Webserver!) überhaupt aus dem Internet oder anderen Institutsnetzen erreichbar sein soll - wenn nicht, dann sollte entweder der Webserver oder (besser) die Firewall entsprechend konfiguriert werden.
Sollte das nicht möglich sein, dann kann man die IP-Adresse des Systems in TUGRAZonline auf „reserviert“ setzen, dann ist der Server zumindest aus dem Internet nicht mehr erreichbar - Achtung bei DHCP und falls das Gerät doch „nach Hause telefonieren“ muß.

Auch wenn es teilweise in Richtung „security through obscurity“ geht, wird noch immer empfohlen z.B. die Version des Webservers etc. nicht zu verraten, hier am Beispiel Apache veranschaulicht:

RequestHeader unset Proxy
RequestHeader unset Proxy_Host
RequestHeader unset Proxy_Port
RequestHeader unset Proxy_User
RequestHeader unset Proxy_Pass
RequestHeader unset Proxy_Password

ServerTokens ProductOnly
ServerSignature Off
TraceEnable Off

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

Seit 2017 stufen die meisten Browser Webserver als unsicher ein, wenn diese bei Formulareingaben

  1. kein HTTPS oder
  2. mit SHA-1 ausgestellte Zertifikate
verwenden.

HTTPS

Zumindest wenn Sie auch Userdaten zum Server transportieren (Eingabeformulare), dann sollten Sie unbedingt Verschlüsselung (also HTTPS) verwenden.
Verschlüsselung alleine ist aber nicht genug, es muß sich um vertrauenswürdige Verschlüsselung handeln und dafür sind mehrere Dinge notwendig, u. a. ein offizielles Zertifikat und einige wichtige Einstellungen am Web-Server:
  1. Das Zertifikat darf nicht mit SHA-1 ausgestellt sein.
    Wenn Sie sich nicht sicher sind, dann rufen Sie www.ssllabs.com auf, geben dort Ihren Webserver ein und schauen dann, was in der Zeile „Signature algorithm“ steht - falls dort SHA1 steht müssen Sie ein neues Zertifikat beantragen! Den entsprechenden notwendigen CSR erhalten Sie z. B. durch den Befehl openssl req -new -newkey rsa:2048 -nodes -out NAME.csr -keyout NAME.key -subj "/C=AT/ST=Styria/L=Graz/O=Technische Universit├Ąt Graz/CN=NAME.tugraz.at". Das Zertifikat, das Sie von DigiCert erhalten, speichern Sie unter NAME.crt.
    Insgesamt sollten Sie versuchen bei den o. g. SSL-Labs zumindest ein „A“ zu erreichen, ein „A+“ ist erstrebenswert.
  2. Für den Server NAME.tugraz.at sollten Sie nur bestimmte Methoden der Verschlüsselung erlauben, vor allem kein SSL sondern nur mehr TLS und auch davon nur mehr die neuesten Varianten 1.2 und (sobald verfügbar) 1.3, weiters sollten Sie nur sichere „Cipher Suites“ zulassen:
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'
    SSLHonorCipherOrder on
  3. HTTP sollte dauerhaft auf HTTPS umgeleitet sein, damit alte Bookmarks oder Links nicht auf unsichere Seiten führen können (HSTS):
    <VirtualHost *:80>
     ServerName NAME.tugraz.at
     Redirect permanent / https://NAME.tugraz.at/
    </VirtualHost>
    <VirtualHost NAME.tugraz.at:443>
     ServerName NAME.tugraz.at
     SSLCACertificateFile /pfad/zu/den/certs/terena.crt
     SSLCertificateFile /pfad/zu/den/certs/NAME.crt
     SSLCertificateKeyFile /pfad/zu/den/certs/NAME.key
     Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
     …
    </VirtualHost>
  4. Für das (zumeist verwendete) „OpenSSL“ muß laufend überprüft werden, ob es gravierende Sicherheitslücken (POODLE, Heartbleed, Shellshock, FREAK, BEAST, Logjam, ...) und Patches gibt.
    Zur Überprüfung gibt es hier einen Test.

CSP

Bei diesen Einstellungen müssen Sie aber überprüfen, ob dann noch alles funktioniert (z.B. Frames, SSI, externe Inhalte etc.) und sonst einzelne Zeilen auskommentieren:

Header always append X-Frame-Options SAMEORIGIN
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
Header set Content-Security-Policy "default-src 'mailto' 'self'"
Wenn Sie Ihre Webseite überarbeiten, dann sollte dabei gleich daran gedacht werden, daß CSP in Zukunft aktiviert werden soll!

OCSP stapling

Außerhalb der <VirtualHost></VirtualHost>-Blöcke SSLStaplingCache shmcb:/tmp/stapling_cache(128000) und in jedem <VirtualHost></VirtualHost>-Block SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
(oder gleich in die tls.conf - s. u.).

Ob alles passt können Sie online überprüfen.

HPKP

Man sollte sich sehr gut überlegen, für welche Server man das Pinning einsetzt, da es eigentlich nur hilft, wenn unsere CA DigiCert gehackt wird, bei fehlerhaften Konfigurationen aber dazu führt, daß Clients, die das unterstützen, sich nicht mehr mit dem Server verbinden.

Das „Pinning“ selbst ist eigentlich recht einfach.

Weitere Informationen

BetterCrypto.org, Geek Flare, Mozilla, SSL-Config-Generator, Sysinfo.io, …

Unter Can I Use… (→ Show all) kann man überprüfen, welche Clients man aussperrt, wenn man bestimmte Versionen von SSL/TLS nicht mehr unterstützt.

Tipps

Man kann sich das - wenn man sehr viele virtuelle Server hat - vereinfachen, indem man sich z.B. 2 Dateien tls.conf und hardening.conf anlegt und diese dann einfach in jedem virtuellen Server einbindet:

<VirtualHost NAME.tugraz.at:443>
 ServerName NAME.tugraz.at
 Include conf/tls.conf
 SSLCACertificateFile /pfad/zu/den/certs/terena.crt
 SSLCertificateFile /pfad/zu/den/certs/NAME.crt
 SSLCertificateKeyFile /pfad/zu/den/certs/NAME.key
 Include hardening.conf
 …
</VirtualHost>

Durch einen Bug in OpenSSL ist es derzeit nicht möglich in name based virtuellen Servern unterschiedliche Cipher-Suites zu definieren, es wird immer die erste Cipher-Suite in der Konfig-Datei verwendet!