事后如何匿名化 Apache 日志?

事后如何匿名化 Apache 日志?

我在一个开源 PHP 程序中发现了一个错误,我想创建一个错误报告。我期望服务器日志对开发人员很重要(至少,需要证明存在错误而不是用户错误)。服务器上的日志是“纯净的”,包含我用户的有效用户 IP 地址。

我四处寻找匿名化方法,但找到的所有结果都是关于即时匿名化,而不是在服务器上保留 IP。但这不适用于我的情况。

我发现了一个脚本它承诺可以满足我的需要。遗憾的是,它不起作用 - 输出是一个包含单个字符串的文件,ORIG而不是带有随机 IP 地址的日志。我不懂 Perl,所以我无法排除故障。

有什么想法可以让我的资料匿名化吗?整个日志文件只是 HTTP 请求和响应的列表,每行一个。我不在乎我是否使用了上述脚本以外的其他东西,或者您是否可以指出其中的问题所在。

答案1

要修复该脚本,您需要更改while (< ORIG >) {while (<ORIG>) {

请注意,该脚本采用了一种强硬的方法——它将取代任何由点分隔的任意长度的四个数字组成的序列,而不仅仅是 IP 地址。换句话说,它将匹配124.4534653.74623.0、等等。如果这对您来说是个问题,那么您需要确定日志的哪一列包含 IP 地址,并编写一个稍微复杂一些的脚本来仅修改该列。1.1.1.1http://example.com/foo/1.2.3.42345446/bar


已修复脚本,以保持此问答的独立性,归功于史蒂芬·库佩特

#!/usr/bin/perl
if ($#ARGV + 1 < 1) {
        print "\n\tUsage:\n";
        print "\t------\n\n";
        print "\tperl log_anonymize.pl file1 [file2 [file3 [...]]]\n\n";
        die "Please specify at least one file to use this script.\n\n";
}

my %forward = ();
my %reverse = ();

foreach (@ARGV) {
        open(ORIG, $_)
          or die "Failed to open input file for reading.";
        open(ANON, "+>", $_.".anon")
          or die "Failed to open destination file for writing.";
        while (<ORIG>) {
                if (/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {
                        if (!($forward->{$1})) {
                                $newIp = getNewIp();
                                while ($reverse->{$newIp}) {
                                        $newIp = getNewIp();
                                }
                                print "New mapping created: $1 -> $newIp\n";
                                $forward->{$1} = $newIp;
                                $reverse->{$newIp} = $1;
                        }
                        $repl = $forward->{$1};
                        $_ =~ s/$1/$repl/;
                }
                print ANON $_;
        }
        close(ORIG);
        close(ANON);
}

exit 0;

sub getNewIp {
        return int(rand(256)) . "." . int(rand(256)) . "." . int(rand(256)) . "." . int(rand(256));
}

相关内容