[gelöst] Google Authenticator zur Verbesserung der Sicherheit als FHEM Modul

Begonnen von pandabear_de, 14 Januar 2017, 00:42:04

Vorheriges Thema - Nächstes Thema

pandabear_de

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

Zusätzlich möchte ich bei einigen anderen Befehlen (z.B. Heizung an) die Sicherheit mit der Angabe eines One-Time-Passwords (OTP) verbessern. Als OTP Generator habe ich mir den 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   
Dieses Modul prüft nun, ob der Token 123456 gültig ist.


Danke der riesen Hilfe von betateilchen ist jetzt schon ein ganz ansehnliches Modul daraus geworden.


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.


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;
  my $GAuthResult = gAuth("GoogleAuth",$GivenToken);
  #Log3("ChatMessage.notify",4,"googleAuth ChatMessage.notify: result: $GAuthResult");

  if (($msgpeer eq 'Max_Mustermann') || ($msgpeer eq 'Erika_Musterfrau')) {
     if ($evtparts[1] eq 'Licht') {
       if ($GAuthResult eq '1') {
         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!");
       }     
     }
     elsif ($evtparts[1] eq 'Test') {
       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.

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.

Alles aber in der Erprobungsphase!


Verbesserungsvorschläge?


betateilchen

#1
Zitat von: pandabear_de am 14 Januar 2017, 00:42:04
Die Moduldatei (aktuell 99_myUtilsGoogleAuthenticator.pm - siehe Dateianhang)

Eine ganz blöde Idee, ein Modul mit 99_ am Anfang zu benennen. Bitte benennne diese Datei so schnell wie möglich um, meinetwegen in 98_...

Die Idee für ein solches Modul ist allerdings gut.

Sowas macht man übrigens auch nicht:

  $hash->{STATE} = 'active';

Schon gar nicht, wenn man weiter oben im Code

  $hash->{AttrList} = "$readingFnAttributes";

einbaut. Das eine widerspricht dem anderen. Vielleicht solltest Du erst einmal die DevelopmentGuidelines lesen, bevor Du weiter an Deinem Modul schraubst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pandabear_de

Hi,
Danke für den Hinweis. Wie gesagt, ich frickle nur und würde mich über Unterstützung sehr freuen.

Zum Dateinamen
Im Original Thread habe ich die Datei jetzt umbenannt. Hintergrund war, dass ich sie so einfach über die GUI editieren konnte.

Zu der Bearbeitung von Variabeln
Danke für den Hinweis wg RTFM. Die Dokumentation ist so umfangreich, dass ich das nicht alles auf einmal erfassen und verstehen kann. Die von Dir aufgeführten Befehle, hatte ich übrings aus anderen herauskopiert.

Frage: Wie kann ich die aufgeführten Befehle besser schreiben?

betateilchen

Ich bin schon dabei, einmal komplett durch Deinen Modulentwurf zugehen.

Es gibt noch ein paar andere Dinge, die man grundsätzlich besser/einfacher lösen könnte.
FHEM kann z.B. von Haus aus Zufallswerte generieren, die man für die QR Generierung verwenden kann.
Das erspart einem das Editieren der /etc/sudoers

Gib mir mal ein bisschen Zeit, ich werde Dir einen überarbeiteten Modulentwurf schicken.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!


betateilchen

hm... irgendwie gelingt es mir nicht, ein korrektes Token zu bekommen, obwohl das secret korrekt gefunden wird.


2017.01.14 20:18:01 1: DEBUG>set secret_base32: gjrwczlfgm4gmyztha4tsntdgrrdenbtmvstqyjtmnrwgojyg4ywezryge4ggnjzmyztqnzvhe2wkodc
2017.01.14 20:18:27 1: DEBUG>get secret_base32: gjrwczlfgm4gmyztha4tsntdgrrdenbtmvstqyjtmnrwgojyg4ywezryge4ggnjzmyztqnzvhe2wkodc
2017.01.14 20:18:27 1: DEBUG>correct: 883095 given: 313104

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pandabear_de

#6
Mit Deinem secretString schaffe ich es auch nicht.

Ich habe bei mir einen neuen über 'Set GAuth new' erstellt und es funktioniert.

Wichtig ist, dass die Uhr ziemlich genau läuft.

Funktioniert diese Kombi?
Hier für GoogleAuthenticator
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth%3A%2F%2Ftotp%2FFHEM%3Fsecret%3D4c7t4rsstqsmxujempwfvpszlvvxp6evvtnoxshi4xrfqq2bqpks2bfcza32zogymizgeyavvozg54xo

Hier der SecretString für GAuth --> SecretString:
4c7t4rsstqsmxujempwfvpszlvvxp6evvtnoxshi4xrfqq2bqpks2bfcza32zogymizgeyavvozg54xo

betateilchen

#7
Mit den secretBytes aus /dev/urandom funktioniert es jetzt hier auch.

Aber eigentlich will ich darauf nicht zugreifen. Mal schauen, wie ich das noch löse :)


2017.01.14 21:07:38 4: googleAuth: given: 123456
2017.01.14 21:07:38 4: googleAuth: possible 676436 959631 175283
2017.01.14 21:07:38 4: googleAuth: result: -1

2017.01.14 21:08:13 4: googleAuth: given: 175283
2017.01.14 21:08:13 4: googleAuth: possible 959631 175283 553749
2017.01.14 21:08:13 4: googleAuth: result: 1

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#8
Im Anhang eine Version, die fast alle Deine ToDo-Punkte quasi als Abfallprodukte mit abfackelt.

(neuere Version weiter unten im Thread!)

erledigt:

  • Set GAuth new speichert den Schlüssel als inernal value. (Das secret wird im fhem-eigenen keystore gespeichert und von dort auch gelesen.)
  • Get GAuth zieht derzeit noch nicht den internal value. (dto.)
  • Anpassung Modul Namen. (Das Modul heißt nun 98_GoogleAuth.pm.)
  • Option der Ausweitung der gültigen Tokens auf z.B. 3 (time-30, time, time+30)

Offen ist:

  • Anzeige QR Image direkt nach Ausführung in FHEM. (aber es gibt jetzt zumindest einen anklickbaren Link als Ergebnis und die qr-url wird zusätzlich in einem reading gespeichert.)

Achtung: Zusätzlich muss  das Paket Crypt::URandom installiert werden (apt-get install libcrypt-urandom-perl)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Wir sollten uns bitte nicht in zwei Threads verzetteln. Kannst Du das "alt" wieder aus dem Titel nehmen und den anderen Thread vielleicht schließen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pandabear_de

Ja klar, macht ich sofort. Macht absolut Sinn.

Sieht genial aus und super aufgeräumt! Ist jetzt auch für einen Leien besser lesbar. DANKE!


Habe bei mir gerade noch einen Defekt gefunden... Ich komme beim Link auf eine 404 Seite. Erst wenn ich nach dem markierten Fragezeichen in der URL im Browser ein Leerzeichen rein mache und dieses direkt wieder lösche funktioniert es.

Wenn ich den Link von FHEM in ein Texteditor kopiere, sehe ich ein CR/Linefeed an der Stelle.

https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth%3A%2F%2Ftotp%2FFHEM%20Authentication%20GoogleAuth%3Fsecret%3D

betateilchen

Das mit dem Link schau ich mir an. Wenn ich mit der rechten Maustaste auf den Link klicke und "in neuem Tab öffnen" auswähle, hat es bisher immer funktioniert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

pandabear_de

mmm... Ich hatte direkt mit linker geöffnet.
Aber jetzt funzelt es mit beiden Tasten... Verstehe ich nicht, aber ist so... Mal beobachten.

betateilchen

Zitat von: pandabear_de am 14 Januar 2017, 22:29:53
Wenn ich den Link von FHEM in ein Texteditor kopiere, sehe ich ein CR/Linefeed an der Stelle.

WELCHEN Link kopierst Du?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!