[INFO] Authentifizierungs-Server (work in progress)

sf3978

IPPF-Promi
Mitglied seit
2 Dez 2007
Beiträge
8,014
Punkte für Reaktionen
28
Punkte
48
Im Anhang ein Patch für einen einfachen, leichtgewichtigen und ausbaufähigen Authentifizierungsserver, für die FritzBox (mit Freetz).
Code:
2976  2849 root     S      980   [B]3%   0%[/B] [B]fbcauth[/B] [I]root admin freetz[/I]
Die Passwörter werden als Argumente zum binary, angegeben.

EDIT:
Kleine Ergänzungen: Der Port auf dem der Server lauscht ist nicht mehr hardcodiert. Er wird mit dem 1. Argument (argv[1]) übergeben:
Code:
serverinfo.sin_port = htons(atoi([B]argv[1][/B]));
Code:
2960 root       980 S    fbcauth [B]33333[/B] freetz root admin
Im syslog wird jetzt auch der Port der Servers und die IP Adresse des Clienten eingetragen:
Code:
Sep 12 08:38:06 fritz user.info syslog: fbcauth : the authentication was successful! Server port: 33333; Client IP address: 192.168.122.33
Sep 12 08:38:11 fritz user.info syslog: fbcauth : the authentication was n o t successful! Server port: 33333; Client IP address: 192.168.122.33

EDIT 2:
Die Passwörter müssen mindestens 6 Zeichen lang sein und sollen maximal 8 Zeichen lang sein, denn mehr als 8 Zeichen werden nicht berücksichtigt:
Code:
if((strlen(argv[j])>=6) && (i = strncmp(argv[j],position,8))==0)
In die Datei "/tmp/fbcauth.aut" wird jetzt auch die IP Adresse des Clienten geschrieben. Das eingegebene Passwort wird auch eingetragen, so wie es eingegeben wird, richtig oder falsch:
Code:
/var/mod/root # cat /tmp/fbcauth.aut
192.168.122.33 admin12

EDIT 3:
Der neue Patch beinhaltet ein einfaches iptables-Skript (setzt die default policy der FORWARD chain auf DROP), iptables-Regeln und andere Kommandos im Quelltext:
Code:
for(m=0,j=5;j<=6;j++)
      {
    if((strlen(argv[j])>=6) && (i = strncmp(argv[j],position,8))==0)
    {
    strcat(transmit,"authentication was successful!");
    syslog(LOG_INFO, "%s : the authentication was successful! Server port: %s; Client IP address: %s",\
    argv[0], argv[1], client_ip);
    system(" /usr/sbin/iptables -D FORWARD -p tcp -s \"$(cat /tmp/fbcauth.aut 2>/dev/null)\" \
    -d 0/0 -m multiport --dports 80,443 -j ACCEPT ");
    system(" /usr/sbin/iptables -A FORWARD -p tcp -s \"$(cat /tmp/fbcauth.aut 2>/dev/null)\" \
    -d 0/0 -m multiport --dports 80,443 -j ACCEPT ");
    m=1;
    break;
    }
      }
Code:
if(m==0 && (i = strncmp(argv[2],position,6))!=0 && (i = strncmp(argv[3],position,6))!=0 && \
    (i = strncmp(argv[4],position,6))!=0)
      {
      strcat(transmit,"authentication was not successful!");
      syslog(LOG_INFO, "%s : the authentication was n o t successful! Server port: %s; Client IP address: %s",\
      argv[0], argv[1], client_ip);
      /* ab hier eintragen */
      fp=fopen("/tmp/fbcauth.aut","w+");
      fputs(client_ip,fp);
      fputs("\t",fp);
      fputs(position,fp);
      fclose(fp);
      fp=NULL;
      /* ende eintragen */
      }
