Jump to content

IP in Logfiles anonymisieren


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Wir produzieren auf einem System am Tag ca. 300 MB Logfiles. Damit ich diese Dateien zur Fehleranalyse und Statistik länger aufheben darf, habe ich die Vorgabe die IP-Adressen in den Dateien zu anonymisieren. Es sollen dabei die letzten beiden Blöcke von IPv4 Adressen weggeschnitten werden. Aus 123.111.231.251 soll also 123.111.0.0 werden.

 

Ich habe mich nun mit verschiedenen Varianten mit Powershell an dem Problem versucht. Ich bekomme zwar das gewünschte Ergebnis, aber ist die Laufzeit extrem mies. Weit über 30 Minuten Laufzeit, und auch Speicherbedarf jensweits von gut und böse. Jemand eine Idee wie man sowas geschickt skripten könnte? Kann auch gerne eine andere Skriptsprache sein, ich habe es halt mit Powershell versucht weil ich das am besten kann.

 

Eine Zeile im Logfile sieht so aus:

123.111.231.251 - 4bTQHsdvUwrMOXa [09/Jul/2015:22:45:37 +0100] ... weitere Daten

" - " ist im Logfile eindeutig, man kann das also ggf. zum aufteilen von Strings verwenden. Hier ein Auszug aus einem Versuch mit Powershell.

 

$lines = get-content $logfile

 

foreach ($line in $lines){
    $splitedline = $line -split " - "
    $ip = $splitedline[0]
    $rest = $splitedline[1]
        
    $ip = $ip.split(".")
    $ip[2] = "0"
    $ip[3] = "0"

    $ip = $ip -join '.'
        
    $line = $ip  + ' - ' + $rest
    $line | out-file $targetfile -append -encoding "ASCII"
}

Link zu diesem Kommentar

Ist ein Proxyserver. Muss leider die IP Adresse erst mal loggen, um dann Missbrauch nachverfolgen zu können, diese Logfiles darf ich aber dann nur 2 Wochen aufheben.

 

Da kommen dann im Logfile dahinter noch die Zieladresse, Ergebnissecode, UserAgent und so Krams, das ist das interessante. Die Quelle, also die IP, ist mir bei diesen Auswertungen dann Schnuppe, ich hätte aber gerne mehr als 2 Wochen. Also entsprechend IP anonymisieren, Logfiles länger aufheben und dann Auswertungen machen.

Link zu diesem Kommentar

Evtl. kann dir ein Perlscript mit Regex helfen. 

Bei einem älteren Arbeitgeber hatten wir die selbe Anforderung für einen Squid Proxy, das hat unser Linux Mensch mit einem 5 Zeiler in Perl per Cronjob gelöst (soweit ich mich erinnere).

Durchlaufzeit war uns aber egal, lief einmal nachts auf der Proxy VM wo es keinen gestört hat. Kann also sein, dass du ähnliche schlechte Ergebnisse bekommst.

Link zu diesem Kommentar

Statt out-file -append kannst du set-file oder add-file nutzen.

Get-content kannst du mit -ReadCount 1 ergänzen, damit dies schneller in einem rutsch eingelesen wird.

Get-content und foreach kannst du zusammenfassen: foreach($foo in (get-content ...))

Dann liesst du nicht die 300 mb zwei mal. (einmal beim Get-content, einmal beim foreach).

Damit sollte das Script schneller sein. Wenn es noch zu langsam ist musst du dies profilen.

Link zu diesem Kommentar
  • 2 Wochen später...

Hatte das schonmal direkt mit der Pipeline probiert, nur kam dann am Ende nix bei raus. Die Zieldatei blieb leer. Habe mir das nochmal angeschaut, ich weis zwar nicht so ganz warum, aber es brauchte noch ein tostring(). Die Laufzeit ist jetzt schon mal von 30 Minuten auf knapp 10 Minuten runter und der Speicherbedarf bewegt sich nicht mehr im GB Bereich sondern nur noch wenige MB.

Get-Content  $logfile | 
ForEach-Object {

	$splitedline = $_ -split " - "
	$ip = $splitedline[0]
	$rest = $splitedline[1]
		
	$ip = $ip.split(".")
	$ip[2] = "0"
	$ip[3] = "0"

	$ip = $ip -join '.'
		
	$_ = $ip  + ' - ' + $rest
	$_.tostring()
} |
Out-File $targetfile -encoding "ASCII"
Link zu diesem Kommentar

Hallo,

Array-Operationen wie Split / Join sind generell relativ aufwändig,

 

Vielleicht geht es so etwas schneller:

 

blub

Set-StrictMode -Version "2.0"
Clear-Host

$IP = "192.168.33.132"

Function Anonymize-IP{
  Param($Ip)
  $Ip = ($IP -as [Net.IPAddress])

  $Bits = $Ip.GetAddressBytes()
  $Ip1 = $Bits[0]
  $Ip2 = $Bits[1]
  #$Ip3 = $Bits[2]
  #$Ip4 = $Bits[3]
  $AnonymIP = "$Ip1.$Ip2.0.0"
  Return $AnonymIP
}
 
$NewIP = Anonymize-IP $Ip
$NewIP
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...