從多個(gè)應(yīng)用環(huán)境和其部署優(yōu)勢(shì)來(lái)說(shuō),SBC是目前解決SIP安全問(wèn)題最有效的手段。SBC作為一個(gè)網(wǎng)絡(luò)邊界安全控制手段,IPPBX部署在內(nèi)網(wǎng)環(huán)境中,徹底將IPPBX的網(wǎng)絡(luò)拓?fù)潆[藏在內(nèi)網(wǎng)環(huán)境中。這樣就起到了安全的作用。因?yàn)镾BC的部署,很多外網(wǎng)終端或者移動(dòng)終端,如果需要呼叫內(nèi)網(wǎng)的IPPBX時(shí),SBC和下游的其他服務(wù)器就會(huì)對(duì)SIP用戶進(jìn)行身份確認(rèn)。通常情況下,SIP呼叫使用了 Authentication Digest 的方式來(lái)進(jìn)行身份認(rèn)證。
筆者在以前的文章中多次介紹了SBC的作用和其應(yīng)用場(chǎng)景,和關(guān)于SBC部署協(xié)議的文章,讀者可以查閱。
目前使用SBC的場(chǎng)景很多,包括SIP trunk對(duì)接,遠(yuǎn)端外網(wǎng)SIP終端注冊(cè),呼叫,運(yùn)營(yíng)商之間的對(duì)接服務(wù),IPPBX托管中心的SBC對(duì)接。因此,使用配置方式也有所不同,不同的配置需要不同的認(rèn)證方式來(lái)實(shí)現(xiàn)。以下是幾個(gè)典型的示例:

運(yùn)營(yíng)商SIP trunk對(duì)接企業(yè)SBC


托管IPPBX通過(guò)SBC對(duì)接外網(wǎng)企業(yè)電話終端


運(yùn)營(yíng)商之間SBC對(duì)接


微軟365對(duì)接SBC
今天,我們針對(duì)外網(wǎng)呼叫環(huán)境中關(guān)于SBC和其他下游服務(wù)器的認(rèn)證方式進(jìn)行一個(gè)比較詳細(xì)的分析,希望幫助讀者能夠徹底了解SBC配合IPPBX進(jìn)行身份認(rèn)證的流程機(jī)制,以便能夠在SBC部署時(shí)能夠及時(shí)排查問(wèn)題。
在下面的示例中,我們可以看到外網(wǎng)遠(yuǎn)端用戶呼叫SBC,然后呼叫到企業(yè)內(nèi)網(wǎng)IPPBX的典型示例(用戶可以下載免費(fèi)FreeSBC在阿里云部署,并且配合IPPBX或者免費(fèi)開源的freepbx實(shí)現(xiàn)外網(wǎng)注冊(cè)功能):

在以上示例中,SBC部署在企業(yè)網(wǎng)絡(luò)的邊界處,內(nèi)網(wǎng)IPPBX實(shí)現(xiàn)應(yīng)用功能。但是,還有一些企業(yè)內(nèi)網(wǎng)的部署環(huán)境,因?yàn)闃I(yè)務(wù)控制復(fù)雜的原因,可能增加了代理服務(wù)器的處理,然后下掛多個(gè)IPPBX。

