Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Openvpn Benutzer - Log zur Zeiterfassung

    Scheduled Pinned Locked Moved Deutsch
    9 Posts 4 Posters 1.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Hanswerner
      last edited by

      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.

      1 Reply Last reply Reply Quote 0
      • V
        viragomann
        last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • JeGrJ
          JeGr LAYER 8 Moderator
          last edited by

          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!

          Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

          If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

          1 Reply Last reply Reply Quote 0
          • H
            Hanswerner
            last edited by

            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.

            1 Reply Last reply Reply Quote 0
            • V
              viragomann
              last edited by

              Hört sich an, als ob der Azubi dort die gesamte IT über hat.  :)
              Leichtsinn, aber mit den Folgen muss eh die Firma leben.

              1 Reply Last reply Reply Quote 0
              • H
                Hanswerner
                last edited by

                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 ;)

                1 Reply Last reply Reply Quote 0
                • JeGrJ
                  JeGr LAYER 8 Moderator
                  last edited by

                  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 :)

                  Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

                  If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

                  1 Reply Last reply Reply Quote 0
                  • OwlyO
                    Owly
                    last edited by

                    Hallo alle zusammen, ist in der Zwischenzeit jemandem eine schönere Lösung untergekommen?

                    JeGrJ 1 Reply Last reply Reply Quote 0
                    • JeGrJ
                      JeGr LAYER 8 Moderator @Owly
                      last edited by

                      @Owly Das hängt immer ganz von der Aufgabenstellung ab. Implementationen hängen immer an Rahmenbedingungen.

                      Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

                      If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post
                      Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.