CCU2 - XML-API mit appfähiger HTTPS-Authentifizierung (mod auth)

Aus Dirk's Wiki
Zur Navigation springen Zur Suche springen

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:

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.