簡(jiǎn)單來(lái)說(shuō),在這種典型的外網(wǎng)呼叫的場(chǎng)景中,外網(wǎng)的SIP賬號(hào)首先需要對(duì)SBC發(fā)起一個(gè)INVITE,然后雙方通過(guò)Authentication Digest 認(rèn)證確認(rèn)。如果SBC通過(guò)了外網(wǎng)用戶Alice的呼叫認(rèn)證,則SBC繼續(xù)對(duì)內(nèi)網(wǎng)Proxy發(fā)送P-Asserted-Identity,然后IPPBX確認(rèn)其身份以后,雙方SIP分機(jī)創(chuàng)建呼叫流程。為了說(shuō)明以上示例的流程,我們會(huì)分步介紹每個(gè)階段使用的認(rèn)證方式和SIP信令的處理。
1、Digest Authentication相關(guān)概念
在介紹整個(gè)SIP user authentication的處理機(jī)制之前,我們首先介紹幾個(gè)和認(rèn)證相關(guān)的概念。這些概念可以幫助讀者能夠快速了解認(rèn)證的基礎(chǔ)知識(shí)。SIP認(rèn)證的方式場(chǎng)景有兩種,一種是代理,轉(zhuǎn)發(fā)服務(wù)或者注冊(cè)服務(wù)器對(duì)UA的認(rèn)證;另外一種是UA之間的互相認(rèn)證。
我們文章中使用的是Digest Authentication的認(rèn)證機(jī)制,這種機(jī)制相對(duì)比較簡(jiǎn)單,它基于HTTP的一種質(zhì)疑/響應(yīng)的模式。一方會(huì)對(duì)另一方發(fā)送質(zhì)疑詢問(wèn),另外一方則通過(guò)響應(yīng)的方式來(lái)應(yīng)答核實(shí)其身份。
研究人員QiQiu的研究生文章Digest Authentication Report有關(guān)于認(rèn)證流程和SIP學(xué)習(xí)的文章的介紹,讀者可以下載閱讀:
Digest Authentication Report
https://www.site.uottawa.ca/~bob/gradstudents/DigestAuthenticationReport.pdf
Digest Authentication使用了MD5 hash算法對(duì)用戶名稱,密碼,realm和Digest URL計(jì)算出一個(gè)哈希值,服務(wù)器端生成一個(gè)一次性的nonce,雙方對(duì)比最終的reponse值確認(rèn)其身份。因?yàn)槠蛢?nèi)容重點(diǎn)不同,我們這里僅簡(jiǎn)單介紹其背景基礎(chǔ)知識(shí),RFC2069給出了非常完整的示例,讀者可以對(duì)其流程細(xì)節(jié)做進(jìn)一步的了解。
關(guān)于如何計(jì)算這些哈希值,讀者可以通過(guò)很多網(wǎng)絡(luò)工具做計(jì)算,發(fā)布讀者在實(shí)際場(chǎng)景中能夠完整了解response的生成。示例是如何計(jì)算reponse值:

根據(jù)以上工具,在實(shí)際的SIP注冊(cè)消息中也同樣生成了和工具計(jì)算相同的值:

具體雙方生成生成響應(yīng)的處理流程,讀者可以參考以下示例:

在Linux環(huán)境下,用戶可以使用MD5的命令來(lái)生成響應(yīng)消息內(nèi)容,工具也非常簡(jiǎn)單易用:


在RFC2617中,為了增加安全認(rèn)證的可靠性,支持了客戶端生成的nonce和QoP。具體的實(shí)現(xiàn)方式如下:
Response = MD5(H1 : nonce : nonceCount : nonceClient : QoP : H2)
筆者不是安全方面的專家,如果讀者想進(jìn)一步學(xué)習(xí)關(guān)于SIP安全認(rèn)證的相關(guān)話題,網(wǎng)絡(luò)上有很多關(guān)于SIP Digest 認(rèn)證的討論和MD5安全分析,讀者可以參考相關(guān)鏈接來(lái)進(jìn)一步學(xué)習(xí)。

2、SIP呼叫/SBC/Proxy/IPPBX流程
通過(guò)上一個(gè)章節(jié)對(duì)SIP認(rèn)證的基本介紹和其認(rèn)證機(jī)制的討論,讀者應(yīng)該可以理解基本的認(rèn)證原理。接下來(lái),我們會(huì)比較詳細(xì)地結(jié)合實(shí)際的示例來(lái)進(jìn)一步分析其細(xì)節(jié)過(guò)程。
這里提醒讀者,以上示例僅說(shuō)明了身份認(rèn)證機(jī)制的流程,并沒(méi)有包括我們具體討論的具體的其他部署的服務(wù),例如SBC,代理和IPPBX等SIP服務(wù)器。具體的環(huán)境中,我們將涉及SBC,代理和IPPBX,也可能僅包括SBC和IPPBX本身。


