Como anonimizar um log do Apache após o fato?

1

Eu encontrei um bug em um programa PHP de código aberto e quero criar um relatório de bug. Espero que o log do servidor seja importante para os desenvolvedores (no mínimo, é necessário provar que há um bug e não erro do usuário). O log no servidor é "puro" e contém endereços IP de usuário válidos de meus usuários.

Eu procurei pelo anonimato, mas todos os resultados que encontrei foram sobre anonimização on-the-fly e não manter IPs no servidor. Mas isso não se aplica à minha situação.

Eu encontrei um script que promete fazer o que eu preciso. Infelizmente, isso não funciona - a saída é um arquivo contendo a única string ORIG em vez de um log com endereços IP aleatórios. Eu não sei Perl, então não posso solucionar isso.

Alguma idéia de como anonimizar meus dados? O arquivo de log inteiro é apenas uma lista de solicitações e respostas HTTP, uma por linha. Eu não me importo se eu uso algo diferente do script acima, ou se você pode apontar qual é o problema com ele.

    
por rumtscho 17.10.2014 / 12:48

1 resposta

2

Para corrigir esse script, você precisa alterar while (< ORIG >) { para while (<ORIG>) { .

Note que esse script adota uma abordagem de marreta - ele substituirá qualquer seqüência de quatro números de qualquer comprimento separados por pontos, não apenas endereços IP. Em outras palavras, ele corresponderá a 124.4534653.74623.0 , 1.1.1.1 , http://example.com/foo/1.2.3.42345446/bar e mais. Se isso for um problema para você, será necessário identificar qual coluna do seu log contém endereços IP e escrever um script um pouco mais complicado que modifique apenas essa coluna.

Script fixo incluído para manter este Q & Um crédito independente para Stephen Cuppet .

#!/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));
}
    
por 17.10.2014 / 13:01

Tags