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;
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
Super Tipp und natürlich viel eleganter - fein!
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!
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!
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!
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;
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
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}) }