Openvpn Benutzer - Log zur Zeiterfassung
-
Hallo,
Ich habe gerade auf Kundenwunsch ein detailliertes Log für den integrierten Openvpn Server erstellt und da ich hier schon viel Hilfe gefunden habe (Hauptsächlich im englischen Bereich) will ich auch mal was beitragen:
Das Log unter "Status -> System Logs -> OpenVPN" liefert zwar alle benötigten Informationen, ist aber sehr bescheiden auszuwerten.
Der Kunde benötigte eine Möglichkeit die LOGON und LOGOFF Events eines Benutzers zu protokollieren und wenn möglich automatisiert auszuwerten bzw. in das Zeiterfassungssystem einlaufen zu lassen.
Dazu muss man nur das "Client Connect / Disconnect" Script etwas abändern:
/usr/local/sbin/openvpn.attributes.sh
#!/bin/sh #+MR # -- Datei in /usr/local/sbin ersetzen #Variablen ovpndatum=`date +%s` ovpnzeit=`date +%D` ausgabe=/var/log/ovpn-userlog.log #Funktionen anmeldung() { /bin/echo "$ovpndatum LOGON $common_name $ovpnzeit $trusted_ip $bytes_recieved $bytes_sent" >> $ausgabe } abmeldung() { /bin/echo "$ovpndatum LOGOFF $common_name $ovpnzeit $trusted_ip $bytes_recieved $bytes_sent" >> $ausgabe } #-MR # Original echo $script_type > /tmp/script if [ "$script_type" = "client-connect" ]; then if [ -f /tmp/$common_name ]; then /bin/cat /tmp/$common_name > $1 /bin/rm /tmp/$common_name fi #+MR anmeldung #-MR elif [ "$script_type" = "client-disconnect" ]; then command="/sbin/pfctl -a 'openvpn/$common_name' -F rules" eval $command /sbin/pfctl -k $ifconfig_pool_remote_ip /sbin/pfctl -K $ifconfig_pool_remote_ip #+MR abmeldung #-MR fi exit 0
Eine Sitzung sieht im Log dann so aus:
1463457626 LOGON tester 01/12/16 80.187.XXX.XXX 1461242850 LOGOFF tester 01/12/16 80.187.XXX.XXX 23918664
Timestamp Status Benutzername Datum(englisch) IP Übertragene Bytes/Sitzung
Das Auswerten der Datei hat die Firma selbst erledigt und einen Azubi erledigen lassen.
Hier die unfertige PHP Datei. Von mir nicht getestet, nur hierher kopiert.$wochentage = array( 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag', ); $monate = array(); for($i = 0; $i < 12; $i++) { $monate[] = date("m", strtotime('-'. $i .' months')); } $tage = array(); for($i = 0; $i < 30; $i++) { $tage[] = date("d", strtotime('-'. $i .' days')); } $jahre = array( '2014', '2015', '2016', '2017', '2018', '2019', '2020', ); $file_content = file_get_contents("/var/log/ovpn-userlog.log"); $file_content_array = explode("\n", $file_content); if (is_array($file_content_array) || is_object($file_content_array)){ $temparr= array(); $userarr= array(); $count = 0; foreach($file_content_array as $line) { $temparr[$count]=explode(" ",$line); $temparr[$count]['0'] = date('h:i:s',$temparr[$count]['0']); $temparr[$count]['3'] = date('d.m.y',strtotime($temparr[$count]['3'])); $userarr[$count]=$temparr[$count]['2']; $count++; } } $userarr=array_values(array_filter(array_unique($userarr,SORT_REGULAR))); $content= '``` '; foreach( $temparr as $level1 ) { foreach($level1 as $level2 => $value ) { $content .= $value; $content .= " "; } $content .= "\n"; } $content .= ' ```'; echo "``` "; #print_r($userarr); #echo"------------------------"; #print_r($temparr); echo " ```"; ?> <title>Openvpn User Log Viewer</title> <form action="logviewer.php" method="POST"> Monat | <select name="DAY">for($i = 0; $i < count($tage); $i++) { print "<option value="$tage[$i]">$tage[$i]</option>\n"; #<option value="volvo">Volvo</option> } ?></select> | Tag | <select name="MONTH">for($i = 0; $i < count($monate); $i++) { print "<option value="$monate[$i]">$monate[$i]</option>\n"; #<option value="volvo">Volvo</option> } ?></select> | Jahr | <select name="YEAR">for($i = 0; $i < count($jahre); $i++) { if ($jahre[$i] == date("Y")){ print "<option selected="" value="$jahre[$i]">$jahre[$i]</option>\n"; } else { print "<option value="$jahre[$i]">$jahre[$i]</option>\n"; } #<option value="volvo">Volvo</option> } ?></select> | Benutzername: | <select name="user">foreach ($userarr as $user) { print "<option value="$user">$user</option>\n"; #<option value="volvo">Volvo</option> } ?></select> | | | | </form> print $content; ?>
PS: Nicht vergessen: um solche Anpassungen muss man sich nach einem Restore selbst kümmern.
-
Hallo,
danke.
Aber:
@Hanswerner:PS: Nicht vergessen: um solche Anpassungen muss man sich nach einem Restore selbst kümmern.
Aus diesem Grund würde ich es für ratsamer halten, ein Script zu schreiben, das das vorhandene OpenVPN-Log auszuwertet. Dieses an dem richtigen Ort gestellt, sollte ein Update überleben.
Das könnte man auch mit dem Paket mailreport aufrufen und per Mail versenden lassen. Allerdings sendet dies nur an die Adresse, die in System: Advanced: Notifications angegeben ist. -
Wäre es an der Stelle für die Firma nicht sinnvoller einen Logserver zu stellen und die Logs der pfSense dorthin zu holen und alles weitere an Nachbearbeitung dann ebenfalls dort zu erledigen? Schon allein aus Gründen der Manipulationssicherheit etc.? Zumindest ist da bei Audits o.ä. bislang immer das Credo gewesen, dass die Logs auf dem System selbst nicht relevant sind, sondern alle an einen Logserver zu senden sind.
Aber das nur am Rande erwähnt trotzdem danke für den Einfall und das Teilen!
-
Es handelt sich dabei um eine kleine Firma mit 2 Leuten + Azubi in der IT - Abteilung, die sich gelegentlich bei Projekten externe Unterstützung holen.
Die Firewall war schon fast komplett aufgesetzt und ich sollte "nur mal schnell" nach Squidguard und openvpn schauen und es dem Azubi erklären.
Ein Zentraler Syslog Server existiert nicht, ich denke der Azubi macht da seine Projektarbeit und die php Datei wird dann der Personalabteilung oder so zur Verfügung gestellt.Ich persönlich hätte solche Infos gleich ins ERP / BDE oder sonstiges System einlaufen lassen. In der Regel haben die ja einfach zu bedienende Datei - Schnittstellen, da muss man nicht groß Programmieren können.
@Viragomann
Ja, so wäre es eigentlich richtig, ist aber dann nicht mehr ganz so Trivial. Du kannst dir sicher denken, wie es um eine IT bestellt ist, die sich bei solchen Fragen Hilfe holt. Entweder fehlt Zeit oder Know How. -
Hört sich an, als ob der Azubi dort die gesamte IT über hat. :)
Leichtsinn, aber mit den Folgen muss eh die Firma leben. -
Ich hab auch mal so angefangen und das war nun wirklich kein schlechter Einstieg in die IT und hat mich zwar nirgendwo zum Spezialisten gemacht, dafür habe ich aber in allen Bereichen mal was zu tun gehabt.
Es hat mir den Weg ins besser bezahlte Berufsleben doch sehr erleichtert auf jede Frage antworten zu können und zumindest mal davon gehört zu haben ;) -
OK mal kurz OT: :D
@Hanswerner: Dass das für einen Azubi/Prakti ein toller Einstieg sein kann, ist keine Frage. Wenn das jemand ist, der entsprechenden "Drive" hat und das auch am Laufen hält, warum nicht, dann ist er für die Firma eine billige aber gute Alternative. Ich hab selbst mal so angefangen als Minijobber für ~400€ + Hardwareeinkauf ;) Habe dann am Ende die ganze Webhosting Schiene auf BSD Basis betreut, weil in der Firma keiner Linux/BSD anfassen wollte ;) insofern kann ich sowas gut nachvollziehen. Aber für die Firma selbst, da hat virago schon recht, ist das eben auch ein Risiko auf jemand zu setzen, der eigentlich gar keinen Background hat, egal wie gut er sich das aneignen kann. Manche Entscheidungen kann man gar nicht absehen, weil einem der Background fehlt :)
-
Hallo alle zusammen, ist in der Zwischenzeit jemandem eine schönere Lösung untergekommen?
-
@Owly Das hängt immer ganz von der Aufgabenstellung ab. Implementationen hängen immer an Rahmenbedingungen.