FHEM

Absicherung & Backups

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:

bashKlick markiert alles · Strg + C
attr WEB HTTPS 1

FHEM 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.

bashKlick markiert alles · Strg + C
define allowed_WEB allowed
attr  allowed_WEB validFor WEB
attr  allowed_WEB basicAuth BENUTZERPASSWORTBASE64

Der Wert von basicAuth ist die Base64-Kodierung von benutzer:passwort. Sie wird einmalig auf der Konsole erzeugt:

bashKlick markiert alles · Strg + C
echo -n 'benutzer:passwort' | base64

Schutz 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:

bashKlick markiert alles · Strg + C
attr WEB csrfToken random

Automatische Backups

FHEM bringt einen eigenen Sicherungsbefehl mit. Er packt Konfiguration und Logs in ein Archiv im Verzeichnis ./backup:

bashKlick markiert alles · Strg + C
backup

Damit die Sicherung nicht vergessen wird, erledigt ein zeitgesteuertes at sie automatisch jede Nacht und meldet das Ergebnis anschließend per Telegram:

bashKlick markiert alles · Strg + C
define at_Backup at *03:30:00 {
  fhem("backup");;
  fhem("set Telegram message Tägliches FHEM-Backup wurde erstellt.")
}
attr at_Backup room Wartung

Wichtig 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:

bashKlick markiert alles · Strg + C
define CertMonitor dummy
attr  CertMonitor room Wartung

Die eigentliche Logik liegt in der Hilfsfunktion. Sie benötigt openssl auf dem Server sowie ein Telegram-Gerät:

bashKlick markiert alles · Strg + C
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:

bashKlick markiert alles · Strg + C
define at_CertMonitor at *06:00:00 { CertMonitor_run() }
attr  at_CertMonitor room Wartung

Test und Speichern

  1. Die Weboberfläche über https:// aufrufen und prüfen, ob die Basisauthentifizierung greift.
  2. Mit backup ein manuelles Backup auslösen und kontrollieren, dass im Verzeichnis ./backup ein Archiv entsteht.
  3. Die Zertifikatsprüfung einmalig manuell anstoßen: { CertMonitor_run() } und die Readings am CertMonitor über list CertMonitor ansehen.
  4. Konfiguration sichern:
bashKlick markiert alles · Strg + C
save

Damit 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.