在以上的示例中,首先外網(wǎng)SIP終端需要對(duì)SBC發(fā)起一個(gè)INVITE請(qǐng)求,SBC回復(fù)407或者401對(duì)其終端進(jìn)行核實(shí)認(rèn)證。外網(wǎng)SIP呼叫通過(guò)SBC認(rèn)證后,SBC對(duì)Proxy發(fā)送認(rèn)證P-Asserted-Identity,如果通過(guò)則繼續(xù)其他的流程,包括代理對(duì)終端的再次雙方確認(rèn)和IPPBX對(duì)分機(jī)的身份確認(rèn)等流程。這里,因?yàn)槠年P(guān)系,我們重點(diǎn)介紹外網(wǎng)SIP呼叫中SBC的身份認(rèn)證過(guò)程,SBC對(duì)代理或IPPBX的P-Asserted-Identity身份確認(rèn),代理對(duì)SIP分機(jī)的認(rèn)證機(jī)制。其他步驟基本上重復(fù)了代理對(duì)分機(jī)的認(rèn)證流程,所以不再做過(guò)多討論。
接下來(lái),我們就指定具體的關(guān)于外網(wǎng)SIP終端如何通過(guò)SBC呼叫內(nèi)網(wǎng)IPPBX分機(jī)做一個(gè)詳細(xì)介紹。大家知道,SBC是對(duì)呼叫方身份認(rèn)證的第一道防線。首先呼叫方對(duì)SBC發(fā)送INVITE,SBC返回407 帶nonce,僅支持本呼叫方,僅使用一次的驗(yàn)證nonce。呼叫方收到以后,返回ACK。緊接著,使用這個(gè)nonce結(jié)合用戶名稱和密碼計(jì)算出response,SBC也同時(shí)計(jì)算出這個(gè)response。如果雙方的resposne一致,說(shuō)明呼叫方可以通過(guò)SBC的身份驗(yàn)證。下面的章節(jié)中,我們重點(diǎn)對(duì)外網(wǎng)呼叫SBC時(shí)的認(rèn)證過(guò)程做一個(gè)討論。
3、外網(wǎng)SIP呼叫SBC端身份認(rèn)證
在上面的介紹中,我們知道外網(wǎng)SIP分機(jī)如果呼叫企業(yè)邊界的SBC時(shí),首先需要SBC對(duì)其身份進(jìn)行核實(shí)認(rèn)證。通過(guò)其身份認(rèn)證機(jī)制,才能保證外網(wǎng)呼叫SBC是一個(gè)安全的呼叫,否則SBC不會(huì)允許外網(wǎng)的任何SIP終端呼叫內(nèi)網(wǎng)的IPPBX,解決了內(nèi)網(wǎng)的IPPBX的安全問(wèn)題。現(xiàn)在,讓我們看看外網(wǎng)SIP是如何一步步進(jìn)行呼叫驗(yàn)證,最終完成外網(wǎng)SIP分機(jī)和SBC之間的身份確認(rèn)流程的。
首先,外網(wǎng)SIP分機(jī)呼叫SBC,SBC返回一個(gè)407 響應(yīng)。這里的響應(yīng)消息中攜帶了SBC生成的nonce值,結(jié)合外網(wǎng)SIP的realm等參數(shù)計(jì)算的結(jié)果。讀者一定要注意Proxy-Authenticate Digest中所包括對(duì)計(jì)算參數(shù)。

其次,外網(wǎng)SIP分機(jī)收到401或者407響應(yīng)后,緊接著對(duì)SBC發(fā)送一個(gè)ACK,確認(rèn)收到407響應(yīng)。然后,SIP分機(jī)馬上對(duì)SBC再次發(fā)送一個(gè)新的INVITE請(qǐng)求(注意下面示例中的Call-ID是完全不同的ID),這次的請(qǐng)求中攜帶了SIP分機(jī)所生成的所有驗(yàn)證的相關(guān)消息。這里,最重要的步驟是外網(wǎng)SIP分機(jī)根據(jù)SBC返回的nonce結(jié)合本地SIP賬號(hào)信息,使用MD5計(jì)算出的response。在INVITE中發(fā)送了生成的response結(jié)果。

最后,筆者在下圖中給出了SBC計(jì)算response的計(jì)算流程。在SBC邊界控制器中,SBC根據(jù)407的生成的nonce, 結(jié)合上次收到的用戶賬號(hào)消息,計(jì)算出SBC本地生成的response(42ceXXXX),然后對(duì)比SIP分機(jī)INVITE中包含的response(42ceXXXXX)結(jié)果,如果兩個(gè)結(jié)果是一樣的,說(shuō)明外網(wǎng)SIP終端的呼叫身份是安全的,可以認(rèn)為是成功的驗(yàn)證,SBC則允許SIP呼叫通過(guò)SBC服務(wù)器端。

