Fehlgeschlagene Loginversuche protokollieren

Begonnen von rx, 02 Juli 2014, 22:21:12

Vorheriges Thema - Nächstes Thema

rx

Um fehlgeschlagene Loginversuche zu protokolllieren habe ich eine Änderung an 01_FHEMWEB.pm im FHEM-Verzeichnis vorgenommen (als Perl-Noob).

Zeile ca. 352:

    if(!$pwok) {
      my $msg = AttrVal($FW_wname, "basicAuthMsg", "Fhem: login required");
      print $c "HTTP/1.1 401 Authorization Required\r\n",
             "WWW-Authenticate: Basic realm=\"$msg\"\r\n",
             $FW_headercors,
             "Content-Length: 0\r\n\r\n";

      #######################################################################################################################
      if ($secret ne "")
      {
        Log3 $FW_wname, 1, "Password error for $name -> ".decode_base64($secret);
        system("echo 'Subject: fhem: Password-Fehler bei $name\n\n".decode_base64($secret)."' | sendmail email\@provider.de");
      }
      #######################################################################################################################

      delete $hash->{CONTENT_LENGTH};
      delete $hash->{BUF};
      return;

Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

Ich79

Hi!
An sich eine gute Idee. Ich würde aber vorschlagen das mit "Hausmitteln" zu machen. Ich habe in für mein WEB das Attribut basic auth so definiert:

attr WEB basicAuth { VerifyLogon($user, $password); }

Dazu habe ich eine separate 99_myAuthenticationUtils die nichts anderes macht als die Authentifizierung. Damit kann ich gefahrlos meine 99_myUtils.pm und fhem.cfg mit Freunden teilen ohne mein Kennwort preis zu geben. In der Methode VerifyLogon kann ich dann auch das Loggin machen.
Damit wärst Du modifikationsfrei und hast das Gleiche erreicht.

Viele Grüße
Boris
Fritz!Box 7490 mit FHEM 5.6 und HM-CFG-USB-2 (hmland)
AVM: 1x Fritz!Powerline546E
HM: 6x HM-CC-RT-DN / 2x HM-Sec-RHS / 1x HM-WDS40-TH-I-2 / 2x HM-Sec-SC-2 / 1x HM-LC-Sw4-Ba-PCB

rx

Super Tipp und natürlich viel eleganter - fein!
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

rx

#3
Da ich von Perl keine Ahnung habe und ich via Google nichts gefunden habe.

Ich musste bei mir in die fhem.cfg die Zeile ohne ";" eintragen:


attr WEB basicAuth { VerifyLogon($user, $password) }


Und wie sieht bei dir die Funktion VerifyLogon aus? Würdest du die hier posten?

Und gibt es eine Chance in der Funktion VerifyLogon an die IP-Adresse des Rechners zu kommen, der sich falsch authentifiziert hat?


Danke!
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

Ich79

Moin!
Jau, kann ich Dir geben, aber ich mache das Logging selbst nicht in FHEM. Ich nutze dafür meine Apache Logs. Ich habe einen Reverse Proxy und nur der sieht die externen IP's. Dennoch kann ich Dir mal ein Beispiel für die Methode geben:

# start-of-template
package main;

use strict;
use warnings;
use POSIX;

sub myAuthenticationUtils_Initialize($$) {
my ($hash) = @_;
}

sub VerifyLogon($$@) {
my %users = (
'USER1' => 'PASSW1',
'USER2' => 'PASSW2'
);
my ($user, $pass) = @_;
my $rightpass = $users{$user};
return $rightpass eq $pass;
}

# behind your last function, we need the following
1;
# end-of-template


USER1 / PASSW1 usw sind natürlich ersetzt.
Ich habe das nur ausgelagert um eine klare Trennung zu haben und weil meine Madamme natürlich einen seperaten Zugang bekommen hat. Ich wollte kein zweites WEB device oder anderen Port, usw. Darin kannst Du aber das Logging auch einbauen.

VG!
Fritz!Box 7490 mit FHEM 5.6 und HM-CFG-USB-2 (hmland)
AVM: 1x Fritz!Powerline546E
HM: 6x HM-CC-RT-DN / 2x HM-Sec-RHS / 1x HM-WDS40-TH-I-2 / 2x HM-Sec-SC-2 / 1x HM-LC-Sw4-Ba-PCB

rx

Hey, vielen Dank für dein Skript! Vielleicht kann noch jemand beisteuern, wie ich innerhalb dieses Skriptes auf die Variable mit der IP-Adresse des Besuchers zugreifen kann.
Innerhalb von 01_FHEMWEB.pm gelingt mir dies mit der Variable $name. Aber wie kann ich innerhalb dieser Funktion auf $name zugreifen?

Vielleicht hat ja jemand von den Profis eine Idee - würde mich sehr freuen!
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

rx

Ja, witzig eigentlich. Heute nochmal schnell geschaut und dann die Lösung gefunden, um auch die IP-Adresse des Aufrufers zu protokollieren:

fhem.cfg:
attr WEB basicAuth { VerifyLogon($user,$password,$name) }

99_basicAuth.pm:

##############################################
package main;

#use strict;
use warnings;
use POSIX;
use Time::HiRes qw(gettimeofday);

sub
VerifyLogon($$$)
{
#
#  Log3 "99_basicAuth.pm", 1, "Enter logon";
    my ($username, $password, $name) = @_;
#    Log3 "99_basicAuth.pm", 1, "$username $password";

    if ("$username" eq "frank" && "$password" eq "xxxxxxxxxxxxxxxxxxxxx")
    {
#       Log3 "99_basicAuth.pm", 1, "true";
        return true;
    }
    else
    {
        Log3 "99_basicAuth.pm", 1, "Passwort-Fehler ($username/$password/$name)";
    }
}

1;
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

rx

Update:

Mit der Einführung des Moduls 96_allowed.pm muss der o.g. Code etwas angeändert werden und zwar lautet die Variable für die IP-Adresse nicht mehr $name, sondern jetzt

           $aName

D.h. der entsprechende Aufruf in fhem.cfg muss so aussehen:

attr allowed_WEB basicAuth { VerifyLogon($user,$password,$aName) }


Grüße
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)

rx

Und heute habe ich dann noch ein kleines Update in Sachen IP-Adresse durchgeführt, die steht nämlich in einer anderen Variable mittlerweile:

fhem.cfg:
attr allowed_WEB basicAuth { VerifyLogon($user,$password,$cl->{PEER}) }
Server started with 1333 defined entities (fhem.pl:27302/2023-03-05 perl:5.028001 os:linux user:root pid:29591)