Code:
if((i = strncmp(argv[2],position,6))==0)
    {
    strcat(transmit,"logout was successful!");
    syslog(LOG_INFO, "%s : the logout was successful! Server port: %s; Client IP address: %s",\
    argv[0], argv[1], client_ip);
    /* hier eintragen */
    system(" /usr/sbin/iptables -D FORWARD -p tcp -s \"$(cat /tmp/fbcauth.aut 2>/dev/null)\" \
    -d 0/0 -m multiport --dports 80,443 -j ACCEPT ");
    /* ende eintragen */
    }
Code:
if((i = strncmp(argv[3],position,6))==0)
    {
    strcat(transmit,"flush was successful!");
    syslog(LOG_INFO, "%s : the flush was successful! Server port: %s; Client IP address: %s",\
    argv[0], argv[1], client_ip);
    /* hier eintragen */
    system(" /usr/sbin/iptables -F FORWARD ");
    /* ende eintragen */
    }
Code:
if((i = strncmp(argv[4],position,6))==0)
    {
    strcat(transmit,"rules setup was successful!");
    syslog(LOG_INFO, "%s : the rules setup was successful! Server port: %s; Client IP address: %s",\
    argv[0], argv[1], client_ip);
    /* hier pfad fuer script eintragen */
    system(" sh /tmp/ipt.rul ");
    /* ende eintragen */
    }
 

Anhänge

  • fbcauth.jpeg
    fbcauth.jpeg
    60.9 KB · Aufrufe: 107
  • fbcauth_ok.jpeg
    fbcauth_ok.jpeg
    57.6 KB · Aufrufe: 92
  • fbcauth_nok.jpeg
    fbcauth_nok.jpeg
    58.4 KB · Aufrufe: 82
  • fbcauth.patch.txt
    6.6 KB · Aufrufe: 11
  • new_fbcauth.patch.txt
    8.9 KB · Aufrufe: 5
Zuletzt bearbeitet:
Dumme Frage: Was kann man damit z.B. anstellen? Internet-Zugang nur für autorisierte Benutzer beispielsweise?
 
Ja, oder eine Anwendung (z. B. den Prosody-Server auf meiner Box, etc.) starten und stoppen.
 
Frage an die modlibrc-, rc.*-Script- und Freetz-WEB-IF-Experten:
Es handelt sich um einen modifizierten trunk. Es wäre auch nicht schlimm, wenn ich keine Antwort/Hilfe bekommen würde, denn ohne Freetz-WEB-IF funktioniert Alles bestens.;)
Müssen rc.*-Scripte und/oder *.cgi-Dateien registriert werden?

Ich habe für fbcauth ein Freetz-WEB-IF (siehe Anhang) erstellt. Der Start funktioniert leider nicht, denn das rc.fbcauth hängt sich im WEB-IF auf:
Code:
1258 root      1552 S    httpd -i -p 81 -c /mod/etc/webcfg.conf -h /usr/mww/ -r Freetz
 1259 root      1580 S    /bin/sh service
 1277 root      1580 S    /bin/sh service
 1278 root      1528 S    sed -e     s/&/\&amp;/g    s/</\&lt;/g    s/>/\&gt;/g    s/'/\'/g    s/"/\&quot;/g
 1283 root      1552 S    /bin/sh /mod/etc/init.d/rc.fbcauth start
 1284 root       972 S    fbcauth 33222 logout flush7 rules3 freetz admin1
