FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: pandabear_de am 24 Januar 2017, 21:42:45

Titel: Google Authenticator - Zugänge aus dem Netz besser absichern - neues Modul
Beitrag von: pandabear_de am 24 Januar 2017, 21:42:45
Hi,
zusammen mit Betateilchen habe ich ein neues Modul GoogleAuth entwickelt. Es erlaubt die Einbindung von zeitabhängigen Ein-Mal-Passwörtern (One-Time-Passwords) in FHEM. Mit der Funktion können z.B. Fernzugänge zu FHEM oder auch sensible Befehle die via Telegram gesendet werden, zusätzlich abgesichert werden.

Die Ein-Mal-Passwörter werden von der Anwendung Google Authenticator, welches es für die gängigen Betriebsysteme gibt, generiert und in FHEM zur Verifizierung eingegeben.
Android: https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=de (https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=de)
IOS: https://itunes.apple.com/de/app/google-authenticator/id388497605?mt=8 (https://itunes.apple.com/de/app/google-authenticator/id388497605?mt=8)

CommandRef: https://fhem.de/commandref.html#GoogleAuth (https://fhem.de/commandref.html#GoogleAuth)

Entstehungsgeschichte und Quelle folgender Code-Schnipsel ist hier: https://forum.fhem.de/index.php/topic,64791.0.html (https://forum.fhem.de/index.php/topic,64791.0.html)

Notwendige Packages für den Raspi

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


Die Moduldatei 98_GoogleAuth.pm ist seit dem 16.01.2017 teil des Standard-Updates von FHEM.

In FHEM

define GoogleAuth GoogleAuth

Damit ist das Device angelegt.

set GoogleAuth new
Erstellt einen neuen Code. Danach einfach mit der Google Authenticator App abfotografieren.

get GoogleAuth check 123456
Prüft den angegebenen Code (hier 123456) gegen den aktuellen gültigen Code. Liefert 1 (gültig) bzw (-1) für nicht gültig zurück.

Bei mir habe ich den TelegramBot zur Kommunikation mit FHEM von Außen eingebunden.
https://wiki.fhem.de/wiki/TelegramBot (https://wiki.fhem.de/wiki/TelegramBot)

Im Notify Script für Telegram nutze ich folgende Zeilen um GoogleAuth einzubinden.

teleBot:msgText.* {
  my $msgpeer = ReadingsVal("teleBot", "msgPeer", "");;
  my @evtparts = split(" ",$EVENT);
     $evtparts[1] //= "";
     $evtparts[2] //= "";

  my $GivenToken = substr $EVENT, -6;
  # nehme die letzten 6 Zeichen des Textes und speichere sie in die Variable
  my $GAuthResult = gAuth("GoogleAuth",$GivenToken);
  # prüfe ob die Zeichenfolge von eben einen gültigen Token ergibt

  #Log3("ChatMessage.notify",4,"googleAuth ChatMessage.notify: result: $GAuthResult");

  if (($msgpeer eq 'Max_Mustermann') || ($msgpeer eq 'Erika_Musterfrau')) {
  # hiermit schränke ich zusätzlich ein, von wem überhaupt ein Text verabeitet wird. Kann aber auch die Attribs beim Bot-Device eingeschränkt werden.
     if ($evtparts[1] eq 'Licht') {
       if ($GAuthResult eq '1') {
       #Für sensible Befehle, wie z.B. Licht schalten, frage ich ab, ob der gegebene Token gültig = 1 war.
         if ($evtparts[2] eq 'an') {
           fhem("set KNX_0004 on");
           fhem("set teleBot send @" . $msgpeer . " Licht an");
         }
         elsif ($evtparts[2] eq 'aus') {
           fhem("set KNX_0004 off");
           fhem("set teleBot send @" . $msgpeer . " Licht aus");
         }
         else {
           fhem("set teleBot send @" . $msgpeer . " " . " Befehlt ungültig!");
         }
       }
       else {
         fhem("set teleBot send @" . $msgpeer . " Token ungültig!");
         # falls Token ungültig war und ein Token relevanter Befehl erkannt wurde, antwortet FHEM, dass der Token ungültigt ist

       }     
     }
     elsif ($evtparts[1] eq 'Test') {
      # für einen unkritischen Befehl wie Test oder sende aktuelle Spritpreise wird keine zusätzliche Authentifizierung benötigt. Daher fehlt die Abfrage Google Auth hier.
       fhem("set teleBot send @" . $msgpeer . " Echo Test");
     }
     else {
       fhem("set teleBot send @" . $msgpeer . " Nicht verstanden!");
     }
  }
}


In Telegram jetzt z.B. folgendes eingeben:

Licht an 123456


Wenn 123456 zu dem Zeitpunkt ein gültiger Token ist, schaltet FHEM dann das Licht ein.


Eine andere Anwedungsmöglichkeit:
Zitat von: betateilchen am 15 Januar 2017, 15:30:21
So kann man den Zugang zur fhem-Oberfläche direkt mit GoogleAuth absichern:

define allowedWeb allowed
attr allowedWeb validFor web
attr allowedWeb basicAuth { "$user" eq "bt" && gAuth("g1","$password") == 1 }


Damit muss man sich dann an der FHEMWEB Instanz "web" mit dem Benutzer bt und  dem aktuellen Token aus "g1" als Passwort anmelden.


Titel: Antw:Google Authenticator - Zugänge aus dem Netz besser absichern - neues Modul
Beitrag von: riker1 am 02 Januar 2021, 07:56:21
Hallo,

wollte wissen, ob man mit Google Authenticator mehrere Token also User anlegen kann?

Danke VG T
Titel: Antw:Google Authenticator - Zugänge aus dem Netz besser absichern - neues Modul
Beitrag von: betateilchen am 02 Januar 2021, 10:53:04
Das geht nicht innerhalb eines einzelnen Authenticator device.
Aber Du kannst natürlich für jeden User ein solches device anlegen und dann pro Benutzer prüfen, ob der jeweilige Code passt.

Im Eingangsbeitrag ist ein Beispiel für eine benutzerbezogene Prüfung in einem allowed-device aufgeführt.