通過(guò)雙方response的結(jié)果對(duì)比,SBC確認(rèn)了這個(gè)外網(wǎng)SIP呼叫的安全性,因此,SBC可以允許這個(gè)INVITE呼叫繼續(xù)進(jìn)入到Proxy的節(jié)點(diǎn)上。
4、SBC到Proxy使用P-Asserted-Identity
根據(jù)上一節(jié)點(diǎn)介紹,SBC通過(guò)response的結(jié)果對(duì)比,確認(rèn)了這個(gè)呼叫的身份,所以,SBC就會(huì)把這個(gè)請(qǐng)求繼續(xù)轉(zhuǎn)發(fā)到Proxy的處理中。這里筆者提醒讀者,一般來(lái)說(shuō),SBC的下游服務(wù)器可能直接面對(duì)的是IPPBX或其他SIP服務(wù)器,因?yàn)闃I(yè)務(wù)的關(guān)系,這里的示例中增加了Proxy的處理,事實(shí)上,SBC也可以直接面對(duì)IPPBX應(yīng)用服務(wù)器。
盡管大部分情況下,內(nèi)網(wǎng)的Proxy對(duì)SBC的身份是信任的。但是,因?yàn)镾BC是一個(gè)網(wǎng)絡(luò)邊界設(shè)備,所以,Proxy很多情況下也需要對(duì)SBC發(fā)送過(guò)來(lái)的呼叫進(jìn)行二次確認(rèn)。在SBC對(duì)Proxy的身份確認(rèn)中,通常SBC會(huì)對(duì)Proxy發(fā)送一個(gè)P-Asserted-Identity header參數(shù),表示其SIP呼叫是從SBC過(guò)來(lái)的,對(duì)這個(gè)呼叫攜帶一個(gè)新的數(shù)值,SBC已經(jīng)對(duì)其進(jìn)行了身份確認(rèn),其用戶是可信任的,請(qǐng)求Proxy通過(guò)這個(gè)SIP呼叫的身份確認(rèn)。Proxy看到是SBC過(guò)來(lái)的可信任的SIP呼叫,對(duì)比Proxy自己保存的AOR值,Proxy就會(huì)通過(guò)這個(gè)認(rèn)證。
注意,這里的認(rèn)證僅是Proxy對(duì)SBC的確認(rèn)過(guò)程,并不能確認(rèn)Proxy是絕對(duì)信任這個(gè)呼叫的,不是Proxy對(duì)外網(wǎng)SIP呼叫的認(rèn)證。Proxy或者IPPBX還會(huì)繼續(xù)對(duì)SIP呼叫進(jìn)行認(rèn)證。在后續(xù)的內(nèi)容中,我們繼續(xù)介紹Proxy對(duì)SIP呼叫的身份確認(rèn)。

