[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

weini

Hallo zusammen!

Die Nutzung von Google Authenticator für Telegram finde ich eine geniale Sache, vielen Dank erst einmal für das Modul.

Die Intergration mit dem im ersten Beitrag verlinkten Notify hat mir dagegen nicht so gut gefallen, da einige Features des Telegram Moduls im Notify nachgebildet werden.

Ich habe für meine Zwecke ein alternatives Notify erstellt, das folgende Features hat:

  • Nutzung des Telegram Moduls für Favoriten und Befehle, die nicht explizit über Google Authenticator abgesichert werden sollen. Hier bleibt alles wie gehabt.
  • Dadurch weitere Nutzung von cmdKeyword und cmdFavorites aus dem Telegram Modul.
  • Die Einschränkung der Peers wird unverändert im Telegram Modul via cmdRestrictedPeer konfiguriert. Das Notify wertet diese Infos aus und berücksichtigt sie. Achtung: Es müssen zwingend PeerIds verwendet werden, keine Namen.
  • Die im TelegramBot Modul verwendbaren Befehle werden weiter über das zugehörige "allow" Device festgelegt (Attribut: allowedCommands). Das Notify kümmert sich bewusst nicht um diese Einschränkung. Das bedeutet, dass mit dem zusätzlicher Google Authenticator Token BELIEBIGE Befehle an FHEM geschickt werden können.
  • Für den hier beschriebenen Aufbau ist es sinnvoller, das Google Authenticator Token dem Befehl voranzustellen. So erfolgt im Notify auch die Erkennung, ob authentifiziert werden soll.

Meine Konfigturation sieht nun ungefähr so aus:

TelegramBot

defmod telegramBot TelegramBot <code>
attr telegramBot cmdFavorites fav
attr telegramBot cmdKeyword do
attr telegramBot cmdRestrictedPeer <peerID1> <peerID2>
attr telegramBot cmdReturnEmptyResult 0
attr telegramBot favorites [Fahre los]=trigger  ntf_sayTTS "Fahre jetzt los";;[Komme gleich]=trigger  ntf_sayTTS "Komme gleich";;[Wird später]=trigger  ntf_sayTTS "Es wird leider etwas später";;[Öffne Haustüre]=set Flur_Tueroeffner press;;[Temperaturen]=trigger listTemperatures
...


allowed Device

defmod allowed_telegramBot allowed
attr allowed_telegramBot allowedCommands get,trigger,getstate
attr allowed_telegramBot validFor telegramBot

Die hier aufgeführten Befehle sind ohne zusätzliche Authentifizierung nutzbar.

Notify

defmod ntf_telegramBot notify telegramBot:msgText.* {\
  my $msgpeer = ReadingsVal("telegramBot", "msgPeerId", "");;\
  my @evtparts = split(" ",$EVENT);;\
  \
  # Reading-Namen entfernen\
  shift @evtparts;;\
  # das Token steht vor dem Befehl\
  my $GivenToken = shift @evtparts;;\
  my $FhemCmd = join " ", @evtparts;;\
  my $cmdKeyword = AttrVal("telegramBot", "cmdKeyword", undef);;\
  my $cmdFavorites = AttrVal("telegramBot", "cmdFavorites", undef);;\
  my @favarray;;\
  my $favno;;\
\
  # nur verarbeiten, wenn das Token nur aus Zahlen besteht -> sonst ist es verm. ein reguläres Kommando für das Bot-Modul\
  if ($GivenToken =~ /^\d+$/) {\
    Log3("ntf_telegramBot",4,"ntf_telegramBot: EVENT: $EVENT");;\
    Log3("ntf_telegramBot",3,"ntf_telegramBot: FhemCmd: $FhemCmd");;\
\
    # prüfe ob die Zeichenfolge von eben einen gültigen Token ergibt\
    my $GAuthResult = gAuth("googleAuth",$GivenToken);;\
    Log3("ntf_telegramBot",3,"ntf_telegramBot: googleAuth Token: $GivenToken result: $GAuthResult");;\
\
    # ggf. Favoriten auflösen\
if (substr($FhemCmd, 0, length($cmdFavorites)) eq $cmdFavorites) {\
   $favno = int(substr($FhemCmd, length($cmdFavorites)));;\
   @favarray = split(";;",AttrVal("telegramBot", "favorites", ""));;\
   $FhemCmd = $favarray[$favno-1];;\
       # wenn ein Alias definiert ist, dann den Befehlsteil aus dem Favoriten extrahieren\
       if (index($FhemCmd, "=") >= 0) {\
     $FhemCmd = substr($FhemCmd, index($FhemCmd, "=")+1);;\
   }\
       Log3("ntf_telegramBot",3,"ntf_telegramBot: FhemCmd after favorite substitution: $FhemCmd");;\
}\
\
    #Prüfung, dass der aktuelle peer in der Liste der cmdRestrictPeer ist. Achtung: es wird auf die PeerId geprüft, username funktioniert nicht\
    if ( index(AttrVal("telegramBot", "cmdRestrictedPeer", $msgpeer), $msgpeer) >= 0 and $GAuthResult eq '1') {\
      Log3("ntf_telegramBot",4,"ntf_telegramBot: execute cmd");;\
      fhem($FhemCmd);;\
    }\
  }\
}


In Telegram kommuniziere ich wie folgt:

  • fav1 -> trigger  ntf_sayTTS "Fahre jetzt los"
  • fav4 -> set Flur_Tueroeffner press -> FEHLER, da "set" nicht in allowedCommands
  • 394840 fav4 -> set Flur_Tueroeffner press (jetzt via Notify) -> funktioniert, wenn der Code stimmt  8)
  • natürlich können auch "normale" Befehle ausgeführt werden und nicht nur Favoriten

