TurrisOS 5.0.x: lighttpd absichern
In der Standardinstallation kann die Administrationsoberfläche Foris bzw. LuCI des TurrisOS zwar per HTTPS aufgerufen werden, aber es werden lediglich selbst-signierte Zertifikate verwendet und es wird auch keine Verschlüsselung erzwungen.
Da ich eine eigene CA betreibe, habe ich das von lighttpd automatisch erstellte selbstsignierte SSL-Zertifikat gegen ein Zertifikat meiner CA ausgetauscht. Dazu muss das Zertifikat und der Schlüssel im PEM-Format vorliegen. Daher habe ich den Schlüssel und das Zertifikat zunächst im PEM-Format aus XCA exportiert. Dabei muss das Zertifikat zusammen mit dem privaten Schlüssel in eine PEM-Datei kopiert werden. In einer zweiten Datei ist die Zertifikatskette zu speichern. Beide Dateien werden anschließend per SSH auf den Router übertragen werden.
Die Datei /etc/lighttpd/turris.pem
sollte demnach folgenden Inhalt haben:
-----BEGIN CERTIFICATE-----
MIIHCDCCBPCgA[...]BEkA==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIJKQI[...]JuG
-----END RSA PRIVATE KEY-----
Da der private Schlüssel in der Datei gespeichert wird, sollten die Berechtigungen der Datei entsprechend eingeschränkt werden: chmod 600 /etc/lighttpd/turris.pem
.
Die Datei /etc/lighttpd/ca-chain.pem
sollte ungefähr so aussehen:
-----BEGIN CERTIFICATE-----
MIIGnDCCBISgAwIBAgIIKgm+sc35MZQwDQYJKoZIhvcNAQENBQAwgbYxCzAJBgNV
[...]
ynBAw7yvStfjlvTIJo+y1Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGjTCCBHWgAwIBAgIITuYXsREtldgwDQYJKoZIhvcNAQENBQAwgbYxCzAJBgNV
[...]
Iw==
-----END CERTIFICATE-----
Jetzt muss nur noch die Datei /etc/lighttpd/conf.d/ssl-enable.conf
mit folgendem Inhalt angelegt werden:
$SERVER["socket"] == ":80" {
url.redirect = ("" => "https://${url.authority}${url.path}${qsa}")
}
$SERVER["socket"] == "[::]:80" {
url.redirect = ("" => "https://${url.authority}${url.path}${qsa}")
}
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
# pemfile is cert+privkey, ca-file is the intermediate chain in one file
ssl.pemfile = "/etc/lighttpd/turris.pem"
ssl.ca-file = "/etc/lighttpd/ca-chain.pem"
#ssl.dh-file = "/etc/ssl/dhparam"
# intermediate configuration
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.openssl.ssl-conf-cmd = ("Protocol" => "ALL, -SSLv2, -SSLv3, -TLSv1, -TLSv1.1")
# Cipher recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_lighttpd.html
ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES128+EECDH:AES128+EDH"
# Cipher recommendations from Mozilla
#ssl.cipher-list = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
# disable compression to avoid CRIME attacks
ssl.use-compression = "disable"
ssl.honor-cipher-order = "disable"
ssl.ec-curve = "secp384r1"
}
$SERVER["socket"] == "[::]:443" {
ssl.engine = "enable"
# pemfile is cert+privkey, ca-file is the intermediate chain in one file
ssl.pemfile = "/etc/lighttpd/turris.pem"
ssl.ca-file = "/etc/lighttpd/ca-chain.pem"
#ssl.dh-file = "/etc/ssl/dhparam"
# intermediate configuration
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.openssl.ssl-conf-cmd = ("Protocol" => "ALL, -SSLv2, -SSLv3, -TLSv1, -TLSv1.1")
# Cipher recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_lighttpd.html
ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES128+EECDH:AES128+EDH"
# Cipher recommendations from Mozilla
# ssl.cipher-list = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
# disable compression to avoid CRIME attacks
ssl.use-compression = "disable"
ssl.honor-cipher-order = "disable"
ssl.ec-curve = "secp384r1"
}
$HTTP["scheme"] == "https" {
# Add 'HTTP Strict Transport Security' header (HSTS) to sites
setenv.add-response-header += ( "Strict-Transport-Security" => "max-age=31536000; includeSubDomains" )
}
In den ersten Zeilen der Konfigurationsdatei, wird zunächst die Weiterleitung auf HTTPS eingerichtet. Danach werden die Listener für IPv4 und IPv6 eingerichtet. Zu guter Letzt wird dann noch der HSTS-Header gesetzt.
Wenn alles geklappt hat, sollte eine Konfigurationsprüfung per lighttpd -t -f /etc/lighttpd/lighttpd.conf
keine Fehler mehr anzeigen. In dem fall muss nur noch der lighttpd-Dienst neu gestartet werden: /etc/init.d/lighttp restart
.
Ob der Dienst läuft, kann mit netstat -tulpen | grep 443
überprüft werden.
Kommentare