Eine Hausautomatisierung steuert Heizung, Fenster und Anwesenheit – entsprechend schützenswert ist sie. Diese Seite zeigt, wie die FHEM-Weboberfläche gegen unbefugten Zugriff abgesichert wird, wie sich die gesamte Konfiguration automatisch sichern lässt und wie ein Zertifikats-Monitor rechtzeitig vor ablaufenden TLS-Zertifikaten warnt. So bleibt das System sowohl vor fremdem Zugriff als auch vor Datenverlust geschützt. Alle Zugangsdaten, Pfade und Hostnamen sind generische Platzhalter.
Verschlüsselter Zugriff (HTTPS)
Der Zugriff auf die Weboberfläche sollte ausschließlich verschlüsselt erfolgen. In FHEM genügt dafür ein Attribut am Web-Gerät:
attr WEB HTTPS 1FHEM verwendet dabei zunächst ein selbstsigniertes Zertifikat, das im Browser eine Sicherheitswarnung auslöst. Wie sich dieser Zustand mit einer eigenen Zertifizierungsstelle (CA) beseitigen lässt, sodass die Verbindung verschlüsselt und ohne Warnung ist, beschreibt die Seite HTTPS mit eigener CA.
Passwortschutz der Weboberfläche
Ohne Anmeldung ist die Oberfläche für jeden im Netzwerk erreichbar. Das Modul allowed ergänzt eine Basisauthentifizierung und bindet sie an das Web-Gerät.
define allowed_WEB allowed
attr allowed_WEB validFor WEB
attr allowed_WEB basicAuth BENUTZERPASSWORTBASE64Der Wert von basicAuth ist die Base64-Kodierung von benutzer:passwort. Sie wird einmalig auf der Konsole erzeugt:
echo -n 'benutzer:passwort' | base64Schutz vor gefälschten Anfragen (CSRF)
Damit nicht jede beliebige Webseite im Hintergrund Befehle an FHEM senden kann, schützt ein CSRF-Token jede schreibende Anfrage. Aktuelle FHEM-Versionen aktivieren dies automatisch; explizit lässt es sich so setzen:
attr WEB csrfToken randomAutomatische Backups
FHEM bringt einen eigenen Sicherungsbefehl mit. Er packt Konfiguration und Logs in ein Archiv im Verzeichnis ./backup:
backupDamit die Sicherung nicht vergessen wird, erledigt ein zeitgesteuertes at sie automatisch jede Nacht und meldet das Ergebnis anschließend per Telegram:
define at_Backup at *03:30:00 {
fhem("backup");;
fhem("set Telegram message Tägliches FHEM-Backup wurde erstellt.")
}
attr at_Backup room WartungWichtig ist, die Sicherungen außerhalb des FHEM-Servers vorzuhalten – ein Backup auf derselben SD-Karte oder Platte hilft beim Hardware-Defekt nicht. Die Archive lassen sich daher zusätzlich auf ein NAS oder in eine Nextcloud kopieren.
Zertifikate überwachen
Wer interne Dienste über HTTPS mit einer eigenen CA betreibt, muss deren Zertifikate rechtzeitig erneuern – sonst stehen plötzlich alle Verbindungen still. Eine Perl-Funktion in der 99_myUtils.pm übernimmt diese Überwachung: Sie prüft sowohl per Netzwerk erreichbare Dienste als auch lokale Zertifikatsdateien und warnt per Telegram, bevor ein Zertifikat abläuft.
Zunächst wird ein Dummy als Sammelstelle für die ermittelten Werte (Restlaufzeiten) angelegt:
define CertMonitor dummy
attr CertMonitor room WartungDie eigentliche Logik liegt in der Hilfsfunktion. Sie benötigt openssl auf dem Server sowie ein Telegram-Gerät:
sub CertMonitor_run {
# 1) Per Netzwerk erreichbare Dienste (Host => Port)
my %targets = (
"router.lan" => 443,
"nas.lan" => 443,
"fhem.lan" => 8083,
);
# 2) Lokale Zertifikatsdateien (Name => Pfad)
my %localCerts = (
"server" => "/opt/fhem/certs/server-cert.pem",
"ca" => "/opt/fhem/certs/ca.crt",
);
my @warn = ();
# --- Remote-Zertifikate pruefen ---
foreach my $host (sort keys %targets) {
my $port = $targets{$host};
my $cert = qx(echo | openssl s_client -connect $host:$port -servername $host 2>/dev/null);
next unless ($cert =~ /BEGIN CERTIFICATE/);
my $enddate = qx(echo "$cert" | openssl x509 -noout -enddate);
$enddate =~ s/notAfter=//;
chomp($enddate);
my $end_ts = qx(date -d "$enddate" +%s);
chomp($end_ts);
my $days_left = int(($end_ts - time()) / 86400);
fhem("setreading CertMonitor ${host}_days_left $days_left");
push @warn, "$host: noch $days_left Tage (bis $enddate)" if ($days_left < 15);
}
# --- Lokale Zertifikate pruefen ---
foreach my $name (sort keys %localCerts) {
my $file = $localCerts{$name};
next unless (-e $file);
my $enddate = qx(openssl x509 -in "$file" -noout -enddate 2>/dev/null);
$enddate =~ s/notAfter=//;
chomp($enddate);
my $end_ts = qx(date -d "$enddate" +%s);
chomp($end_ts);
my $days_left = int(($end_ts - time()) / 86400);
fhem("setreading CertMonitor ${name}_days_left $days_left");
push @warn, "$name (lokal): noch $days_left Tage (bis $enddate)" if ($days_left < 30);
}
# --- Gesammelte Warnung verschicken ---
if (@warn) {
my $msg = "Achtung - folgende Zertifikate laufen bald ab:\n" . join("\n", @warn);
fhem("set Telegram message \"$msg\"");
}
}Die Funktion arbeitet in drei Schritten: Für jeden Remote-Dienst holt sie über openssl s_client das Zertifikat, liest das Ablaufdatum aus und rechnet die verbleibenden Tage aus. Anschließend prüft sie die lokalen Zertifikatsdateien (Server-Zertifikat und CA) auf dieselbe Weise. Jeder ermittelte Wert wird als Reading am CertMonitor abgelegt, und alles, was unter der Warnschwelle liegt (Server 15 Tage, CA 30 Tage), wird in einer einzigen Telegram-Nachricht gebündelt verschickt.
Damit die Prüfung regelmäßig läuft, wird sie täglich über ein at aufgerufen:
define at_CertMonitor at *06:00:00 { CertMonitor_run() }
attr at_CertMonitor room WartungTest und Speichern
- Die Weboberfläche über
https://aufrufen und prüfen, ob die Basisauthentifizierung greift. - Mit
backupein manuelles Backup auslösen und kontrollieren, dass im Verzeichnis./backupein Archiv entsteht. - Die Zertifikatsprüfung einmalig manuell anstoßen:
{ CertMonitor_run() }und die Readings amCertMonitorüberlist CertMonitoransehen. - Konfiguration sichern:
saveDamit ist die Anlage rundum geschützt: verschlüsselter und passwortgesicherter Zugriff, automatische Sicherungen außer Haus und eine Überwachung, die ablaufende Zertifikate meldet, bevor sie zum Problem werden.
