gzipモジュール組込み

主にSMTPへの不正アクセスを監視してファイヤーウォールにブラックリストを追加するpythonプログラム(blockset.py)はサーバー引越前より使用していたが、それまでに集計した不正アクセスIPアドレスリストは引越後も使用して対応していた。

リスト自体は5年くらい前からのものでかなり膨らんで来たしもう既に状況は変わっているかも知れないため、サーバーIPアドレスも変わったという機会もあり最初から収集を始めることとし、一度ブロックリストを空にしてみた。2~3日は特におかしなアクセスは無く油断していたら、夕べ辺りに大量にSMTPへログインアタックがいらっしゃいましたので下記に晒します。

root@jagha:~# blockset.py -u
use defaule.
New record : 31.210.20.7 (13)
New record : 31.210.20.18 (10)
New record : 31.210.20.23 (11)
New record : 31.210.20.39 (15)
New record : 31.210.20.41 (6)
New record : 31.210.20.54 (7)
New record : 31.210.20.93 (7)
New record : 31.210.20.109 (9)
New record : 31.210.20.111 (14)
New record : 31.210.20.155 (13)
New record : 31.210.20.162 (15)
New record : 31.210.20.173 (11)
New record : 31.210.21.3 (6)
New record : 31.210.21.4 (6)
New record : 31.210.21.9 (6)
New record : 31.210.21.76 (5)
New record : 31.210.21.82 (13)
New record : 31.210.21.96 (12)
New record : 31.210.21.195 (15)
New record : 31.210.21.220 (15)
New record : 31.210.21.235 (6)
New record : 31.210.21.242 (7)
New record : 31.210.21.243 (12)
New record : 45.133.1.22 (15)
New record : 45.133.1.50 (11)
New record : 45.133.1.58 (7)
New record : 45.133.1.73 (13)
New record : 45.133.1.100 (13)
New record : 45.133.1.102 (14)
New record : 45.133.1.109 (14)
New record : 45.133.1.127 (11)
New record : 45.133.1.138 (8)
New record : 45.133.1.192 (15)
New record : 45.133.1.203 (8)
New record : 45.133.1.204 (8)
New record : 45.133.1.206 (13)
New record : 45.133.1.214 (15)
New record : 45.133.1.218 (15)
New record : 45.133.1.239 (15)
New record : 45.133.1.241 (12)
New record : 45.133.1.242 (12)
New record : 45.133.1.247 (8)
New record : 45.144.225.54 (15)
New record : 45.144.225.95 (13)
New record : 45.144.225.204 (9)
New record : 45.144.225.205 (7)
New record : 45.144.225.206 (7)
New record : 136.144.41.70 (7)
New record : 136.144.41.87 (12)
New record : 136.144.41.132 (6)
New record : 136.144.41.162 (8)
New record : 136.144.41.166 (8)
New record : 136.144.41.181 (15)
New record : 136.144.41.209 (8)
New record : 195.133.40.31 (8)
New record : 195.133.40.34 (15)
New record : 195.133.40.41 (7)
New record : 195.133.40.63 (7)
New record : 203.159.80.60 (12)
New record : 203.159.80.61 (15)
New record : 203.159.80.77 (6)
New record : 203.159.80.190 (12)
update ufw before.rules
Firewall reloaded

こちらをネットマスク24ビットでくるめると、意外に同じノードからのご来店が多く、

31.210.20.0/24  <=  31.210.20.0
31.210.21.0/24  <=  31.210.21.0
45.133.1.0/24  <=  45.133.1.0
45.144.225.0/24  <=  45.144.225.0
136.144.41.0/24  <=  136.144.41.0
195.133.40.0/24  <=  195.133.40.0
203.159.80.0/24  <=  203.159.80.0

これだけになったので、この辺りの方々が迷惑なドメインということで一括ブラックリストとした

あと、もう一点、先日のlessコマンドにならってgzip圧縮されたログファイルも普通に解析できるように仕様追加した。cron起動されるlogrotateでまだ解析していないログファイルが圧縮アーカイブされてしまう可能性がある。

pythonのgzipモジュールを使用すると通常ファイルと同じように普通に読み書き出来るファイルハンドルが生成される。with構文を使用してファイル操作を行っている部分を下記にように変更した。

import gzip
import re

・・・・
    with open(args.logfile, 'r', encoding='utf-8') if not re.search('\.gz$', args.logfile) else gzip.open(args.logfile, 'rt') as fh:
        for line in fh:
            ・・・・

with構文の中でインライン条件分岐を行い、末尾が’gz’だった場合はgzipでオープンするという内容。

この方法、他の用途のファイル読み込みでも応用が考えられる。もう一つ分岐を増やして、ファイル名が空白であった場合は標準入力(sys.stdin)とするなども出来そうだ。