Mit der Konsole kann ich das rc.fbcauth-Script aber starten und stoppen:
Code:
root@fritz:/var/mod/root# sh -x /etc/init.d/rc.fbcauth
+ DAEMON=fbcauth
+ . /etc/init.d/modlibrc
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/mod/sbin:/mod/bin:/mod/usr/sbin:/mod/usr/bin
+ export LD_LIBRARY_PATH=/mod/lib:/mod/usr/lib
+ : fbcauth
+ : fbcauth
+ : fbcauth_ENABLED
+ : /mod/etc/fbcauth.conf
+ : fbcauth
+ : /var/run/fbcauth.pid
+ [ -n fbcauth ]
+ modlib_loadconfig
+ local CONF_FILE=/mod/etc/conf/fbcauth.cfg
+ [ ! -r /mod/etc/conf/fbcauth.cfg ]
+ . /mod/etc/conf/fbcauth.cfg
+ export FBCAUTH_ENABLED=yes
+ export FBCAUTH_OPTIONS=33222 logout flush7 rules3 freetz admin1
+ modreg cgi fbcauth FBCauth
+ modlib_start yes
+ local DAEMON_ENABLED=yes
+ [ yes == no ]
+ [ yes == inetd -a ! -x /etc/init.d/rc.inetd ]
+ modlib_check_running
+ [ -n  ]
+ [ -x /etc/init.d/rc.inetd ]
+ echo fbcauth_ENABLED
+ tr [:lower:]- [:upper:]_
+ eval echo $FBCAUTH_ENABLED
+ echo yes
+ [ yes == inetd ]
+ [ -n  ]
+ local fn=/var/run/fbcauth.pid
+ [ ! -s /var/run/fbcauth.pid ]
+ return 3
+ start
+ modlib_startdaemon fbcauth 33222 logout flush7 rules3 freetz admin1
+ pidof fbcauth
+ echo -n Starting fbcauth ...
Starting fbcauth ... + config
+ :
+ env - PATH=/sbin:/bin:/usr/sbin:/usr/bin:/mod/sbin:/mod/bin:/mod/usr/sbin:/mod/usr/bin fbcauth 33222 logout flush7 rules3 freetz admin1
+ echo 1891
+ return 0
+ exit 0
Code:
1889 root      1556 S    sh -x /etc/init.d/rc.fbcauth
1891 root       972 S    fbcauth 33222 logout flush7 rules3 freetz admin1
Code:
root@fritz:/var/mod/root# cat /var/run/fbcauth.pid
1891
Hier mein rc.fbcauth-Script:
Code:
#!/bin/sh

DAEMON=fbcauth
. /etc/init.d/modlibrc

start() {
      modlib_startdaemon $DAEMON $FBCAUTH_OPTIONS &
      echo "$(pidof fbcauth)" > /var/run/fbcauth.pid
    }

case $1 in
    ""|load)
        modreg cgi $DAEMON FBCauth
        modlib_start $FBCAUTH_ENABLED
        ;;
    unload)
        modunreg cgi $DAEMON
        modlib_stop
        ;;
    start)
        modlib_start
        ;;
    stop)
        modlib_stop
        ;;
    restart)
        modlib_restart
        ;;
    status)
        modlib_status
        ;;
    *)
        echo "Usage: $0 [load|unload|start|stop|restart|status]" 1>&2
        exit 1
        ;;
esac

exit 0
Hier die fbcauth.cgi-Datei:
Code:
#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin
. /usr/lib/libmodcgi.sh

check "$FBCAUTH_ENABLED" yes:auto "*":man

sec_begin '$(lang de:"Starttyp" en:"Start type")'

cat << EOF
<p>
<input id="auto" type="radio" name="enabled" value="yes"$auto_chk><label for="auto"> $(lang de:"Aktiviert" en:"Enabled")</label>
<input id="manual" type="radio" name="enabled" value="no"$man_chk><label for="manual"> $(lang de:"Deaktiviert" en:"Disabled")</label>
</p>
<font size="2">
$(lang de:"FBCauth erm&ouml;glicht Client-Authentifizierung." en:"FBCauth allows client authentication.")
</font>
EOF
sec_end

sec_begin '$(lang de:"Konfiguration" en:"Configuration")'