Der Code fängt sicher nicht alle Sonderfälle ab, wenn z. B. keine Favoriten definiert sind. Im Prinzip sollte das Notify aber mit minimalen Anpassungen übertragbar sein.
Ich hoffe, dass das für andere hilfreich ist.

Das Größte wäre natürlich, wenn Johannes den Google Authenticator direkt im TelegramBot Modul einbinden würde  ;D ;D ;D

Beste Grüße,
weini

betateilchen

Zitat von: weini am 09 Februar 2017, 19:44:16
Für den hier beschriebenen Aufbau ist es sinnvoller, das Google Authenticator Token dem Befehl voranzustellen. So erfolgt im Notify auch die Erkennung, ob authentifiziert werden soll.

Das hatte ich ja für mailcheck auch schon argumentiert, aber man wollte mir nicht glauben, dass ein Token am Anfang einer Nachricht eindeutiger ist und mehr Sinn macht. Bei mir ist nach dem Token zu Beginn noch ein Trennzeichen (=) um die Sache völlig eindeutig zu machen: "Wenn an 7. Stelle ein = steht, ist da ein Token"

Ansonsten finde ich Deinen perl Code im notify ziemlich gruslig, solche Mengen an perl Code gehören m.E. immer in eine Funktion in der 99_myUtils.pm.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

weini

ZitatAnsonsten finde ich Deinen perl Code im notify ziemlich gruslig, solche Mengen an perl Code gehören m.E. immer in eine Funktion in der 99_myUtils.pm.

Das ist natürlich voll beabsichtigt, damit Johannes sich hoffentlich erbarmt, und das vernünftig macht.  ;D

Im Ernst, ich bin leider nicht der Perl Pro....

Queeek

Hi
das Modul funktioniert übrigens auch mit anderen Tools die TOTP unterstützen, grad z.B. mit FreeOTP von Red Hat getestet.
Kann das jemand der Schreibrechte hat mit in der commandref ergänzen?
Danke ;-)
Raspberry Pi mit FHEM
Homematic für Rollsteuerung, Heizungssteuerung, Rauchmelder, Lichtsteuerung usw. (inkl. Bewegungsmelder und Fenster/Türsensoren) + Sonstiges (Baumarksteckdosen, Temperatursensoren ...)

dstegmaier

Hallo zusammen,

ich wollte Mal freundlich anfragen ob jemand das selbe Problem mit dem G-Authenticator und vielleicht eine Lösung hat.

Ich habe wie hier beschrieben den Google Authenticator anstelle des Passworts für meinen WEBPhone Zugang, also fürs Smartphone eingerichtet.

Leider ist der Login immer nur so lange gültig wie der aktuelle Code aus dem Authenticator.

Heißt, wenn ich mich mit einem G-Authenticator Code einlogge, dieser aber aber z.B. nur noch 10 Sekunden gültig ist. Und ich dann z.B. versuche einen anderen Raum aufzurufen, dann werde ich wieder nach dem Passwort gefragt und muss wieder den gerade aktuellen Code eingeben.

Gibt es irgendeine Möglichkeit den Code länger in FHEM gültig zu halten oder den G-Authenticator Code vielleicht stattdessen als 2-Faktor-Authentifizierung zu nutzen, also zusätzlich zu einem festen Passwort?


Danke und Grüße
Dominik

betateilchen

Zitat von: dstegmaier am 04 September 2019, 13:28:01
ich wollte Mal freundlich anfragen ob jemand das selbe Problem mit dem G-Authenticator und vielleicht eine Lösung hat.

Das beschriebene Problem kann ich nicht nachstellen.

Es macht für solche Fragen übrigens mehr Sinn, einen neuen Thread mit einem aussagekräftigen Titel zu eröffnen, anstatt einen ziemlich alten Entwicklungsthread wieder auszugraben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gent

Hier ist schon lange nichts mehr passiert, aber trotzdem habe ich ein aktuelles Problem:

Ich musste FHEM komplett aus einem Backup neu aufsetzen und auch auf einem anderen rPI. Dabei musste ich auch das GoogleAuth Modul neu definieren.

Das Problem ist, dass der QR-Code nicht mehr angezeigt wird, wenn ich ein set new mache.

Die URL für den QR-Code in dem Modul verweist auf https://chart.googleapis.com diese URL scheint bei Google nicht mehr zu existieren

Hat jemand eine Idee, was man da machen kann?

Viele Grüße
Holger
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

gent

Ich konnte hier selber eine Lösung finden. Es gibt eine Drop-In-Replacement Seite für https://chart.googleapis.com namens https://quickchart.io

Dazu musste ich einfach im Modul 98_GoogleAuth.pm

die Zeile

Zitatmy $qr_url        = "[url="https://chart.googleapis.com/chart?cht=qr&chs=$qrsize"."&chl=""]https://chart.googleapis.com/chart?cht=qr&chs=$qrsize"."&chl="[/url];

durch diese hier ersetzen:

  my $qr_url        = "https://quickchart.io/chart?cht=qr&chs=$qrsize"."&chl=";

Vielleicht besteht die Möglichkeit, dass man (oder vielleicht sogar ich) das Modul dahingehend updaten kann?

Würde hier gerne helfen.

Liebe Grüße
Holger
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

betateilchen

Danke für den Hinweis, ich kümmere mich darum.

Es macht aber grundsätzlich mehr Sinn, in solchen (Fehler-)Fällen einen neuen Thread mit einem aussagekräftigen Titel zu eröffnen, anstatt einen ziemlich alten Entwicklungsthread wieder auszugraben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!