【Python】ufwのログを解析して集計する(国、攻撃ポート)
今回はPythonプログラミングのお話です。
ThinkPad X240上で稼働する本ブログサーバに対して攻撃をブロックしたufwのログを
pythonで解析して集計するプログラムをコーディングしました。
一つ前の記事でログフォーマットが新旧で変わる点がありますが、それにも対応しています。
ログの出力フォーマットが異なる部分をif文で「Dec」かどうかで条件分岐しています。
集計に際してはcollectionsという標準ライブラリを使って、counterで集計。
most_commonで最頻値を取ってくるというやり方です。
今回は新機能として、ターゲットにされているポートも含めて集計可能にしました。
新たに見直したPythonコード
コード内容は以下になります。(※以前のコードの修正版です)
#!/usr/bin/python3
import re
import sys
import ipaddress
import geoip2.database
import csv
import collections
filename='/var/log/ufw.log'
ip_address = []
ip_country = []
ip_date = []
ip_dport = []
gip = geoip2.database.Reader("/var/lib/GeoIP/GeoLite2-Country.mmdb")
#
def trans_geoip(ip_addr):
if '192.168.1.' in ip_addr:
return ('Private')
try:
response = gip.country(ip_addr)
return (response.country.names['ja'])
except:
print('')
#
def trans_word(input_text):
replacements = {
'Jan':'01',
'Feb':'02',
'Mar':'03',
'Apl':'04',
'May':'05',
'Jun':'06',
'Jul':'07',
'Aug':'08',
'Sep':'09',
'Oct':'10',
'Nov':'11',
'Dec':'12',
}
return re.sub('({})'.format('|'.join(map(re.escape,replacements.keys()))),lambda m: replacements[m.group()],input_text)
#
if __name__ == '__main__':
with open(filename) as f:
reader = csv.reader(f,delimiter=" ",doublequote=False,lineterminator="\r\n")
for row in reader:
if row[0]=='Dec':
if (len(row))>19:
ip_dport.append(row[19].strip("DPT="))
ip_list = ("2021"+"-"+trans_word(row[0])+"-"+row[1].zfill(2),row[2].zfill(2),row[10].strip("SRC="))
ip_address.append(row[10].strip("SRC="))
ip_date.append("2021"+"-"+trans_word(row[0])+"-"+row[1].zfill(2))
ip_country.append(trans_geoip(row[10].strip("SRC=")))
if row[0]!='Dec':
if (len(row))>17:
#print(row[17].strip("DPT="))
ip_dport.append(row[17].strip("DPT="))
ip_list = ((row[0][0:10]),row[8].strip("SRC="))
ip_address.append(row[8].strip("SRC="))
ip_date.append((row[0][0:10]))
ip_country.append(trans_geoip(row[8].strip("SRC=")))
ip_addrgroup = collections.Counter(ip_address)
ip_dategroup = collections.Counter(ip_date)
ip_cntrgroup = collections.Counter(ip_country)
ip_dprtgroup = collections.Counter(ip_dport)
print(len(ip_addrgroup))
print(ip_cntrgroup.most_common(10))
print(ip_dategroup.most_common(10))
print(ip_addrgroup.most_common(10))
print(ip_dprtgroup.most_common(10))
上記の出力結果
上記の出力結果ですが、リスト形式で見にくいですが以下になります。
国別はgeoipデータベースとIPアドレスを紐付けて出力しています。
# 国別
[('アメリカ', 2097), ('英国', 1296), ('ロシア', 832), ('中国', 709), ('オランダ王国', 343), ('ドイツ連邦共和国', 205), ('香港', 121), ('シンガポール', 78), ('ウクライナ共和国', 61), ('インドネシア共和国', 59)]
# 日付別
[('2021-12-30', 3281), ('2021-12-29', 1957), ('2021-12-31', 1315)]
# IP別
[('185.156.73.91', 175), ('89.248.163.152', 155), ('89.248.163.165', 143), ('89.248.163.164', 137), ('89.248.163.154', 116), ('45.143.200.110', 71), ('146.88.240.4', 61), ('89.248.163.140', 54), ('193.3.19.33', 51), ('89.248.165.202', 51)]
# Port別
[('23', 163), ('2376', 162), ('2375', 162), ('123', 78), ('1433', 71), ('3389', 61), ('389', 55), ('81', 47), ('53', 46), ('5060', 45)]
どこの国が多い?
アメリカがトップ、次に英国、ロシア、中国と大国が並びます。。。
順位 | 国名 | ブロック回数 |
1位 | アメリカ | 2097 |
2位 | 英国 | 1296 |
3位 | ロシア | 832 |
4位 | 中国 | 709 |
5位 | オランダ王国 | 343 |
6位 | ドイツ連邦共和国 | 205 |
7位 | 香港 | 121 |
8位 | シンガポール | 78 |
9位 | ウクライナ共和国 | 61 |
10位 | インドネシア共和国 | 59 |
どのポートが狙われている?
今回はポートを追加して上位の10位まで集計してみました。
それではそれぞれ何のポートが狙われているのか見ていきましょう。
順位 | ポート名 | サービス |
1位 | 23 | telnet |
2位 | 2376 | Docker REST API (SSL) |
3位 | 2375 | Docker REST API (Plain) |
4位 | 123 | NTP |
5位 | 1433 | MS SQLServer |
6位 | 3389 | MSTerminalServer RDP |
7位 | 389 | LDAP |
8位 | 81 | Torpark(オニオンルーティング) |
9位 | 53 | DNS |
10位 | 5060 | SIP(IP電話) |
なるほど、MS関連(SQL、RDP、LDAP(AD))は相変わらずですが、
新しい攻撃先ポートとしてはDockerですかね。
Dockerを使ってのアプリケーション開発が増えているかと思いますが、
攻撃対象となっていますので、ご注意ください。
まとめ
今回はufwのログをpythonで集計するコードと、そこから見えてきた、
新しい攻撃対象ポートの紹介でした。
何かの役に立てば幸いです。
それでは!