cat << EOF
<font size="1">
$(lang de:"(Port, Logout-Passwort, Flush-Passwort, Regeln-Passwort, 1. Passwort, 2. Passwort)" en:"(Port, Logout password, Flush password, Rules password, 1st Password, 2nd Password)")
</font>
<p>$(lang de:"Optionen" en:"Options"): &nbsp;<input type="text" name="options" size="65" maxlength="64" value="$(html "$FBCAUTH_OPTIONS")"></p>
$(lang de:"Mehr Infos: <a TARGET=\"_blank\" href=\" http://www.ip-phone-forum.de/showpost.php?p=1604520&postcount=1\">hier</a>" en:"more information: <a TARGET=\"_blank\" http://www.ip-phone-forum.de/showpost.php?p=1604520&postcount=1\">here</a>")</font><br />
EOF
sec_end

sec_begin '$(lang de:"Eingeloggte user" en:"Users logged in")'

cat << EOF
<p>
<textarea id="users" style="width: 800px; " name="users" rows="20" cols="7" wrap="off">$(html "$(cat /proc/net/arp)")</textarea>
</p>
EOF
sec_end
Was ich auch nicht verstehe, warum wird in der mod.log, ein Zusammenhang zwischen der fbcauth und der rc.ndyndns, hergestellt?:
Code:
[COLOR="Red"]Starting fbcauth[/COLOR] ... Usage: /etc/init.d/[COLOR="Red"]rc.ndyndns[/COLOR] [start|start_nodaemon|stop|restart|status]
Eine zusätzliche Frage. Warum bleibt der Prozess:
Code:
1889     1 root     S     1556   5%   0% [COLOR="Red"]sh -x /etc/init.d/rc.fbcauth[/COLOR]
aktiv?
 

Anhänge

  • fbcauth_FREETZ-WEB-IF.jpeg
    fbcauth_FREETZ-WEB-IF.jpeg
    123.5 KB · Aufrufe: 48
Ändern der Zeile:
Code:
[COLOR="Red"]modlib_startdaemon[/COLOR] $DAEMON $FBCAUTH_OPTIONS &
in
Code:
fbcauth $FBCAUTH_OPTIONS & [COLOR="Red"]>/dev/null 2>&1[/COLOR]
im rc.fbcauth-Script, bewirkt Folgendes:

-nach dem Start/Reboot der Box ist fbcauth aktiv (running)
-kein aktiver sh-Prozess mehr
-keine (komische) Einträge in der mod.log
-fbcauth kann benutzt werden

Stoppen des fbcauth mit dem Freetz-WEB-IF funktioniert, aber das Starten mit dem Freetz-WEB-IF funktioniert dann nicht mehr (Hänger).
Start mit "sh -x /etc/init.d/rc.fbcauth" funktioniert einwandfrei. Auch kein aktiver sh-Prozess mehr. fbcauth kann benutzt werden.

EDIT:
Code:
[COLOR="Red"]modlib_startdaemon[/COLOR] $DAEMON $FBCAUTH_OPTIONS & [COLOR="Red"]>/dev/null 2>&1[/COLOR]
hat nicht funktioniert.

EDIT 2:
Ich glaube zu wissen was es mit dem (komischen) Eintrag in der mod.log auf sich hat. Hier hat mod.log ein Fehler gemacht:
Falsch:
Code:
Starting fbcauth ... Usage: /etc/init.d/rc.ndyndns [start|start_nodaemon|stop|restart|status]
... und so wäre es richtig gewesen (2 Zeilen statt Alles in eine Zeile):
Code:
Starting fbcauth ... 
Usage: /etc/init.d/rc.ndyndns [start|start_nodaemon|stop|restart|status]
... und fbcauth hängt ...
 
Zuletzt bearbeitet:
mod.log hat keinen Fehler gemacht. Du startest fbcauth im Hintergrund. Da ist doch klar, dass die Ausgaben durcheinander kommen.
Ist das nicht als Daemon gedacht?

MfG Oliver
 
OK, dann hat mod.log kein Fehler gemacht.;) Das mit mod.log war ja nur ein Schönheitsfehler. Wenn ich fbcauth ohne "modlib_startdaemon" starte, dann gibt es von fbcauth, auch kein Eintrag im mod.log. Das "Problem" ist der Hänger vom WEB-IF, und den gibt es wenn ich fbcauth im Hintergrund, als auch im Vordergrund starte. fbcauth läuft als daemon.
 
