月曜日, 7月 19, 2010

ツールをいくつか

 前回、ルール0以外の一般規則をやめることによって偽陽性判定を減らし、スパムアクセスの前科があるドメインのエンドユーザー回線と推定されるホストをブラックリストで阻止する案を述べた。この方法をとる準備のために、現在S25Rやuser unknownなどでブロックされているホストやドメイン名を抽出したりFQDNでソーティングしたりするための補助ツールをいくつか作った。Perl記述で、シェルコマンドのパイプと組み合わせることを前提に機能を単純化している。よろしかったらお使いください。

1. rejhost.pl (Extract rejected hosts)
機能 引数で指定されたPostfixのログファイルから、拒否されたホストのFQDNとIPアドレスを抽出する。引数を省略したら、/var/logディレクトリの下の、過去と最新の全メールログファイルを入力する。ディレクトリを省略したファイル名を指定したら(「/」がないとき)、デフォルトのディレクトリを/var/logとする。

出力例
166-71-95-178.pool.ukrtel.net[178.95.71.166]

使用例
rejhost.pl # /var/logの下のmaillog.4~maillog.1とmaillogから入力
rejhost.pl maillog.1 maillog # /var/logの下のmaillog.1とmaillogから入力
rejhost.pl ~/maillog.save # ~/maillog.saveから入力

プログラムコード
#!/usr/local/bin/perl
$dir = "/var/log";
if (@ARGV == ()) {
    @ARGV = ("maillog.4", "maillog.3", "maillog.2", "maillog.1", "maillog");
}
foreach $file (@ARGV) {
    unless ($file =~ /\//) {
        $file = $dir . "/" . $file;
    }
}
while(<>) {
    if (/reject:.* from ([^]]+\])/) {
        print "$1\n";
    }
}

 デフォルトのディレクトリとデフォルトのメールログファイルを変更したい場合は、適当に手直ししてください。Perlプログラミングの経験のない人でも直し方はおわかりになると思う。

2. revfqdn.pl (Reverse FQDNs)
機能 sortコマンドを使ってFQDNを上位ドメインの文字コード順にソーティングするために、FQDNのラベルを逆順に並べる。結果をもう一度これに通すと元のFQDNに戻る。

変換例
166-71-95-178.pool.ukrtel.net[178.95.71.166] → net.ukrtel.pool.166-71-95-178[178.95.71.166]

使用例
(拒否されたホストを上位ドメインの文字コード順にソーティングし、重複を削除する。――同じサイトドメイン内のホストは連続して並ぶことになる。)
rejhost.pl | revfqdn.pl | sort -f | uniq | revfqdn.pl

プログラムコード
#!/usr/local/bin/perl
while (<STDIN>) {
    chop;
    $_ =~ /^([a-z0-9._-]+)(.*)$/i;
    @labels = split(/\./, $1);
    @labels = reverse(@labels);
    print join(".", @labels), $2, "\n";
}

3. sitedom.pl (Extract site domain names)
機能 FQDNを入力してサイトドメイン名を抽出する。トップレベルドメインが英字2文字(国ドメイン)で、第2レベルがcom、net、org、gov、edu、または英字2文字ならば第2レベルを属性ラベルと推定し(これは確かではないが)、第3レベルをサイトドメインとみなして、上位3階層を抽出する。それ以外の場合は上位2階層を抽出する。2階層以上でない名前(unknownを含む)は出力されない。

変換例
189-68-193-53.dsl.telesp.net.br[189.68.193.53] → telesp.net.br
vc-41-16-75-82.umts.vodacom.co.za[41.16.75.82] → vodacom.co.za
166-71-95-178.pool.ukrtel.net[178.95.71.166] → ukrtel.net
bl17-17-97.dsl.telepac.pt[188.82.17.97] → telepac.pt

使用例
(拒否されたホストのサイトドメインの数を数える。)
rejhost.pl | sitedom.pl | sort | uniq | wc

プログラムコード
#!/usr/local/bin/perl
while (<STDIN>) {
    $_ =~ /^(([a-z0-9_-]+\.)+[a-z0-9_-]+)/i;
    if ($1 =~ /(^|\.)([a-z0-9_-]+\.(((com|net|org|gov|edu|[a-z]{2})\.)?[a-z]{2}|[a-z0-9_-]+))$/i) {
        print "$2\n";
    }
}

0 件のコメント: