Wichtige Info

Die Inhalte, die du hier siehst stelle ich dir ohne Werbeanzeigen und ohne Tracking deiner Daten zur Verfügung. Trotzdem muss ich die Server bezahlen sowie Zeit in Recherche, Umsetzung sowie Mail Support stecken.
Um dies leisten zu können, verlinke ich in einigen Artikeln auf die Plattform Amazon. Alle diese Links nennen sich Afiliate Links. Wenn du dir mit diesem Link etwas kaufst, dann erhalte ich eine kleine Provision. Dies ändert jedoch NICHT den Preis, den du bezahlst!
Falls du mich also unterstützen möchtest, kannst du auf den Link zum Produkt klicken und hilfst mir dabei, dieses Hobby weiter zu betreiben.
Da ich Keine Werbung schalte und keine Spenden sammle, ist dies die einzige Möglichkeit, meine Systeme und mich zu finanzieren. Ich hoffe du kannst das verstehen :)



Homeassistant - Unraid (und andere Server) sicher und einfach einbinden


Einleitung

Im zuge einer Anpassung meiner Homeassistant Installation, möchte ich nun auch meinen Virtualisierungsserver in das Dashboard von Homeassistant aufnehmen und dort Daten zur Systemauslastung bzw. Speicherauslastung anzeigen.

In diesem zuge habe ich mich auf die Suche begeben und wurde bei Google schließlich unter dem Stichwort Glances fündig. In diesem Beitrag möchte ich meine Glances Integration zeigen und welche Schritte nötig waren um die Daten gegen unbefugte Nutzung abzusichern.

Wie immer sei gesagt, dass ich keine Haftung übernehme und dies auch nicht die beste Lösung sein muss (gerade in Sachen Komplexität).

Weiterhin kann es auch bessere Wege geben.

Was ist Glances?

Glances ist ein Monitoring Tool, welches für verschiedenste Systeme verfügbar ist. Jetzt wo das gesagt ist, kann es ja dann weitergehen :)... - Jetzt im Ernst.. Glances ist ein in Python geschriebenes Systemmonitoring Tool, welches die Daten auf verschiedensten Wegen an andere Systeme weitergeben kann.

Dabei werden sowohl aktive Varianten (z.B. export als CSV, ElasticSearch) unterstützt, als auch passive Optionen, wie ein Webinterface oder eine Rest API. Glances ist kostenlos verwendbar und durch "Plugins" erweiterbar bzw. beschneidbar.

Jedes Plugin sammelt bestimmte Informationen, bzw. exportiert diese auf eine spezielle Art und Weise.

Im folgenden gehe ich ein wenig mehr darauf ein.

Der Vorteil bei der verwendung von Glances ist, dass es sowohl eine native Homeassistant Integration, als auch für alle gängigen Systeme (Linux, FreeBSD, OS X und Windows) jeweilige Applikationen gibt. Dementsprechend ist die Glances Installation auch nach wenigen Sekunden erfolgreich aufgesetzt, es muss lediglich die Glances App in Unraid installiert werden und die Integration bei Homeassistant geladen werden.

Danach wird nur noch die IP Adresse des Hosts eingegeben und die Werte erscheinen im Homeassistant Dashboard. Nichts schweres...

Aber sobald die Installation von Glances in Unraid abgeschlossen ist, kommen wir für mich zu dem folgenden Problem:

Das Problem mit Glances:

Die Installation in Unraid wird über einen Standard Webserver auf die zugeteilten Schnittstellen exposed (z.B. ins LAN). Dabei wird weder eine Passwort Abfrage verlangt, noch wird für die Datenübertragung HTTPS verwendet. In der Dokumentation gibt es auch anscheinend keinerlei Möglichkeit, die REST API (Passiv) auf https umzustellen.

Lediglich den RESTful Dienst kann man auf https umstellen, dieser sendet dann an einen Restful Server alle Daten (15Kb) aufeinmal an diesen angegebenen Server.

Von dort aus können die Daten dann an andere Systeme weitergegeben werden. Homeassistant bietet Stand heute keine Schnittstelle an, an welcher diese Daten abgeliefert werden können. Es gibt lediglich die Möglichkeit, dass Homeassistant selbst die Daten an einem RESTful Endpoint abfragt.

Welche Lösungen bieten sich an?