在前面的討論中,我們涉及了P-Asserted-Identity,一般的SBC都支持通過(guò)P-Asserted-Identity認(rèn)證的方式。具體的官方定義如下(RFC3255-9.1):
The P-Asserted-Identity header field is used among trusted SIP entities (typically intermediaries) to carry the identity of the user sending a SIP message as it was verified by authentication.
https://www.ietf.org/rfc/rfc3325.txt
P-Asserted-Identity不是一個(gè)標(biāo)準(zhǔn)的SIP core規(guī)范,它是一個(gè)私有的RFC3325。但是大部分的SBC設(shè)備軟件使用這個(gè)參數(shù)來(lái)確認(rèn)SIP用戶的安全認(rèn)證。另外,在很多配置場(chǎng)景中,我們可能會(huì)看到另外一個(gè)配置參數(shù)p-preferred-identity,它和P-Asserted-Identity有一些區(qū)別,很多讀者可能非常迷惑。關(guān)于兩者之間的區(qū)別,讀者可以查閱此鏈接:
http://www.sharetechnote.com/html/Handbook_IMS_SIP_Param_P_Prefered_Identity.html
以上兩種headers其實(shí)都來(lái)自于IMS規(guī)范中的P-CSCF SIP headers, SBC為了獲得很好的兼容性,當(dāng)然也需要支持這些headers:
- P-Called-Party-ID Header
- P-Orig-CA Header
- P-Charging-Vector Header
- P-Charging-Function-Addresses Header
- P-Associated-URI Header
- P-Visited-Network-ID Header
- P-Access-Network-Info Header
- P-Preferred-Identity and P-Asserted-Identity Header
- P-Charge-Info Header
- P-Sig-Info Header
另外,關(guān)于P-Asserted-Identity的使用可以成為一個(gè)比較大的話題,很多技術(shù)論文專門對(duì)其使用場(chǎng)景有非常深入的討論,筆者水平有限,不能非常完整地給出這方面權(quán)威的結(jié)論。如果讀者有興趣做深入研究,可以查閱此論文:
Updates to Asserted Identity in the Session Initiation Protocol (SIP)
https://tools.ietf.org/id/draft-ietf-sipping-update-pai-08.html#rfc.section.3.1
5、Proxy對(duì)SIP呼叫地址的再次驗(yàn)證
在以上的討論中,SBC通過(guò)了Proxy的認(rèn)證,確認(rèn)其呼叫是可信任的。但是,很多情況下,因?yàn)镾BC和外網(wǎng)SIP呼叫都處于外網(wǎng)的邊界處,Proxy對(duì)外網(wǎng)進(jìn)入到呼叫地址重新驗(yàn)證。Proxy再次對(duì)SIP終端回復(fù)407,重新驗(yàn)證。這次驗(yàn)證的流程和SBC對(duì)SIP驗(yàn)證的流程是一樣的,需要根據(jù)雙方生成的response來(lái)判斷SIP呼叫身份。
6、IPPBX對(duì)外網(wǎng)SIP呼叫的身份認(rèn)證
根據(jù)以上幾個(gè)步驟的驗(yàn)證,現(xiàn)在身份驗(yàn)證流程可以繼續(xù)進(jìn)行到IPPBX的節(jié)點(diǎn)上了。在上面的介紹中,Proxy需要再次確認(rèn)外網(wǎng)的地址身份,再次對(duì)外網(wǎng)的呼叫重新經(jīng)過(guò)407認(rèn)證以后,SIP終端通過(guò)了認(rèn)證。接下來(lái),Proxy才會(huì)繼續(xù)對(duì)下游IPPBX發(fā)送INVITE請(qǐng)求,IPPBX可能根據(jù)自己本身的認(rèn)證設(shè)置,再次對(duì)SIP呼叫進(jìn)行407認(rèn)證。所以,IPPBX需要重新對(duì)SIP終端結(jié)合本次呼叫,此用戶通過(guò)生成的nonce,再次進(jìn)行雙方的response結(jié)果對(duì)比流程,重新執(zhí)行一次在Proxy認(rèn)證時(shí)的流程。
其邏輯流程和上面的基本一樣,所以這里不再列出。以上示例僅簡(jiǎn)單說(shuō)明最后一步流程的處理方式。雙方通過(guò)了IPPBX端的認(rèn)證。然后,IPPBX對(duì)雙方終端創(chuàng)建呼叫連接,雙方成功通話,到此,外網(wǎng)的SIP終端就可以和內(nèi)網(wǎng)的SIP終端進(jìn)行通話。一個(gè)完整的外網(wǎng)SIP呼叫通過(guò)SBC認(rèn)證,IPPBX的認(rèn)證的呼叫流程正式形成。
7、總結(jié)
在本次討論中,筆者專門針對(duì)外網(wǎng)SIP呼叫SBC和內(nèi)網(wǎng)IPPBX的呼叫流程做了比較詳細(xì)地分析。首先,筆者介紹了SBC對(duì)SIP的407的認(rèn)證機(jī)制和關(guān)于nonce和response,MD5的核實(shí)流程。然后,筆者再次介紹了SBC對(duì)內(nèi)網(wǎng)Proxy通過(guò)P-Asserted-Identity頭聲明其用戶身份的機(jī)制,并且簡(jiǎn)單介紹了關(guān)于P-CSCF SIP的幾個(gè)核心概念。接下來(lái),筆者介紹了Proxy和IPPBX對(duì)SIP分機(jī)呼叫的407認(rèn)證流程,最后,筆者介紹了IPPBX到內(nèi)網(wǎng)終端的呼叫創(chuàng)建。
讀者可以看到,整個(gè)呼叫流程中,SBC扮演著核心身份認(rèn)證的作用,它是SIP網(wǎng)絡(luò)環(huán)境中第一道安全機(jī)制,因此需要用戶特別注意。此外,因?yàn)榄h(huán)境配置的復(fù)雜性和外網(wǎng)用戶的身份和地址等問(wèn)題,需要經(jīng)過(guò)多次驗(yàn)證才能完全保證外網(wǎng)呼叫的安全。
最后,SBC的配置場(chǎng)景很多,需要根據(jù)不同的場(chǎng)景做針對(duì)性的測(cè)試,因此,筆者僅說(shuō)明了外網(wǎng)SIP呼叫的認(rèn)證機(jī)制,其他方面的內(nèi)容沒(méi)有過(guò)多涉及,希望讀者自己根據(jù)基本的機(jī)制做補(bǔ)充學(xué)習(xí)。當(dāng)然,讀者也可以下載我們合作伙伴FreeSBC的免費(fèi)SBC系統(tǒng),在阿里云部署,并且結(jié)合自己的IPPBX直接對(duì)接測(cè)試。
參考資料:
https://www.vocal.com/sip-2/sip-user-authentication/
https://arxiv.org/ftp/arxiv/papers/1209/1209.1075.pdf
https://en.wikipedia.org/wiki/Challenge%E2%80%93response_authentication
https://github.com/miconda/md5ha1
https://allenluker.wordpress.com/2014/07/16/sip-digest-authentication-part-1-sip-registration-method/
https://www.sipsorcery.com/mainsite/Help/SIPPasswordSecurity
https://docs.telcobridges.com/tbwiki/FreeSBC:Remote_Workers
作者簡(jiǎn)介
朱利中(james.zhu)先生供職于深圳星昊通科技有限公司,從事技術(shù)市場(chǎng)推廣工作。在Asterisk開源領(lǐng)域服務(wù)10年,在國(guó)外學(xué)習(xí)工作9年。先后任職于Digium亞太合作伙伴公司,OpenVOX,深圳鼎信通達(dá)有限公司。在2010年,朱利中和合作伙伴聯(lián)合發(fā)起舉辦了第一屆Asterisk中國(guó)官方大會(huì),負(fù)責(zé)VOIP88 開源技術(shù)社區(qū)維護(hù),并聯(lián)合發(fā)布了Elastix中文版本,個(gè)人翻譯發(fā)布了第一本FreePBX使用指南。 目前負(fù)責(zé)Sangoma 亞太地區(qū)的銷售和市場(chǎng)推廣工作。

