FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: pandabear_de am 14 Januar 2017, 00:52:37

Titel: Google Authenticator zur Verbesserung der Sicherheit als FHEM - ALT!!!
Beitrag von: pandabear_de am 14 Januar 2017, 00:52:37
Thread nicht mehr aktuell...
Neuer Thread: https://forum.fhem.de/index.php/topic,64791.0.html (https://forum.fhem.de/index.php/topic,64791.0.html)


Hi an alle Interessierte,
meine FHEM Installation kann ich über 'Telegram' ansprechen, um z.B. die aktuellen Verspätungen im ÖPNV oder auch Spritpreise abzufragen. Ich mache mir nun zum Thema Sicherheit Gedanken.

Als erstes habe ich den Bot für 'Telegram' im Notify-Script so eingeschränkt, dass er nur auf bestimmte User antwortet.
https://wiki.fhem.de/wiki/TelegramBot (https://wiki.fhem.de/wiki/TelegramBot)

Zusätzlich möchte ich bei einigen anderen Befehen (z.B. Heizung an) die Sicherheit mit der Angabe eines One-Time-Passworts (OTP) verbessern. Als OTP Generator habe ich mir den https://de.wikipedia.org/wiki/Google_Authenticator (https://de.wikipedia.org/wiki/Google_Authenticator) ausgesucht, da ich ihn auch für andere Themen bereits nutze.

Beispiel Befehl in 'Telegram': Heizung-WZ an 123456   
Die Idee ist, dass ich rechts 6 Zeichen kopiere und über die Funktion prüfe. Falls OK, wird der Rest über das Notify Script verarbeitet und in diesem Beispiel die Heizung angeschaltet.

Im Script würde ich am liebsten eine Funktion wie 'If CheckGoogleAuth($GivenToken) = true then ...' nutzen

Potenziell ist diese Funktionalität auch für alle Installationen interessant, die ihre FHEM auch aus dem Internet erreichbar machen. Dann stünde eine eine 2-Faktor-Authentifizierung zur Verfügung.

Von Perl Programmierung und FHEM Modulen habe ich bisher keine Ahnung und nähere mich nach und nach dem Ziel.


Ich poste meine aktuelle unfertige Version des Scripts, um Mitstreiter zu finden.

Mein FHEM hoste ich auf einem Raspberry Pi mit einer aktuellen Jessie Version.



Notwendige Packages für den Raspi

sudo apt-get install libconvert-base32-perl
sudo apt-get install libauthen-oath-perl


In der sudoers Datei muss FHEM Zugriff auf eine Datei gegeben werden

sudo nano /etc/sudoers

Beim User FHEM die Datei '/dev/urandom' hinzufügen

Die Moduldatei (aktuell 98_GoogleAuthenticator.pm - siehe Dateianhang) hinzufügen. Ich habe dies über Copy'n Paste in der FHEM GUI gemacht.


In FHEM

define GAuth GoogleAuthenticator

Damit ist das Device angelegt.

set GAuth new
Erstellt einen neuen Code. Den nach Ausführung angezeigten Link in die Adresszeile eines neuen Tabs einfügen und aufrufen. Es erscheint ein QR Code der über die Google Authenticator App auf dem Handy abfotografiert werden kann.

Get GAuth check 123456
Prüft den angegebenen Code (hier 123456) gegen den aktuellen gültigen Code. Liefert true (gültig) bzw (false) für nicht gültig zurück.