Für mich ist die Möglichkeit, Daten ungeschützt und unverschlüsselt einzusehen, ein No-Go. Auch im LAN haben diese Daten nichts unverschlüsselt zu suchen. Daher gibt es unterschiedliche Möglichkeiten von hier startend die Daten sicher an Homeassistant zu geben.

Die erste Möglichkeit wäre ein eigener RESTful Server, welcher die Requests annimmt und weitergibt, dies wäre dann komplett in SSL möglich. Weiterhin können verschiedenste Gateway plugins verwendet werden, wie MQTT, ElasticSearch, Graph und einigen weiteren. Da ich ohnehin einen MQTT Server innerhalb meines Netzwerks betreibe, kommt für mich die MQTT Option am ehesten infrage.

MQTT wird ebenfalls mit TLS unterstützt und würde dadurch auch verschlüsselt die Daten übertragen.

Vorabinformation

Dieses Projekt hat sich als deutlich komplexer erwiesen, als erwartet. Daher gebe ich während dieses Beitrags kurz und knapp die wichtigsten Eckpunkte wieder, wie man innerhalb von einigen Sekunden auch ohne Verschlüsselung die Daten in Homeassistant angezeigt bekomme (per REST Api und per MQTT).

Grundinstallationen und Voraussetzungen

Dieser Beitrag beschäftigt sich lediglich mit der Datenverbindung zwischen Unraid und Homeassistant. Dementsprechend müssen die folgenden Dinge bereits bestehen:

Die folgenden Links beinhaltet externe Artikel, die bei der jeweiligen Vorbereitung helfen.

  • Funktionierender MQTT Broker (Kann in Homeassistant installiert werden, oder standalone)

  • Zertifikat für MQTT Broker muss vorhanden sein (inkl. CA und CA Zertifikat)

  • Eine funktionierende unRAID installation inkl. installierter Community Applications

Konfiguration des MQTT Broker

Zuerst muss der MQTT Broker konfiguriert werden, um TLS zu unterstützen und weiterhin auch Usernamen akzeptieren zu können. Dafür wird die Konfigurationsdatei des Brokers wie folgt verändert.

Die Konfigurationsdatei befindet sich, bei einer Standalone Debian Installation unter:

/etc/mosquitto/conf.d/*

Im folgenden befindet sich meine gesamte Konfiguration inkl. nötiger Kommentare

# Choose the protocol to use when listening.

# This can be either mqtt or websockets.

# Certificate based TLS may be used with websockets, except that only the

# cafile, certfile, keyfile, ciphers, and ciphers_tls13 options are supported.

listener 8883 0.0.0.0

protocol mqtt

# Path to the PEM encoded server certificate.

############## Hier den Pfad ändern!!!! ################

certfile /share/mqtt-broker/test-instance/mqtt-test.jr.local.crt

# Path to the PEM encoded keyfile.

############## Hier den Pfad ändern!!!! ################

keyfile /share/mqtt-broker/test-instance/mqtt-test.jr.local.key

# ----------------------------------------------------------------- #

#Default authentication and topic access control

# ----------------------------------------------------------------- #

#Control access to the broker using a password file. This file can be

# generated using the mosquitto_passwd utility. If TLS support is not compiled

# into mosquitto (it is recommended that TLS support should be included) then

# plain text passwords are used, in which case the file should be a text file

# with lines in the format:

# username:password

# The password (and colon) may be omitted if desired, although this

# offers very little in the way of security.

#

# See the TLS client require_certificate and use_identity_as_username options

# for alternative authentication options. If a plugin is used as well as

# password_file, the plugin check will be made first.

############## Hier den Pfad ändern!!!! ################

password_file /share/mqtt-broker/test-instance/passwd

In diesem File wurde nun defineirt, dass der MQTT Broker nur als mqtt protocol Listener arbeitet und keine WebSockets nutzt. Weiterhin wurde durch definition des Password_file definiert, wo Benutzernamen und Passwörter stehen sollen (wie diese definiert und verschlüsselt werden, kommt im folgenden).

Zuletzt wurde in der Mitte der Datei die TLS Verbindung durch eigene Zertifikate erstellt, mit den Dateien wird der Broker die Verbindung sichern.

Als nächstes kann der Broker auf dem System neugestartet werden.

sudo service mosquitto restart

Benutzer erstellen

Um Benutzer für den Broker zu erstellen, muss der folgende Befehl in der CLI ausgeführt werden:

mosquitto_passwd <<passwort datei>> <<benutzername>>

Im folgenden wird dann das Passwort des Benutzers festgelegt und verschlüsselt in der Datei gespeichert.

Glances installieren und vorbereiten

Glances ist derzeit ist ein sehr mächtiges Tool, jedoch ganz anscheinend nicht dafür gedacht ohne offizielle Zertifikate (Selbst-Signiert) zu arbeiten.

Wenn der MQTT Broker öffentliche TLS Zertifikate (wie z.B. von Let's Encrypt verwendet, werden einige Schritte nicht nötig sein.

Glances für Unraid als Docker Container installieren

Um Glances für Unraid zu installieren, muss lediglich in den "Apps" Tab gewechselt werden und nach "Glances" gesucht werden. Die dann auftauchende App, muss durch klicken auf "Installieren" installiert werden.

Glances ist in meinem Fall bereits installiert.

Sobald Glances installiert ist, muss der Rest im Container eingerichtet werden.

Dafür muss unter "Docker > Glances > Console" die Konsole geöffnet werden.

Da Glances als Container läuft, hat man auch in der Konsole Zugriff auf alle Dateien.

Auf dem Dateisystem (z.B. in einem Share) sollte sich jetzt das Zertifikat für die CA befinden (endet mit .pem in meinem Fall). Wenn ihr die Datei bearbeitet, sollte diese mit "[...] Begin Certificate [...] " starten. Sonst ist da was falsch :)

Im nächsten Schritt wird ein Script erstellt, welches das Zertifikat für python (certifi) nutzbar macht, sodass wir auch mit Zertifikatsprüfung zum Broker Verbinden können und keinen Fehler erhalten.

Wenn ein öffentliches Zertifikat für den Broker verwendet wurde, ist dieser Schritt NICHT nötig!

vi importscript.py import certifi cafile = certifi.where()

#den folgenden Pfad muss man natürlich ändern :)

with open('Pfad-zurCA-PEM-Datei', 'rb') as infile:

customca = infile.read()

with open(cafile, 'ab') as outfile:

outfile.write(customca)

print('That might have worked.')

python importscript.py

Nachdem dies geschehen ist, sollte in der Shell "That might have worked" stehen...

Im nächsten Schritt muss der Start Befehl des Containers angepasst werden, sodass dieser die korrekte Konfiguration erhält und mit MQTT die Daten sendet.

Glances Konfiguration anpassen

Um die Glances Konfiguration anzupassen erstellen wir innerhalb des Unraid Dateisystems eine Datei beliebigen Namens.

Ich habe meine Datei in einem Ordner unter AppData > glances erstellt, da dort die Konfigurationsdateien für Container liegen. In der Konfigurationsdatei (zu finden hier) wird von mir nur der Punkt "mqtt" folgend abgeändert

[mqtt]

# Configuration for the --export mqtt option

host=192.168.2.6 #hier muss eine IP stehen, wenn der DNS Name nicht durch 8.8.8.8 (Google DNS) aufgelöst werden kann. port=8883

#den Port entsprechend der Broker Konfiguration anpassen

tls=true

#falls ihr keine TLS Verbindung nutzen wollt (unverschlüsselt) muss hier false stehen

user=glancesuser

password=glancespw

topic=glancestopic

topic_structure=per-metric

Sobald die Datei erstellt ist, kann Glances nun gestartet werden.

Wichtig ist, dass der Container nicht neu gebaut wird! - Sobald der Container neu gebaut wird, ist das lokale Zertifikat wieder gelöscht! - daher geht es erneut in die Konsole von glances und hier wird der folgende Befehl ausgfeführt:

glances --export mqtt -C /Pfad/zur/config/Datei

Glances sollte nun starten und in das lokale Dashboard wechseln.

Als nächstes kann auf dem MQTT Broker geschaut werden, ob die nötigen Daten verfügbar sind.

Dafür kann ein Programm wie MQTT Explorer verwendet werden.

In meinem Fall sieht es dann in meinem Dashboard wie folgt aus:

Glances schickt nun die Daten verschlüsselt zu meinem MQTT Broker.

Zuletzt müssen nun noch die Daten in Homeassistant importiert werden.

Um zu erfahren, wie du MQTT Daten in Homeassistant als einzelne Sensoren importieren kannst, schau dir gerne den dazugehörigen Beitrag an. In meinem Fall sieht es am Ende wie folgt aus: Die Werte befinden sich in einem Dashboard zur Kontrolle .


Back…