OpenWRT: LuCI absichern
In der Standardinstallation wird die Administrationsoberfläche LuCI nur unverschlüsselt per HTTP und auf allen Interfaces angeboten. Für einen sicheren Zugriff bei der Administration sollte unbedingt HTTPS aktiviert und der Zugriff eingeschränkt werden: Zunächst müssen die fehlenden Module für die HTTPS-Unterstützung installiert werden:
root@openWRT:~# opkg update
root@openWRT:~# opkg install uhttpd-mod-tls luci-ssl
Wird der uhttpd danach neu gestartet, so wird automatisch ein selbstsigniertes Zertifikat erzeugt und beim nächsten Zugriff automatisch auf HTTPS weitergeleitet.
root@openWRT:~# /etc/init.d/uhttpd restart
Danach sollte der uhttpd auch auf Port 443 verfügbar sein:
root@openWRT:~# netstat -tulpen |grep 443
tcp 0 0 192.168.1.1:443 0.0.0.0:* LISTEN 2160/uhttpd
Damit auf LuCI nicht über das WAN zugegriffen werden kann, wird die IP-Adresse des LAN Interface in den entsprechenden Parameter der uhttpd-Konfiguration (/etc/config/uhttpd
) eingetragen:
config uhttpd 'main'
list listen_http '192.168.1.1:80'
# list listen_http '[::]:80'
list listen_https '192.168.1.1:443'
# list listen_https '[::]:443'
option redirect_https '1'
[...]
Achtung: Ist die IP-Adresse des LAN-Interfaces zuvor abgeändert worden, so muss sie hier entsprechend angepasst werden. Hinweis: In der obigen Konfiguration werden die IPv6 Listener deaktiviert. Wird IPv6 verwendet so muss in der Konfiguration die IPv6-Adresse des internen Interfaces eingetragen werden. Nach eine Restart des Server Prozesses sollte uhttpd dann nur noch auf dem internen Interface lauschen:
root@openWRT:~# /etc/init.d/uhttpd restart
root@guard:~# netstat -tulpen |grep uhttpd
tcp 0 0 192.168.1.1:80 0.0.0.0:* LISTEN 2160/uhttpd
tcp 0 0 192.168.1.1:443 0.0.0.0:* LISTEN 2160/uhttpd
Wer wie ich eine eigene CA betreibt, sollte das von uhttpd automatisch erstellte selbstsignierte SSL-Zertifikat noch austauschen. Dazu muss das Zertifikat und der Schlüssel im binären DER-Format vorliegen. Ein direkter Export aus XCA hat bei mir nicht funktioniert. Daher habe ich den Schlüssel und das Zertifikat zunächst im PEM-Format aus XCA exportiert. Beim Export des Zertifikats ist darauf zu achten, dass die gesamte Zertifikatskette exportiert wird (siehe Screenshot).Anschließend werden die PEM-Dateien in das für uhttpd benötigte DER-Format konvertiert und anschließend per SSH auf den Router übertragen:
$ openssl rsa -in 192.168.1.1.key.pem -outform DER -out uhttpd.key
writing RSA key
$ openssl x509 -in 192.168.1.1.kette.pem -outform DER -out uhttpd.crt
$ scp uhttpd.* root@192.168.1.1:/etc/
root@192.168.1.1's password:
uhttpd.crt 100% 1403 1.4KB/s 00:00
uhttpd.key 100% 1192 1.2KB/s 00:00
Anschließend habe ich uhttpd neu gestartet und das Zertifikat der Web-Seite überprüft. Anmerkung: Sollte der uhttpd mit den neuen Zertifikaten nicht starten, so sollte ein löschen der Dateien /etc/uhttpd.crt
und /etc/uhttpd.key
ausreichen. In diesem Falle sollte uhttpd bei einem Neustart die fehlenden Zertifikate bemerken und automatisch einen neuen selbstsignierten Schlüssel erzeugen. Sollen zusätzlich auch noch die TLS-Cipher-Suiten eingeschränkt werden, so kann uhttpd auch durch mini-httpd ersetzt werden. Für mich sind im internen Netzwerk die folgenden Cipher-Suiten aber ausreichend:
$ nmap --script ssl-enum-ciphers -n -p 443 192.168.1.1
Starting Nmap 6.47 ( http://nmap.org ) at 2015-10-18 19:18
Nmap scan report for 192.168.1.1
Host is up (0.0010s latency).
PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_RC4_128_MD5 - strong
| TLS_RSA_WITH_RC4_128_SHA - strong
| compressors:
| NULL
| TLSv1.1:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_RC4_128_MD5 - strong
| TLS_RSA_WITH_RC4_128_SHA - strong
| compressors:
| NULL
| TLSv1.2:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_RC4_128_MD5 - strong
| TLS_RSA_WITH_RC4_128_SHA - strong
| compressors:
| NULL
|_ least strength: strong
Nmap done: 1 IP address (1 host up) scanned in 1.79 seconds
Kommentare