[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

Erweiterungsvorschlag:
Für das manuelle Übertragen des Schlüssels sollten wir bei GET noch die Funktion GET SecretKey hinzufügen.

pandabear_de

#31
Anbei mein Vorschlag für die Commandref.html

(überholt - Anhang gelöscht)

pandabear_de

Eine Frage an die Versierteren...

Im Notify Script von Telegram bekomme ich immer Fehler, wenn ich nur Ein-Wort-Befehle ohne Token nutze. Dann gibt es nämlich kein $EVTPART2.

Workaround ist es Ein-Wort-Befehle (bei mir z.B. 'Bahn' für aktuelle Verspätungen oder Test hier im Beispiel) immer um einen Zusatz zu ergänzen z.B. 'Test egal')


Wie geht es Besser?

Jetzt konkret Teile aus meinem Notify Script:


...
  my $GivenToken = substr $EVENT, -6;
  my $GAuthResult = fhem("get GoogleAuth check $GivenToken");
...
   if ($EVTPART1 eq 'Licht') {
      if ($GAuthResult eq '1') {
        if ($EVTPART[b]2[/b] eq 'an') {
          #fhem("set KNX_0004 on");
          fhem("set teleBot send @" . $msgpeer . " Licht an");
        }
        elsif ($EVTPART[b]2[/b] 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 ($EVTPART1 eq 'Test') {
      fhem("set teleBot send @" . $msgpeer . " Echo Test");
    }
...


Usage Telegram
Licht an 123456
Ergebnis Licht an wie erwartet

Aber bei Telegram
Test
kommt keine Antwort

aber mit Ergänzung
Test 123456
kommt 'Echo Test' als Antwort, wie erwartet

Fehlerhinweis bei 'Test' im Log

ERROR evaluating my $EVENT='msgText: Test';my $TYPE='TelegramBot';my $EVTPART0='msgText:';my $EVTPART1='Test';my $SELF='ChatMessage.notify';my $NAME='teleBot';{

ChatMessage.notify return value: Global symbol "$EVTPART2" requires explicit package name at (eval 4117) line 11.
Global symbol "$EVTPART2" requires explicit package name at (eval 4117) line 15.

Die zitierten Stellen mit $EVTPART2 sind die aus 'Licht an'.

Danke für Eure Unterstützung.

Gruß
Jakob

CoolTux

Du könntest Deine EVTPARTs selber erstellen. Sprich EVENT selber zerlegen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

betateilchen

#34
Das Arbeiten mit den specials $EVTPARTx ist generell bäh...

Aber in Deinem gesamten Konstrukt würde ich Dir ohnehin empfehlen, das Token nicht ans Ende einer Nachricht zu setzen, sondern an den Anfang.
Das erleichtert die Verarbeitung erheblich, weil Du dann immer genau weißt, an welcher Stelle das Token zu finden ist.
Bei Deiner Lösung kann das Token nämlich auch in $EVTPART2 stehen, deshalb kann man da nicht einfach eine Prüfung einbauen.

In folgendem Lösungsvorschlag passiert folgendes:


  • aus $EVENT wird ein echtes Array erzeugt.
  • das Token befindet sich im Element 0
  • die Elemente 1  und 2 werden auf Existenz geprüft und falls nicht vorhanden auf "" gesetzt, damit keine perl warnings auftreten.

Probier mal, ob Du damit weiterkommst.



...
  my @evtparts = split(" ",$EVENT);
     $evtparts[1] //= "";
     $evtparts[2] //= "";
  my $GAuthResult = fhem("get GoogleAuth check $evtparts[0]");
...
  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");
  }
...

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

CoolTux

Sag Mal mein lieber Udo, hast oder hattest Du Urlaub? Du wirst so entspannt und gelassen  ;D


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

pandabear_de

Danke betateilchen für den Vorschlag.

Das mit dem Token immer an der ersten Stelle passt nicht ganz zum Plan.

Befehle die in die Steuerung des Hauses eingreifen sollen mit Token und andere z.B. Spritpreise oder Bahnverspätungen auch ohne Token möglich sein.
Daher die letzte Stelle, damit ich einfach immer die letzten 6 Zeichen prüfen kann.
my $GivenToken = substr $EVENT, -6;

Damit wäre dies doch die Anpassung. Sieht bei mir im Log gut aus.

...
my @evtparts = split(" ",$EVENT);
     $evtparts[1] //= "";
     $evtparts[2] //= "";
my $GivenToken = substr $EVENT, -6;
my $GAuthResult = fhem("get GoogleAuth check $GivenToken");
...
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");
    }
}

betateilchen

Zitat von: pandabear_de am 15 Januar 2017, 02:26:40
Für das manuelle Übertragen des Schlüssels ...

Meinst Du wirklich, dass irgendjemand dieses Ding manuell eintragen möchte?
Ich zeige jetzt den Link und den Key direkt im device an (siehe screenshot)

Bei den readings entfällt ab sofort die qr_url, weil man die dort nicht mehr braucht, wenn man den Link auf der Geräteseite hat.

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

betateilchen

Zitat von: CoolTux am 15 Januar 2017, 12:30:27
Sag Mal mein lieber Udo, hast oder hattest Du Urlaub?

Dieses Jahr noch nicht.

Zitat von: CoolTux am 15 Januar 2017, 12:30:27
Du wirst so entspannt und gelassen

Ich bin immer entspannt und gelassen.

Wer mich lange genug persönlich kennt, wird das auch bestätigen.
Bei vielen Menschen dauert diese Erkenntnis nur leider sehr sehr lange.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#39
Das Modul besitzt jetzt auch eine commandref Doku in Englisch. Auf Deutsch habe ich verzichtet.

Die modulspezifische Hilfe kann beispielsweise mit "help GoogleAuth" aufgerufen werden.




Neuer set Befehl: "set <name> revoke"

Damit wird der vorhandene key für ungültig erklärt. Sinn ist, ein versehentliches Überschreiben eines bestehenden keys durch "set <name> new" zu vermeiden. Beim Versuch, ein "set ... new" bei einem bereits vorhandenen key auszuführen, erfolgt eine entsprechende Fehlermeldung.




Zitat von: betateilchen am 15 Januar 2017, 12:36:12
Meinst Du wirklich, dass irgendjemand dieses Ding manuell eintragen möchte?
Ich zeige jetzt den Link und den Key direkt im device an

Das sieht so kacke aus, dass die Anzeige des keys jetzt per Attribut ga_showKey ein-/ausschalten kann.
Gleiches gilt für die Anzeige des Links mit dem Attribut ga_showLink (Tipp: der QR Code selbst ist ja schon ein Link)




Ausserdem kann man jetzt noch viel einfacher eine token-Prüfung durchführen:


gAuth(<deviceName>,<token>)


Das erspart den Umweg über fhem(...)
-----------------------
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

Ich habe meinen Entwurf für die CommandRef entsprechend aktualisiert.

betateilchen

Danke, aber Du brauchst für die commandref nichts mehr überarbeiten .
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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

Bei mir habe ich wieder Probleme mit dem Scannen des QRs bekommen.

Ich nutze iPhone mit IOS 10.2

Ich vermute es liegt an den Leerzeichen im Standard-Namen des QRs. Ich kann nämlich den Fehler reporduzieren und wieder bereinigen in dem ich einen ga_labelName ohne Leerzeichen vorgebe.

Hier ein paar Screenshots zum Thema:

betateilchen

Ich kann den Fehler nicht reproduzieren. *grübel*

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