Jetzt um meinen 'Telegram' Bot entsprechend aufzumonitionieren:
Hier eine verkürzte Version meines Bot-Notify Scripts (Proof of concept):
teleBot:msgText.* {
  my $msgpeer = ReadingsVal("teleBot", "msgPeer", "");;
  if (($msgpeer eq 'UserName_One') || ($msgpeer eq 'UserName_Two')) {
  # mache ich, damit mein Bot nicht jedem anwortet...
    if ($EVTPART1 eq 'Licht') {
    ...
    }
    elsif ($EVTPART1 eq 'XXX') {

      my $GivenToken = substr $EVENT, -6;
      if ($GivenToken =~ /^\d+$/ ) {
        my $GAuthResult = GoogleAuthenticator_Get("", "GAuth", "check", $GivenToken);
        if ($GAuthResult eq 'true') {
          log 3, "ChatMessageNotify: GAuth Token gültig.";
          # Aktionen zum ausführen
          fhem("set teleBot send @" . $msgpeer . " " . " Token gültig!");
        }
        else {
          log 3, "ChatMessageNotify: GAuth Token ungültig!";
          fhem("set teleBot send @" . $msgpeer . " Token ungültig!");
        }
      }
      else {
        log 3, "ChatMessageNotify: GivenToken non numeric! $GivenToken";
        fhem("set teleBot send @" . $msgpeer . " Token ungültig!");
      }
       
    }

    else {
      fhem("set teleBot send @" . $msgpeer . " Nicht verstanden!");
    }
  }
}


Proof of Concept: In 'Telegram' eingeben
XXX test 123456

Telegramm wird sehr wahrscheinlich mit 'Token ungültig!' antworten.


Zur Implementierung...
Einfach im Notify Script XXX durch Euere Lieblingsfunktion ersetzten im Bereich '# Aktionen zum ausführen' Eure Aktionen hinzufügen.
In Telegram gebt ihr Eure Funktion mit Parametern ein und als letztes die 6 Zahlen des Tokens. Fertig (hoffentlich)

Alles aber in der Erprobungsphase!


Verbesserungsvorschläge?


Aktuelle Version 0.3 Umbenennung zu 98_GoogleAuthenticator (14.01.2017)

Aktuell offene Punkte:
Prio 0
- Defect: Befehle über Telegram die bisher nur mit einem Wort funktionierten z.B. 'Bahn' bei mir, benötigen jetzt einen Pseudo-Token am ende, da ansonsten im Log die Fehlermeldung 'Global symbol "$EVTPART2" requires explicit package...' erscheint. Liegt wahrscheinlich daran, dass nach dem Parse es $EVTPART2 einfach nicht gibt. Lösung?

Prio 1
- Grundsätzliche Verbesserungen. [Ich frickel mich hier nur durch]
- Anpassungen mancher Befehle an best practice. Insbesondere lesen und schreiben von Variablen
- Anzeige QR Image direkt nach Ausführung in FHEM
- Option der Ausweitung der gültigen Tokens auf z.B. 3 (time-30, time, time+30)
- NameString darf keine Leerzeichen beinhalten, sonst klappt Google Authenticator nicht. (weitere Einschränkungen zu prüfen). Prüfung muss eingebaut werden.
- ...
Titel: Antw:Google Authenticator zur Verbesserung der Sicherheit als FHEM Modul
Beitrag von: pandabear_de am 14 Januar 2017, 10:33:02
kleine Aktualisierung - neue Version 0.15
- Jetzt wird der SecretString gespeichert und aufgerufen.
- Name in Google Authenticator kann vorgegeben werden
Titel: Antw:Google Authenticator zur Verbesserung der Sicherheit als FHEM Modul
Beitrag von: Ma_Bo am 14 Januar 2017, 10:51:35
Klingt interessant, ich verfolge das Thema mal...


Gesendet von iPhone mit Tapatalk
Titel: Antw:Google Authenticator zur Verbesserung der Sicherheit als FHEM Modul
Beitrag von: pandabear_de am 14 Januar 2017, 14:53:02
Version 0.2 - Proof of Concept steht. Jetzt funktioniert auch die 'Telegram'-Anbindung.
Titel: Antw:Google Authenticator zur Verbesserung der Sicherheit als FHEM Modul
Beitrag von: pandabear_de am 14 Januar 2017, 17:27:36
Ich habe jetzt raus, wie ich den QR anzeige. Jedoch fehlt mir gerade noch die konkrete Idee wir ich die Def des Devices aktualisiere. Auch fehlt mir noch die Idee wie ich das QR Image nach dem Set new Befehl anzeigen kann.

Hier die Schritte:
define GAuthQR weblink image https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth%3A%2F%2Ftotp%2FFHEMTest%3Fsecret%3D6pn7gly75tvcmj6kkhaygggexyedmdjeofqrleeuircw6kdjdmyg6gk5hg6qds5jdiwqq2l5ewg3vbpi