Hm, die Frage kam wohl nicht ganz raus:
Warum willst du fbcauth im Hintergrund starten?

MfG Oliver
 
...
Warum willst du fbcauth im Hintergrund starten?
...
Ich will fbcauth nicht unbedingt im Hintergrund starten. Ich habe das so über die Konsole gemacht und es funktioniert. Mit dem WEB-IF habe ich beides probiert, VG und HG. Es funktioniert aber nicht und ich weiß noch nicht was ich falsch mache. Kommt Zeit, kommt Rat.;)
 
Ich will fbcauth nicht unbedingt im Hintergrund starten.
Warum machst du es dann?

Wenn fbcauth ein Daemon ist und korrekt in den Hintergrund geht, dann darf das nicht passieren. Also bleibt wohl ein FD offen. Deshalb sollte es funktionieren, wenn du die nach /dev/null umleitest.
Code:
modlib_startdaemon $DAEMON $FBCAUTH_OPTIONS >/dev/null 2>&1
MfG Oliver
 
OK, danke für den Hinweis. Ich werde das am kommenden Wochenende nochmal gründlich testen.
 
fbcauth bleibt eine Konsolenanwendung und das ist auch gut so.;) "start", stop", "restart" und "Übernehmen" funktionieren nicht, im WEB-IF.
Die Konfiguration und Anwendung ist einfach. Mehr als 3 Argumente sind nicht erlaubt bzw. werden nicht ignoriert (Eintrag nach syslog und exit):
Code:
root@fritz:/var/tmp/flash/mod# fbcauth -h
FBCauth version 0.1 09/25/2010
                        fbcauth - Usage:
                        fbcauth <port> <path + log file> <path + passwords file>
fbcauth kann aus der Datei "rc.custom" gestartet werden. Z. B.:
Code:
fbcauth 33444 /var/media/ftp/uStor01/fbcauth/fbcauth.log /var/media/ftp/uStor01/fbcauth/fbcauth.pwd &
Die log-Datei sieht so aus:
Code:
root@fritz:/var/mod/root# cat /var/media/ftp/uStor01/fbcauth/fbcauth.log
192.168.###.##5,        freetz,         Sat Sep 25 18:44:07 2010
192.168.###.##5,        rthrthrjzjtzj,          Sat Sep 25 18:44:12 2010
192.168.###.##5,        logout,         Sat Sep 25 18:44:40 2010
192.168.###.##5,        grergerg,               Sat Sep 25 18:55:22 2010
192.168.###.##5,        logout,         Sat Sep 25 18:55:38 2010
Es werden auch Einträge nach syslog gemacht. In der Passwort-Datei, wird je Zeile, ein Passwort 6 bis 8 Zeichen lang (> 8 beim login wird ignoriert) eingetragen. Die Passwörter "logout", "flush" und "rules" sind hardcodiert. Das iptables-Script und die iptables-Regeln können, falls erforderlich, im Verzeichnis "/tmp" bzw. im Quelltext geändert werden. Der aktuelle Patch ist im Anhang.

EDIT:
Die öffentliche IP-Adresse der Box und die MAC-Adresse des Clienten, werden jetzt auch geloggt. Beim Loggen ich eine Datei auf der Box (persistenter Bereich) in der Datei "/tmp/flash/mod/fbcauth.log", wird auch gespeichert (modsave flash), damit die Logdatei nicht "verschwinden" kann. Mit einem cronjob kann die Logdatei auch per eMail versendet werden bzw. bei einer bestimmten Größe gelöscht werden (begrenzter Speicherplatz auf der FritzBox).
 

Anhänge

  • proper_fbcauth.patch.txt
    10.9 KB · Aufrufe: 2
Zuletzt bearbeitet:
Von der Idee echt genial. Wenn es das im größeren Maststab geben würde wäre es echt ne feine Sache. So mit richtiger User Authentifizierung, Vorratsdatenspeicherung, usw. Trotzdem dickes Danke! :)

