お外でひかり電話 第12章 “Show No Mercy” ログ出力方式とフィルターの修正
BruteForceAttackへの対策
ここから先は、設定ファイルの書き換えになるから、元ファイルをしっかりバックアップしてから臨んだ方が安心かも。
おかしいと思ったら、バックアップファイルをすぐに復元して、慎重にやりなおしてみて。
作業はもちろんRaspberryPiにRootでログインした状態で実施。
ディレクトリを/usr/src/asterisk-(各自のバージョン名)に移動してから操作する。
まずはバックアップのために修正前の元ファイルを拡張子「.orig」にてコピーしておく。
# cd /usr/src/asterisk-13.6.0
# cp channels/chan_sip.c channels/chan_sip.c.orig
次に本命である channels/chan_sip.c ファイルを開く。
# nano channels/chan_sip.c
約34792行もの膨大なファイル。
nanoエディタで文字や文字列の検索機能は「Ctrl+w」。
4カ所同じ文言の部分があるのでこの検索機能を使って探し出し、以下のように書き換える。
(修正前)ast_log(LOG_NOTICE, “Failed to authenticate device %s\n”, sip_get_header(req, “From”));
↓
(修正後)ast_log(LOG_NOTICE, “Failed to authenticate device %s (%s)\n”, sip_get_header(req, “From”), ast_sockaddr_stringify(addr));
最後にもう1カ所書き換える。
(修正前)ast_log(LOG_NOTICE, “Failed to authenticate device %s for SUBSCRIBE\n”, sip_get_header(req, “From”));
↓
(修正後)ast_log(LOG_NOTICE, “Failed to authenticate device %s (%s)\n”, sip_get_header(req, “From”), ast_sockaddr_stringify(addr));
「Ctrl+o」で上書き保存、「Ctrl+x」でnano脱出。
全部で5カ所を書き換えたことになる。
ここで再度コンパイル作業
カレントディレクトリはそのままに、コンパイル作業に入る。
# make
念のためインストール作業も
# make install
最後にフィルターに修正を加える。
# nano /etc/fail2ban/filter.d/asterisk.conf
「failregex = 」から始まる文がログファイルから攻撃を検索するための判定式なのだが、その最後に追記する。
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Failed to authenticate device .*<sip:.*@.*>;tag=.* \(:.*\)$
また、フィルターの怪しげな数式の見方は、こうだ。上のログファイルを例とする。
必ず出だしは日付から始まっているのを参考に。分解してみる。
^ → 文頭が以下の文字から始まりますよ、という合図。
(%(__prefix_line)s|\[\]\s*)%(log_prefix)s → [2015-11-04 15:43:57]の部分
Failed to authenticate device → そのまま
.* → 101
;tag=→ そのまま
.* → a0d7a141
\( → 「(」を見たままの記号として認識
→ ZZZ.ZZZ.80.23:5118 注、攻撃者のIPアドレス
: → そのまま
.* 5118 注、攻撃者のポート番号
\) → 「)」を見たままの記号として認識
$ → 直前の文字、この場合は「)」でこの行が終了しますよ、という合図
使い勝手のいい「 .* 」が登場する正規表現というもの。
上の意味がわかるだけでも今後の新しいサーバ攻撃のフィルターは自分で作れる。
最終的にBruteForceAttackを受けた時のログ出力はこのように変わる。
[2015-11-05 20:50:49] NOTICE[1345][C-0000001e] chan_sip.c: Failed to authenticate device 101<sip:101@YYY.YYY.YYY.YYY>;tag=56982f6e
[2015-11-05 20:51:46] NOTICE[1345][C-0000001f] chan_sip.c: Failed to authenticate device 800<sip:800@YYY.YYY.YYY.YYY>;tag=2cfa1395
[2015-11-05 20:51:48] NOTICE[1345][C-00000020] chan_sip.c: Failed to authenticate device 800<sip:800@YYY.YYY.YYY.YYY>;tag=df8f03a3
↓
[2015-11-05 20:48:41] NOTICE[1345][C-0000001d] chan_sip.c: Failed to authenticate device 101<sip:101@YYY.YYY.YYY.YYY>;tag=c72c6c6c(64.78.XXX.XXX:5070)
[2015-11-05 20:50:49] NOTICE[1345][C-0000001e] chan_sip.c: Failed to authenticate device 101<sip:101@YYY.YYY.YYY.YYY>;tag=56982f6e(64.78.XXX.XXX:5086)
[2015-11-05 20:51:46] NOTICE[1345][C-0000001f] chan_sip.c: Failed to authenticate device 800<sip:800@YYY.YYY.YYY.YYY>;tag=2cfa1395(64.78.XXX.XXX:5085)
[2015-11-05 20:51:48] NOTICE[1345][C-00000020] chan_sip.c: Failed to authenticate device 800<sip:800@YYY.YYY.YYY.YYY>;tag=df8f03a3(64.78.XXX.XXX:5084)
末尾の
64.78.XXX.XXX
が明るみになった相手のIPアドレス。
これでfail2banで検出・排除できるようになります。
不正ログインには容赦しなくていいんです。
Show No Mercy.