CCU2 - XML-API mit appfähiger HTTPS-Authentifizierung (mod auth)
Die Homematic CCU2 verwendet Lighttpd inklusive mod_auth – dieses kann man sich zu nutzen machen um explizit das Plugin „XML-API“ mit einer zusätzlichen HTTP-Authentifizierung zu sichern. Diese Methode ist dennoch nur dann wirklich sicher, wenn das Passwort über eine verschlüsselte Verbindung übertragen wird. Voraussetzung für folgende Schritte:
- Homematic CCU2 (getestet mit Software-Stand 2.21.10 - 2.45.7)
- microSD-Karte die in der CCU2 initialisiert ist
- SSH-Zugang zur Homematic CCU2 (Einstellung -> Systemsteuerung -> Sicherheit)
- Plugin „XML-API“ ab Version 1.10
- Hier zu finden: https://www.homematic-inside.de/software/xml-api oder direkt bei Github https://github.com/hobbyquaker/XML-API/releases
Zuerst stellt man die Verbindung zur Homematic CCU2 her
$ ssh root@192.168.1.xxx
Remount des Root Filesystems als Writeable
$ mount -o remount,rw /
Wechseln auf die SD-Karte
$ cd /media/sd-mmcblk0/
Nun einen Backup Ordner erstellen
$ mkdir backup
Backup der Standardkonfiguration
$ cp /etc/lighttpd/lighttpd* /media/sd-mmcblk0/backup/
Ordnungshalber eine kleine Ordnerstruktur auf der SD-Karte
$ mkdir etc && cd etc/ && mkdir lighttpd && cd lighttpd && mkdir conf.d && cd conf.d
Erstellen der Konfigurationsdatei
$ vi config.conf
Zugriff Intern sowie Extern komplett passwortgeschützt.
Inhalt der config.conf
auth.backend = "plain"
auth.backend.plain.userfile = "/media/sd-mmcblk0/etc/lighttpd/.lightpdpassword"
auth.require = (
"/" =>
(
"method" => "basic",
"realm" => "Api",
"require" => "valid-user"
)
)
Zugriff Intern sowie Extern nur XML API passwortgeschützt.
Inhalt der config.conf
auth.backend = "plain"
auth.backend.plain.userfile = "/media/sd-mmcblk0/etc/lighttpd/.lighttpdpassword"
auth.require = (
"/config/xmlapi" =>
(
"method" => "basic",
"realm" => "Api",
"require" => "valid-user"
),
"/addons/xmlapi" =>
(
"method" => "basic",
"realm" => "Api",
"require" => "valid-user"
)
)
Zugriff Extern nur XML API passwortgeschützt per Hostname. Nicht zu empfehlen! Dies soll nur als Beispiel dienen wie der Zugriff über den Hostnamen funktioniert. Ein Aufruf mit der IP Adresse direkt im Browser umgeht diesen Schutz!
Inhalt der config.conf. <HOSTNAME> muss durch euren Hostnamen ersetzt werden. z.B. home.max-mustermann.de
$HTTP["host"] =~ ".*<HOSTNAME>.*" {
auth.backend = "plain"
auth.backend.plain.userfile = "/media/sd-mmcblk0/etc/lighttpd/.lighttpdpassword"
auth.require = (
"/config/xmlapi" =>
(
"method" => "basic",
"realm" => "Api",
"require" => "valid-user"
),
"/addons/xmlapi" =>
(
"method" => "basic",
"realm" => "Api",
"require" => "valid-user"
)
)
}
Hier stehen noch weitere Konfigurationsmöglichkeiten zur Verfügung: http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModAuth#basic
Es fehlt noch die Passwortdatei.
$ vi /media/sd-mmcblk0/etc/lighttpd/.lighttpdpassword
#Jede Zeile ein Benutzer und darauf achten, dass realm identisch ist.
testbenutzer:passwort
testbenutzer2:passwort
Nun noch die config.conf in die „Serverkonfiguration“ einfügen. Unter cd /etc/lighttpd/ findet man:
- lighttpd.conf
- lighttpd_ssl.conf
Wie man aus den Dateinamen schon erahnen kann ist die eine Datei für die Verbindung ohne SSL zuständig und die andere mit. Grundsätzlich könnte man die Konfiguration z.B. nur in der lighttpd.conf aufrufen, wenn man weiß dass nur über HTTP zugegriffen wird. In diesem Moment könnte man aber über HTTPS nach wie vor ohne zusätzliches Passwort die Inhalte aufrufen. Grundsätzlich ist zu empfehlen den Zugriff nur über HTTPS abzuwickeln.
Am Ende beider Dateien werden die Konfigurationsdateien hinzugefügt:
#######################################################################
##
## custom includes like vhosts.
##
#include "conf.d/config.conf"
#include_shell "cat /etc/lighttpd/vhosts.d/*.conf"
##
#######################################################################
include "/media/sd-mmcblk0/etc/lighttpd/conf.d/config.conf"
Jetzt noch den Lighttpd neu starten und das Filesystem wieder Readonly mounten.
Neustart des Lighttpd
$ /etc/init.d/S50lighttpd restart
Remount des Root Filesystems als Readonly
$ mount -o remount,ro /
Nun ist der „XML-API“-Zugriff nur mit HTTP/HTTPS-Authentifizierung möglich!
Hinweis: Man benötigt nicht unbedingt eine SD-Karte. Allerdings, sollten mal Software-Updates kommen, ist man so auf der sicheren Seite und muss nicht ggf. alles neu schreiben sondern nur die config.conf in die Webserverkonfiguration einfügen.