Leider blicke ich nicht mehr ganz durch welchen Patch ich jetzt nehmen muss damit es auf meienr 7270 läuft. Iptables habe ichauch schon von Natur aus mit ins Image gepackt.

Ich habe den new_fbcauth Patch genommen aber ich finde es nirgends im System. Eingespielt mit patch -p 0 < new_fbcauth.patch .
 
Versuch es mit dem aktuellen Patch, aus dem Anhang dieses Beitrags. Hast Du den Eintrag in die "make/Config.in" und in der "make/external.in" gemacht?
Code:
source make/fbcauth/Config.in
Code:
source make/fbcauth/external.in
FBCauth ist eine Konsolenanwendung. Es gibt kein WEB-IF in Freetz. Ich starte FBCauth aus der rc.custom:
Code:
fbcauth 55144 /var/media/ftp/uStor01/fbcauth/fbcauth.log /var/media/ftp/uStor01/fbcauth/fbcauth.pwd &
Den Port und die Pfade kannst an deine Bedürfnisse anpassen.
Mach vor der Freetz-Image-Erstellung ein "make fbcauth-precompiled", als test und schau im Ordner packages, ob das binary und das iptables-Skript vorhanden sind. Hast Du in der iptables FORWARD chain, für deine Box, schon irgendwelche Regeln eingetragen?
 

Anhänge

  • fbcauth_101010.patch.txt
    11.3 KB · Aufrufe: 4
Zuletzt bearbeitet:
Nöö ist in der Config.in nicht drin. An welche Stelle m üsste es denn? Dachte das macht der Patch...
 
...
An welche Stelle m üsste es denn? Dachte das macht der Patch...

Nein, der Patch macht das nicht. Wäre auch nicht sinnvoll, denn dann wäre der Patch evtl. nur für eine trunk-Version gültig/brauchbar. Die Dateien "make/Config.in" und "make/external.in" können sich jederzeit (d. h. mit einer neuen trunk-Version) ändern (siehe Timeline in www.freetz.org). In der "make/Config.in" kann der Eintrag im menu "Testing" (in alphabetischer Reihenfolge) gemacht werden. Evtl. kannst Du auch eine neues menu, z. B. "Privat Packages" anlegen.
 
Ahh ok danke dir für die Erklärung. Ich brauch aber nur eins von beiden eintragen oder? External nutze ich ja so nicht. Ich probiere das nochmal aus und gebe Rückmeldung...

Ach jetzt hab ichs gerafft. Das taucht dann im Menuconfig "Menü" auf. :) Feine Sache! Image werd ich später mal flashen...
 
Zuletzt bearbeitet:
Hey,

also ich glaube der findet das Archiv nicht was er nachläd.
Code:
root@linux:~/.dev/7270-freetz-trunk-201010$ make fbcauth-precompiled
mkdir -p packages/target-mipsel_uClibc-0.9.29/fbcauth-0.1/root
if test -d make/fbcauth/files; then tar -c -C make/fbcauth/files --exclude=.svn . | tar -x -C packages/target-mipsel_uClibc-0.9.29/fbcauth-0.1 ; fi
cd make/fbcauth && \
        tar -vczf fbcauth-0.1.tar.gz fbcauth-0.1/{fbcauth.c,Makefile}
fbcauth-0.1/fbcauth.c
tar: fbcauth-0.1/Makefile: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
make: *** [fbcauth] Error 2
root@linux:~/.dev/7270-freetz-trunk-201010$

In iptables habe ich auch schon forward Regel drin!
 
Schau mal im Verzeichnis "7270-freetz-trunk-201010/make" ob es dort das Verzeichnis "fbcauth" gibt und wenn ja, dann mit welchem Inhalt.
Warum heißt das trunk-Wurzelverzeichnis bei dir, "7270-freetz-trunk-201010" ?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.