作者簡(jiǎn)介
朱利中(james.zhu)先生供職于深圳星昊通科技有限公司,從事技術(shù)市場(chǎng)推廣工作。在Asterisk開源領(lǐng)域服務(wù)10年,在國(guó)外學(xué)習(xí)工作9年。先后任職于Digium亞太合作伙伴公司,OpenVOX,深圳鼎信通達(dá)有限公司。在2010年,朱利中和合作伙伴聯(lián)合發(fā)起舉辦了第一屆Asterisk中國(guó)官方大會(huì),負(fù)責(zé)VOIP88 開源技術(shù)社區(qū)維護(hù),并聯(lián)合發(fā)布了Elastix中文版本,個(gè)人翻譯發(fā)布了第一本FreePBX使用指南。 目前負(fù)責(zé)Sangoma 亞太地區(qū)的銷售和市場(chǎng)推廣工作。



關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
Asterisk freepbx 中文官方論壇:http://bbs.freepbx.cn/forum.php
Asterisk freepbx技術(shù)文檔: www.freepbx.org.cn
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk/FreePBX中國(guó)合作伙伴,官方qq技術(shù)分享群(3000千人):589995817
Asterisk freepbx 中文官方論壇:http://bbs.freepbx.cn/forum.php
Asterisk freepbx技術(shù)文檔: www.freepbx.org.cn
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk/FreePBX中國(guó)合作伙伴,官方qq技術(shù)分享群(3000千人):589995817