asterisk安全性設定

若你的 asterisk 使用預設定的 5060 port 的話,一定會受到不少騷擾,底下就介紹怎樣針對這些騷擾做防護。

首先要說明的是,基於安全考量,請您盡量避免使用預設的 5060 port ,這樣您的系統會安全許多,也可少做很多防護,當然事情都有例外,可能要跟你對接的一類、二類電信業者他們只能接受 5060 port 跟你對接,你要用他們的服務的話,那你也只能配合他們的要求,這篇文章所要介紹的就是你不得不使用5060 port的情況下,怎樣保護你的 asterisk 系統。

先從最簡單的方法講起

(1).鎖固定IP

要跟你對接一、二類電信業者,他們一定都會有固定IP,你就可以針對他們的IP來開放5060 port這樣就可避免你的5060 port被別人騷擾。

底下是使用 iptables 鎖5060 port 固定IP的設定範例

#放行所有的內網IP
-A INPUT -s 192.168.0.0/16 -j ACCEPT
#針對是方電訊IP,開放5060,和rtp port範圍10000~20000
-A INPUT -i eth0 -s 202.153.167.30 -p udp  -i eth1 -m multiport --dports 5060,10000:20000  -j ACCEPT
#一般使用上面這條規則就可以了,該開放的port位都有開到,但你在與他們對接時仍有問題的話,可考慮改用下方這條規則,針對UDP協定 port 位全開。
#針對是方電訊IP,udp協定全開放
#-A INPUT -i eth0 -s 202.153.167.30 -p udp -j ACCEPT

這是最簡單的設定方法,保護了你的5060 port不被不明人士騷擾。
以上的方法,需要你的使用者(sip client)都在內網才行,你的使用者都在內網來連你的asterisk這是最單純、最簡單的設定環境。

若將來你的使用者需要使用到sip soft phone(軟體電話)來連接你的asterisk時怎麼辦?
這問題很快就會遇到,因為現在智慧型手機很普遍了,不用軟體電話的話,等於是asterisk的武功被廢了一半,有這樣的功能和這樣的需求,你就要想辦法幫使用者解決問題。

我建議的解法是,再架一台 asterisk ,取名叫sip2,把5060port改掉,你自己挑一個port跟使用者公佈即可。
而原本和一、二類電信業者對接的那台我們叫sip1
底下只講做法概念,不講設定細節,因為互連的設定細節講起來會花太大篇幅,設定細節可參考我的另一篇筆記
sip1 5060port只放開特定IP
sip2 要跟sip1對接,你可走sip協定,也可走iax2協定這兩種方法都可以。
我成功的案例是用iax2對接,因為在你要使用sip協定來與sip1對接的時候你會發現 sip1是5060port,而sip2非5060port,這個設定起來可能就有些麻煩,當初我為了要避開這麻煩,所以我就挑了 iax2 協定來對接。
但在使用 iax2 設定時,發現 iax.conf 這裡面的帳號設定,若帳號少的話,只有一兩個你可能還不會發現這問題,iax帳號一旦多了的話,你就會發現它的帳號名稱會亂對應,這是個麻煩的地方。

設定好的架構會是這樣
軟體電話→→sip非5060port→→sip2server→→4569port(iax協定)→→sip1server→→sip5060port→→一、二類電信業者

上面所介紹的是比較簡單的情況,底下要介紹的是,你對接的電信業者和你的使用者都要使用5060port來跟你連線,通常這是很不得已的情況,你應盡量避免這樣的情況。我遇到的情況是接手一台已經上線多年的 asterisk ,眾多的使用者們使用5060port來連線已經多年了,要通知到這些眾多的使用者修改連線設定的難度太大,只能從server端的安全性下手加強。

(2).使用5060port時的各項防護

前面的最後一段已經介紹了我們不得不使用5060port來連線的狀況,接下來我們就來真正的面對它會遇到的問題

1.sip帳號會被暴力破解
2.匿名使用者撥打電話
3.DOS攻擊

針對上面的問題一一說明解法

1.sip帳號暴力破解

針對這個問題,我們可以使用fail2ban來抵擋,參考這一頁有詳細的設定說明。

2.匿名使用者撥打電話

白話一點講就是使用者不用註冊帳密就可以撥打電話,這個安全性問題分兩個層面要注意。

① dialplan設定
就是別人撥進你的asterisk總機系統之後,聽到IVR(語音提示)
IVR說:請直撥分機號碼,或撥9由總機為您服務
但是撥進來的人,這時候他不撥分機,也不撥9接聽總機,而是直接撥手機號碼或撥國際電話之類的…
你就要避免這種情況發生,簡單說就是 dialplan 設計的不夠嚴謹所產生的安全問題
若你還不曾意識到這個問題的話,趕快按我說的方法去測試一下你的系統是不是能就這樣直撥外線呢,若可以的話,你就得趕快的修改一下你的dialplan了。

② sip.conf 安全設定

[general]
useragent=JustPBX
;不透露asterisk版本訊息
alwaysauthreject=yes 
;指沒有註冊的帳號不能撥打電話
allowguest=no
;不允許匿名使用者撥打電話

3.DOS攻擊

這個問題一般人不太容易遇到。我遇到的情況是跟我對接的cisco設備,他要送話務給我,而我的 sip.conf 裡面不能設定底下這個參數
allowguest=no
我必須把上面那個設定給註解掉或刪掉,才能正常的接他傳過來的話務,否則就接不了它的送來的話務。但把那行設定刪掉之後,就變成任何沒有帳號的人都可以送話務到我的 asterisk 裡來了,再加上我的5060 port 沒有鎖固定IP,這樣的話,5060 port 被騷擾的事就會經常的發生。這是一個我不得不放開allowguest所遇到的麻煩,另外一個問題是大家都會遇到的,我從後台觀察到,有直接送話務過來的、有來試帳號的…不管怎樣,它們都有一個共通的最大的問題,就是因為他們沒有註冊所以log裡不會有IP記錄,也就很難用fail2ban來擋他們。

