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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page