Google Authenticator - Zugänge aus dem Netz besser absichern - neues Modul

Begonnen von pandabear_de, 24 Januar 2017, 21:42:45

Vorheriges Thema - Nächstes Thema

pandabear_de

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
IOS: https://itunes.apple.com/de/app/google-authenticator/id388497605?mt=8

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

Entstehungsgeschichte und Quelle folgender Code-Schnipsel ist hier: 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

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.



riker1

Hallo,

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

Danke VG T
FHEM    5.26.1 Ubuntu 18, FHEM    5.26.1 RPI 3 , Actoren: IT ,Tasmota, ESPEasy,
MAX CUBE, MAX HT, MAX WT, Selbstbau nanoCULs, FS 20,Tasmota, Homematic, FTK, SW. DIM, Smoke,KODI,Squeezebox

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!