直接引用osslab一段話
重大安全威脅事件
[2011-6-3] 連 Fail2Ban 都無法阻擋的攻擊方式,當攻擊者在未註冊狀態下直接撥 Asterisk 的分機時,不管分機存在與否,Asterisk 都不會紀錄來源 IP,以致於無法使用 fail2ban 進行阻擋,攻擊者可藉此做出類似 DDos 攻擊以癱瘓 Asterisk 主機。(目前尚未有合適的解決方案 可修改dialplan 來改善)

查看 /var/log/asterisk/message 常出現這樣的訊息

[2013-04-21 14:59:33] NOTICE[1466] chan_sip.c: Sending fake auth rejection for device 1000<sip:1000@自己SERVER的IP>;tag=04cd6231
[2013-04-21 14:59:33] NOTICE[1466] chan_sip.c: Sending fake auth rejection for device 1000<sip:1000@自己SERVER的IP>;tag=04cd6231
[2013-04-21 14:59:34] NOTICE[1466] chan_sip.c: Sending fake auth rejection for device 1000<sip:1000@自己SERVER的IP>;tag=a0029e1f
[2013-04-21 14:59:34] NOTICE[1466] chan_sip.c: Sending fake auth rejection for device 1000<sip:1000@自己SERVER的IP>;tag=a0029e1f
[2013-04-21 14:59:34] NOTICE[1466] chan_sip.c: Sending fake auth rejection for device 1000<sip:1000@自己SERVER的IP>;tag=18696bd1

參考資料:Missing ip address in logAsterisk not logging originating IP of a brute force attackFail2ban False sense of securitysip error logging

請參考上面的參考資料,簡單說就是某些情況的入侵行為 asterisk log 裡沒有辦法記錄到入侵者的IP,所以也就沒有辦法使用 fail2ban 來擋它,這是個壞消息,因為我曾看過我的server裡,入侵者一秒內就可以發出上百個連線,就算它沒有入侵成功,也嚴重的在消耗我的系統資源,若不做些處理方法的話,那他就可以用這招DOS的方式來搞垮我的服務。我估計一台DOS就能搞垮我的服務了,還不需動用到DDOS,嗯所以會是個滿嚴重的問題。

解決方法要從 dialplan 說起,一般我們的 asterisk 要接收別人的sip話務,都會有一個對外的context,你可以叫它 public、from-pstn、default 或 incoming 都行,不同版本的 asterisk 它的預設名稱還不一樣,但你隨時可在sip.conf 裡的 gereral 區段修改這個參數 context=public

我們就叫它 public 好了,這個 public 就是外線進來的第一個context

底下是extensions.conf設定範例

[public]
 
;從遠傳接收話務
exten => 4495123,1,Goto(ivr1,s,1)
 
;從亞太電信收話務
exten => 40580999,1,Goto(ivr2,s,1)
 
;從voip gateway接收話務
exten => fromGateway,1,Goto(ivr3,s,1)
 
;其它的號碼全掛斷
exten => _X.,1,Hangup
 
[ivr1]
;撥放語音提示:XXX您好,請直撥分機號,或按9由總機為您服務。
.....
 
[ivr2]
;撥放語音提示:XXX您好,請直撥分機號,或按9由總機為您服務。
.....

說明一下上面設定的意義,我們跟電信公司申請了兩個代表號,遠傳4495123跟亞太40580999,透過sip trunk跟我們對接,所以我們的public只有這兩個號碼進來才是正常的,其它進來的都是異常的,直接掛斷。這樣做就能起到一定的防護作用,至少你的內部分機不會接到騷擾電話,俗稱"鬼來電" 因為入侵者都是用程式在試分機號,試對分機號了,分機就響了,但程式不會講話,所以就叫鬼來電。這裡也說明了一個很重要的概念,若你的話務進來的方式非跟電信業者直接用sip trunk對接,而是用asterik卡,或voip gateway之類的將PSTN線路透過你的設備進入你的asterisk,你也要注意,不要讓這些話務直接就能撥通你內部的分機,否則你的內部分機就會有鬼來電的困擾,可參考我上面的設定範例。

上面是 dialplan 比較正確的設定方法,可有效的解決鬼來電的問題,但仍沒解決fail2ban不起作用的問題,重點在那個"其它號碼全掛斷"的地方我們要改寫一下,參考底下設定

;其它號碼全掛斷之前,記下它們的IP
exten => _X.,1,Noop(ip:${CHANNEL(recvip)})
 same => n,Log(NOTICE,bad incoming call ip:${SIPCHANINFO(recvip)})
 same => n,Waitexten(3)
 same => n,Hangup
;可用此指令core show function SIPCHANINFO 來看詳細用法
;SIPCHANINFO此指令已棄用,建議改用CHANNEL()
 
exten => t,1,Hangup

按上面的方式,我們就可以把入侵者的IP記錄到log裡了,那些指令都是asterisk內建的指令,所以解法早就有了,只是你會不會運用而已,這就看個人的功力了。

log已有記錄到入侵者的IP了, fail2ban 就能起作用了,當然 fail2ban 你得設定一下才行,新增filter規則之類的。

本篇發表於 voip。將永久鏈結加入書籤。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *