カテゴリー
Asterisk IP-PBX Linux

Fail2ban で不正アクセス防止 (asterisk 編パート2)

前回の投稿でfai2banで不正アクセス対策をした後にも、しつこくアクセス元を変えたり、以下のように fail2ban のフィルターに検出されないような手段でアクセスを試みている様子。

Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=649747a9

voip-info.jpSIP-Fail2ban の投稿記事を参考に SIP のブルートフォース攻撃を抑止するパッチを Asterisk 13.8.2 用に作成し、適用しました。

chan_sip.c の修正パッチ:

--- chan_sip.c.20160512 2016-05-12 10:55:25.221687414 +0900
+++ chan_sip.c  2016-05-12 11:09:13.753796299 +0900
@@ -19347,7 +19347,7 @@
                        return;
                }
                if (res < 0) { /* Something failed in authentication */
-                       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));
                        transmit_response(p, "403 Forbidden", req);
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                        return;
@@ -25340,7 +25340,7 @@
                        return 0;
                }
                if (res < 0) { /* Something failed in authentication */
-                       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));
                        transmit_response(p, "403 Forbidden", req);
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                        return 0;
@@ -26122,7 +26122,7 @@
                        goto request_invite_cleanup;
                }
                if (res < 0) { /* Something failed in authentication */
-                       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));
                        transmit_response_reliable(p, "403 Forbidden", req);
                        p->invitestate = INV_COMPLETED;
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
@@ -27842,7 +27842,7 @@
                p->lastinvite = seqno;
                return 0;
        } else if (auth_result < 0) {
-               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));
                transmit_response(p, "403 Forbidden", req);
                sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                ast_string_field_set(p, theirtag, NULL);

上記の変更を行い再ビルドした Asterisk を再起動してログを確認。パッチ適用後のログのように行末へ不正アクセス元のIPアドレスが表示されるようになりました。
※NNN.NN.NNN.NNN はサーバーのIPアドレス

パッチ適用前:

[2016-05-12 11:13:24] NOTICE[30781][C-0000002a]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=649747a9
[2016-05-12 11:13:26] NOTICE[30781][C-0000002b]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=f39f5f63
[2016-05-12 11:13:27] NOTICE[30781][C-0000002c]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=8e066fe2
[2016-05-12 11:13:28] NOTICE[30781][C-0000002d]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=6af3aa52

パッチ適用後:

[2016-05-12 11:21:07] NOTICE[8958][C-00000000]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=1b248211 (xxx.42.218.186:5076)                               
[2016-05-12 11:21:08] NOTICE[8958][C-00000001]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=4323ab38 (xxx.42.218.186:5074)                               
[2016-05-12 11:21:09] NOTICE[8958][C-00000002]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=ba356309 (xxx.42.218.186:5082)                               
[2016-05-12 11:21:11] NOTICE[8958][C-00000003]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=7e32110c (xxx.42.218.186:5076)    

voip-info.jp の投稿記事にありますように、Fail2ban のフィルターに以下のルールを適用すればこの手の不正アクセスを抑止することができるようになります。

NOTICE.* .*: Failed to authenticate user .* \(<HOST>:.*\)
カテゴリー
Asterisk IP-PBX Linux

Fail2ban で不正アクセス防止 (asterisk 編)

オープンソースIP-PBX Asterisk サーバーを外部公開サーバーへ入れてデモ環境を整えました。外部からの攻撃を抑止するために Fail2ban で対策をしました。

参考サイト:
https://www.voip-info.org/wiki/view/Fail2Ban+%28with+iptables%29+And+Asterisk
https://www.fail2ban.org/wiki/index.php/Asterisk

Fail2ban はCentOS 6.7 + EPEL リポジトリから yum でインストールします。

1. Fail2ban のインストール

# yum install fail2ban

2. jail.conf の変更

jail.conf をエディターで開いて、以下の設定を追加します。

# cd /etc/fail2ban
# vi jail.conf

-- ここから --
[asterisk-iptables]

enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=all]
           sendmail-whois[name=asterisk, dest=root, sender=fail2ban]
logpath  = /var/log/asterisk/messages
maxretry = 4
findtime = 21600
bantime = 86400
-- ここまで --

3. asterisk.conf (フィルター) の変更

fail2ban をインストールすると、/etc/fail2ban/filter.d/ の下にフィルターが用意されています。 asterisk.conf もありますので、これをバックアップしておいて、あらたにフィルターを作成します。

# cd /etc/fail2ban/filter.d/
# mv asterisk.conf asterisk.conf.bak

エディターで asterisk.conf を開いて以下の内容を入力します。

# vi asterisk.conf

-- ここから --
# Fail2Ban configuration file

[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]
#_daemon = asterisk
# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named 'host'. The tag '' can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P\S+)
# Values:  TEXT
#
failregex = NOTICE.* .*: Registration from '.*' failed for ':.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for ':.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Device does not match ACL
            NOTICE.* .*: Registration from '\".*\".*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '\".*\".*' failed for ':.*' - Wrong password
            NOTICE.*  failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' \(from \)
            NOTICE.* .*: Host  failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@.*
            NOTICE.* .*:  failed to authenticate as '.*'
            NOTICE.* .*:  tried  to authenticate with nonexistent user '.*'
            VERBOSE.*SIP/-.*Received incoming SIP connection from unknown peer

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex=
-- ここまで --

入力ができたら保存します。

4. Fail2ban 起動

# service fail2ban start
# chkconfig fail2ban on

5. 確認

iptables で確認すると以下のように Ban 状況がわかります。

# iptables -L -v
...
-- 省略 --
Chain f2b-ASTERISK (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  any    any     xxx.75-143-13.dyn.dsl.cantv.net  anywhere            reject-with icmp-port-unreachable 

以上です。

カテゴリー
Asterisk IP-PBX

Asterisk ログにタイムスタンプを表示

Asterisk CLIで接続して表示されるログには、デフォルトで日時がないのですが、オプションで表示することができます。

1) CLI起動時に指定

# /usr/sbin/asterisk -rTvvvvvv

2) asterisk.conf で指定

asterisk.conf 
...
[options]
...
timestamp = yes  ; 起動時の -T と同じ
...

結果

# /usr/sbin/asterisk -rvvvvvT
[Dec  1 12:14:10] Asterisk 13.6.0, Copyright (C) 1999 - 2014, Digium, Inc. and others.
[Dec  1 12:14:10] Created by Mark Spencer 
[Dec  1 12:14:10] Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
[Dec  1 12:14:10] This is free software, with components licensed under the GNU General Public
[Dec  1 12:14:10] License version 2 and other licenses; you are welcome to redistribute it under
[Dec  1 12:14:10] certain conditions. Type 'core show license' for details.
[Dec  1 12:14:10] =========================================================================
[Dec  1 12:14:10] Connected to Asterisk 13.6.0 currently running on localhost (pid = 49788)
... 省略 ...
[Dec  1 12:19:14]     -- Executing [201@default:2] Playback("SIP/301-00000001", "demo-echotest") in new stack
[Dec  1 12:19:14]     --  Playing 'demo-echotest.gsm' (language 'ja')              
... 省略 ...
localhost*CLI> 
カテゴリー
Asterisk IP-PBX

Asterisk CLI プロンプトの変更

Asterisk コンソールのプロンプトはデフォルトでは、

hostname*CLI> 

ASTERISK_PROMPT 環境変数にフォーマットをセットすることで変更できます。

例)
export ASTERISK_PROMPT="[%d %t]%H*> "

上記の例のように日時とホスト名を指定すると、

[2015-12-01 12:03:12]hostname*>

参考サイト:
https://pbxinaflash.com/community/index.php?threads/asterisk-cli-date-time-in-logs.7885/

カテゴリー
Asterisk IP-PBX Linux

Asterisk 13: asterisk にリモート接続すると libjansson が見つからない

Asterisk 13 をCentOS6.6 にをVOIP-Info.jpを参考にインストールしました。

jansson のインストールのところは ld.so.conf を編集せず、以下の様にconfigure して ldconfig しました。

# wget https://www.digip.org/jansson/releases/jansson-2.7.tar.gz
# tar zxvf jansson-2.7.tar.gz
# cd jansson-2.7
# ./configure --prefix=/usr/ && make clean && make && make install && ldconfig

CentOS ではこれをしないとasterisk にリモート接続すると libjansson が見つからないというエラーになります。 ;-(

# /usr/sbin/asterisk -rvvv
/usr/sbin/asterisk: error while loading shared libraries: libjansson.so.4: cannot open shared object file: No such file or directory

以上です。

ただいま、asterisk 1.8.32.2 から asterisk 13.2.0 へ移行しテスト中です。