RFC 8898-Third-Party Token-Based Authentication and Authorization for Session Initiation Protocol (SIP)
https://www.rfc-editor.org/rfc/rfc8898
因為此規范的發(fā)布可能會(huì )影響到SIP協(xié)議的支持和一些技術(shù)方面的演進(jìn),雖然,目前的規范內容仍然不是非常具體,框架仍然比較寬泛,但是,筆者認為有必要針對此指導規范做一個(gè)概要說(shuō)明,以便在SIP網(wǎng)絡(luò )的未來(lái)技術(shù)部署時(shí)可以作為一個(gè)有價(jià)值的參考,一些SIP解決方案廠(chǎng)家可以通過(guò)此規范重新設計自己的解決方案。

思科基于OAuth設計的融合通信平臺
在RFC8898中,規范主要介紹了關(guān)于Bearer 令牌的機制要和基于第三方的針對SIP用戶(hù)認證和注冊簽權處理說(shuō)明(使用OAuth 2.0 framework和 OpenID Connect Core 1.0)。
1、介紹
RFC8898中,SIP協(xié)議使用OAuth 2.0框架作為認證機制對SIP用戶(hù)進(jìn)行認證處理,對SIP注冊進(jìn)行簽權進(jìn)行處理。OAuth 2.0使用基于令牌的框架支持OAuth客戶(hù)端對用戶(hù)的資源訪(fǎng)問(wèn)。OpenID Connect Core規范在OAuth協(xié)議基礎上規定了一個(gè)簡(jiǎn)單的身份確認層,它支持OAuth/OpenID客戶(hù)端對基于認證機制的用戶(hù)身份確認。驗證機制是專(zhuān)門(mén)的第三方授權服務(wù)器來(lái)(authorization server,簡(jiǎn)稱(chēng)AS)執行,例如OpenID 提供方(OP),同時(shí)可獲得用戶(hù)的基本信息內容。
在本規范中,用戶(hù)簽權的處理可以支持單個(gè)用戶(hù)登錄,一旦用戶(hù)通過(guò)認證,它可以訪(fǎng)問(wèn)SIP和非SIP服務(wù)資源。
此規范同時(shí)更新了RFC3261中的一些流程,通過(guò)定義UAC流程實(shí)現了更新。當UAC通過(guò)multiple WWW-Authenticate/Proxy-Authenticate 頭文件獲得401/407響應時(shí),同時(shí)對同樣的realm會(huì )使用不同的認證機制進(jìn)行查詢(xún)處理。
在RFC8898中,令牌有不同的類(lèi)型和格式。在第三方的授權服務(wù)器中使用的令牌類(lèi)型取決于授權服務(wù)器的類(lèi)型。OAuth AS可以對一個(gè)成功授權的UAC提供以下令牌:
Access Token: UAC將使用此令牌(此令牌由SIP服務(wù)器提供)訪(fǎng)問(wèn)SIP服務(wù)器資源。
Refresh Token:UAC防止使用此令牌對授權服務(wù)器刷新過(guò)時(shí)令牌。
RFC8898中支持兩種令牌,兩種格式分別為:
- Structured Token:結構化的令牌由一些具體對象構成,包括其和聲明關(guān)聯(lián)的令牌,例如JSON格式,具體定義在RFC7519。
- Reference Token:此令牌有一個(gè)非透明的字符串構成,它用來(lái)獲得令牌的細節,和其聲明關(guān)聯(lián)。具體規范在RFC6749中定義。
在RFC8898中的關(guān)于SIP注冊的流程中,認證機制可以通過(guò)授權服務(wù)器(AS/OP)對注冊請求進(jìn)行簽權處理。在響應消息中401或者407中的頭消息文件使用Bearer機制。SIP通過(guò)AS/OP進(jìn)行注冊處理的具體的示例如下:

UAC通過(guò)AS/OP實(shí)現注冊流程示例
在以上的處理流程中,UAC實(shí)現注冊需要經(jīng)過(guò)七個(gè)步驟:
- UAC對注冊服務(wù)發(fā)送一個(gè)注冊請求,無(wú)任何安全設置信息。
- 注冊服務(wù)對UAC返回一個(gè)響應消息401,并且攜帶Bearer處理機制所要求的驗證消息和AS服務(wù)器地址等。
- UAC直接通過(guò)AS/OP直接和授權服務(wù)器進(jìn)行通信,它們雙方通過(guò)約定的機制進(jìn)行處理,例如使用OAuth Aative App機制(在RFC8252定義)。AS服務(wù)器對UAC進(jìn)行認證處理,然后對UAC提供一個(gè)令牌,UAC可使用此令牌訪(fǎng)問(wèn)SIP服務(wù)資源。
- UAC提供AS獲得的令牌消息,然后和注冊服務(wù)器進(jìn)行提醒注冊請求。注冊請求中包含從AS獲得的令牌信息。
- 注冊服務(wù)通過(guò)UAC的令牌對AS要求進(jìn)行驗證處理。如果此令牌是一個(gè)參考令牌,授權服務(wù)器可能對令牌執行自檢處理,這個(gè)自檢處理由RFC7662定義。
- 自檢處理成功以后,AS對注冊服務(wù)返回一個(gè)200 OK。
- 最后注冊服務(wù)對UAC返回一個(gè) 200 OK。
如果UAC已經(jīng)預設了AS服務(wù)器端的信息的話(huà)。處理流程相對比較簡(jiǎn)單,UAC獲得訪(fǎng)問(wèn)令牌即可。

2、SIP UA中Bearer機制的處理
和RFC3261中關(guān)于Digest認證的處理流程一樣,使用Bearer機制時(shí),SIP UAC,UAS和代理也需要經(jīng)過(guò)多種處理流程。下面筆者分別介紹關(guān)于在UAC,UAS和代理的處理流程中關(guān)于Bearer框架的使用方式。
UAC端的處理包括:獲得令牌和對查詢(xún)的響應處理,保護令牌訪(fǎng)問(wèn),注冊請求和非注冊請求的處理。
根據UAC通過(guò)AS/OP實(shí)現注冊流程示例,在獲得令牌和對查詢(xún)的響應處理過(guò)程中,當UAC在無(wú)安全信息對服務(wù)器發(fā)送請求時(shí),UAC可能收到一個(gè)401(Unauthorized)或者407(Proxy Authentication Required)未授權訪(fǎng)問(wèn)的響應。在其響應消息中,401會(huì )攜帶WWW-Authenticate 頭,407會(huì )攜帶一個(gè)Proxy-Authenticate 頭。在頭中會(huì )指示認證機制使用Bearer,并且包含機制的詳細消息,例如AS服務(wù)器地址。通過(guò)前面所說(shuō)的第二步和第三步獲得令牌的信息。為了獲取到令牌信息,UAC必須檢查在401或者407響應中獲得的AS的地址,通過(guò)對照檢查一組可信任的AS地址獲得令牌訪(fǎng)問(wèn)的安全有效地址,這樣的檢查也是為了防止UAC盲目綁定其他AS資源時(shí)的針對AS地址的安全漏洞,防止訪(fǎng)問(wèn)一些過(guò)期的或非安全保護的AS地址。關(guān)于OAuth2的處理流程不在本規范說(shuō)明的范圍,讀者可以查閱RFC8552和其他相關(guān)的規范來(lái)進(jìn)一步學(xué)習。
獲取到令牌以后,令牌就會(huì )返回到UAC端。返回UAC的令牌的類(lèi)型取決于授權服務(wù)器AS的類(lèi)型。OAuth AS提供訪(fǎng)問(wèn)令牌和刷新令牌(可選)。其中,刷新令牌主要應用于UAC和AS之間。如果AS對UAC端提供了刷新令牌的話(huà),UAC可使用此刷新令牌在當前訪(fǎng)問(wèn)令牌到期之前對AS請求一個(gè)新的訪(fǎng)問(wèn)令牌。如果AS沒(méi)有提供刷新令牌的話(huà),在當前訪(fǎng)問(wèn)令牌到期之前,UAC需要重新對此用戶(hù)執行認證機制。OP返回一個(gè)額外的ID令牌,此ID令牌包含一個(gè)關(guān)于此用戶(hù)認證的聲明信息,此聲明信息是有授權服務(wù)器提供。ID令牌也可以包括其他關(guān)于此用戶(hù)的聲明信息,例如SIP URL,UAC可以使用此URL進(jìn)行注冊流程處理。
如果UAC收到一個(gè)401或者407,此響應中包含多個(gè)WWW- Authenticate/Proxy-Authenticate頭的話(huà),這些頭針對同一realm提供了不同的認證機制的話(huà),UAC基于本地策略對其中一種機制提供安全信息。注意,在RFC8898發(fā)布時(shí),UAC收到多個(gè)認證頭的處理規范還沒(méi)有發(fā)布,在未來(lái)的規范規定中可能會(huì )增加具體的處理機制。
令牌的安全是一個(gè)非常重要的問(wèn)題。RFC6749強制規定了訪(fǎng)問(wèn)令牌的安全策略,訪(fǎng)問(wèn)令牌需要通過(guò)TLS進(jìn)行加密處理。但是,一些讀者可能知道,如果SIP網(wǎng)絡(luò )使用了中間SIP代理服務(wù)器的話(huà),當需要保護SIP信令時(shí),TLS只能保證hop-to-hop之間的加密,簡(jiǎn)單來(lái)說(shuō),就是保證兩個(gè)網(wǎng)絡(luò )跳轉的加密設置。因此,訪(fǎng)問(wèn)令牌必須通過(guò)一種方式對其進(jìn)行安全保護,以便實(shí)現僅授權的SIP服務(wù)器可訪(fǎng)問(wèn)令牌。另外,當訪(fǎng)問(wèn)令牌包含在SIP請求中時(shí),除非有其他的加密方式可以保護訪(fǎng)問(wèn)令牌,允許授權的服務(wù)器訪(fǎng)問(wèn)令牌。否則的話(huà),在支持RFC8898規范的SIP終端必須使用加密的JWTs方式對其進(jìn)行編碼和保護。TLS也可以對SIP終端和AS之間的數據交換進(jìn)行保護。
這里,我們先討論一下注冊請求的處理流程。前面內容中我們已經(jīng)簡(jiǎn)單介紹了如何發(fā)送注冊請求的流程。UAC會(huì )根據收到的訪(fǎng)問(wèn)令牌等消息對注冊服務(wù)器發(fā)送注冊請求。這里要注意,如果收到了多個(gè)認證機制支持的話(huà),UAC可能會(huì )通過(guò)一個(gè)非Bearer機制的方式,使用安全信息重新嘗試注冊。一般情況下,對于一個(gè)新的綁定關(guān)系來(lái)說(shuō),UAC會(huì )獲得一個(gè)新的訪(fǎng)問(wèn)令牌。但是,因為可能支持本地策略設置,UAC可能會(huì )包含一個(gè)訪(fǎng)問(wèn)令牌,此訪(fǎng)問(wèn)令牌用來(lái)支持請求中同一AOR的其他的綁定關(guān)聯(lián)。如果包含在注冊請求中的訪(fǎng)問(wèn)令牌沒(méi)有被接受,UAC收到了401或者407響應的話(huà),UAC需要重新執行獲取令牌的流程。
前面我們討論了注冊請求的處理流程。如果是一個(gè)非注冊請求的話(huà),UAC發(fā)送請求時(shí)必須包含一個(gè)Authorization 頭,在此頭中必須聲明Bearer機制。Bearer機制中包含一個(gè)有效的訪(fǎng)問(wèn)令牌,此令牌是通過(guò)AS查詢(xún)請求中AS標識的訪(fǎng)問(wèn)令牌。基于本地策略,如果新請求的目的地是同樣的,UAC可以包含一個(gè)訪(fǎng)問(wèn)令牌,這個(gè)訪(fǎng)問(wèn)令牌已在其他dialog或者其他獨立的請求中使用過(guò)的。如果包含在注冊請求中的訪(fǎng)問(wèn)令牌沒(méi)有被接受,UAC收到了401或者407響應的話(huà),UAC需要重新執行獲取令牌的流程。
討論了UAC端的處理以后,我們繼續討論UAS的處理。根據前面的注冊流程步驟的示例,當UAS或者注冊服務(wù)收到注冊請求,UAC沒(méi)有包含認證所需的安全信息以后,UAS/注冊服務(wù)應該回復UAC一個(gè)401響應。如果UAS/注冊服務(wù)驗證此請求,并且接受以訪(fǎng)問(wèn)令牌的方式作為安全措施進(jìn)行驗證的話(huà),UAS或者注冊服務(wù)必須在返回的響應消息中包含一個(gè)WWW-Authenticate 頭,在此頭中標識出Bearer機制聲明,并且包含一個(gè)AS地址,此地址解析方式根據RFC7230規范解析。UAC將來(lái)會(huì )從此AS地址獲得訪(fǎng)問(wèn)令牌。
當UAS或者注冊服務(wù)收到一個(gè)SIP請求,請求中包含Authorization頭,攜帶了訪(fǎng)問(wèn)令牌的話(huà),UAS或者注冊服務(wù)必須驗證訪(fǎng)問(wèn)令牌,訪(fǎng)問(wèn)令牌的驗證流程根據訪(fǎng)問(wèn)令牌的類(lèi)型進(jìn)行不同的處理。具體關(guān)于訪(fǎng)問(wèn)令牌的處理流程查閱RFC7519。如果請求中提供的令牌是一個(gè)過(guò)期的訪(fǎng)問(wèn)令牌,UAS或者注冊服務(wù)必須對UAC回復一個(gè)401響應。如果訪(fǎng)問(wèn)令牌驗證成功通過(guò)對話(huà),UAS或者注冊服務(wù)可以繼續執行其他接下來(lái)正常的SIP流程。如果訪(fǎng)問(wèn)令牌驗證失敗,UAS或者注冊服務(wù)必須返回一個(gè)401響應。
前面,我們討論了UAC端和UAS端關(guān)于訪(fǎng)問(wèn)令牌的處理流程。接下來(lái),我們繼續討論關(guān)于SIP代理的處理流程。當SIP代理收到一個(gè)SIP請求,沒(méi)有攜帶任何安全信息時(shí),SIP代理服務(wù)器應該返回一個(gè)407的響應消息(Proxy Authentication Required)。如果SIP代理服務(wù)器提供驗證服務(wù),并且接受以訪(fǎng)問(wèn)令牌的方式作為安全設置的話(huà),SIP代理服務(wù)器應該在407的返回消息中包含一個(gè)Proxy-Authenticate頭,并且標識出Bearer機制和AS的訪(fǎng)問(wèn)地址。此地址解析方式根據RFC7230規范解析。UAC將來(lái)會(huì )從此AS地址獲得訪(fǎng)問(wèn)令牌。當SIP代理希望驗證收到的請求時(shí),SIP代理服務(wù)器會(huì )查詢(xún)Proxy-Authorization中realm參數值來(lái)匹配其realm地址。代理服務(wù)器必須至少成功匹配一個(gè)Proxy-Authorization中的安全地址。當驗證機制是Bearer時(shí),SIP代理服務(wù)器必須驗證訪(fǎng)問(wèn)令牌,驗證訪(fǎng)問(wèn)令牌的流程根據訪(fǎng)問(wèn)令牌的類(lèi)型來(lái)決定(structured 或者 reference 令牌)。
3、訪(fǎng)問(wèn)Token Claims
讀者應該知道,訪(fǎng)問(wèn)令牌是用來(lái)訪(fǎng)問(wèn)不同的資源的。訪(fǎng)問(wèn)令牌可以訪(fǎng)問(wèn)的服務(wù)類(lèi)型是根據不同的方式來(lái)決定。這些訪(fǎng)問(wèn)方式是由令牌基于本地策略提供的,本地策略則是由AS和注冊服務(wù)共同協(xié)商同意的結果。具體的協(xié)商內容需要授權服務(wù)器和注冊服務(wù)器雙方進(jìn)行核實(shí)驗證。
如果訪(fǎng)問(wèn)令牌被解碼為JWT格式,它會(huì )包含一個(gè)聲明列表(claim),其中包含已注冊狀態(tài)信息的和應用級的聲明。注冊服務(wù)授權聲明中對象訪(fǎng)問(wèn)授權的服務(wù)。如果訪(fǎng)問(wèn)令牌是一個(gè)參考令牌的話(huà),注冊服務(wù)會(huì )被允許基于其他的機制來(lái)進(jìn)行訪(fǎng)問(wèn)。其他的機制包括自檢機制和用戶(hù)屬性查詢(xún)等。
4、響應頭-WWW-Authenticate
在401或者407的響應中,Bearer機制的標識是通過(guò)認證頭來(lái)進(jìn)行傳輸的。具體的用法格式和HTTP的類(lèi)似。如果基于Bearer認證機制支持的話(huà),UAC收到的Bearer消息頭用法應該和以下語(yǔ)法相似:
challenge =/ ("Bearer" LWS bearer-cln *(COMMA bearer-cln))
bearer-cln = realm / scope-param / authz-server-param / error-param /
auth-param
realm =
scope-param = "scope" EQUAL DQUOTE scope DQUOTE
scope =
authz-server-param = "authz_server" EQUAL DQUOTE authz-server DQUOTE
authz-server = https-URI
https-URI =
error-param = "error" EQUAL DQUOTE error DQUOTE
error =
auth-param =
其中比較重要的包括:authz_server parameter,authz_server和error消息。讀者可以根據RFC規范做進(jìn)一步了解,這里不再累述。
5、Bearer機制的安全考慮
安全問(wèn)題是一個(gè)非常重要的因素。如果協(xié)議或者規范設計不當會(huì )給系統帶來(lái)很多的安全隱患和技術(shù)漏洞。安全問(wèn)題存在很多討論的空間。在前面的章節中筆者已經(jīng)說(shuō)明了使用TLS加密的傳輸方式。這里不再過(guò)多討論。其他方面的安全設置都通過(guò)不同的規范來(lái)規定,其中OAuth在RFC6749做了規定,Bearer的令牌的安全規范在RFC6750有細節說(shuō)明,JWT的安全規范通過(guò)RFC7519做了規定。這些規范都支持了SIP協(xié)議中通過(guò)訪(fǎng)問(wèn)令牌實(shí)現的安全機制。
Single Sign-On (SSO),單點(diǎn)登錄的驗證方式是SIP終端使用的一個(gè)比較常用的場(chǎng)景。SSO可以支持用戶(hù)一次登錄驗證,使用訪(fǎng)問(wèn)令牌來(lái)獲取SIP和其非SIP的服務(wù)。這里,SSO就會(huì )存在一個(gè)比較寬泛的訪(fǎng)問(wèn)范圍,如果SSO模式存在潛在風(fēng)險的話(huà),SIP和其他非SIP服務(wù)就會(huì )存在比較大的安全風(fēng)險。因為SSO的中國問(wèn)題,所以,規范必須規定一個(gè)針對SSO非常嚴格的安全設置方式,例如包括一個(gè)比較長(cháng)的passphrase替代密碼,支持多要素的認證機制和使用原生瀏覽器的安全設置。
在應用層級方面,如果UAC注冊時(shí),在注冊請求中,注冊服務(wù)器可以提供不同層級的服務(wù)級別。RFC8898推薦在響應消息中包含一個(gè)服務(wù)的級別scope來(lái)表示其訪(fǎng)問(wèn)的層級。當然,通過(guò)scope的修改,AS也可以提供更高級別的訪(fǎng)問(wèn)權限。對于SIP用戶(hù)和應用級程序是一個(gè)非常好的安全保護,管理員也可以通過(guò)scope授權的方式允許某些SIP 用戶(hù)訪(fǎng)問(wèn)某些特定的應用服務(wù)。
網(wǎng)絡(luò )漏洞是經(jīng)常發(fā)生的。攻擊者可能會(huì )專(zhuān)門(mén)制造出一些非法的AS服務(wù)器地址來(lái)引誘UAC進(jìn)行訪(fǎng)問(wèn)。因此,UAC必須檢查AS的有效性,保證UAC訪(fǎng)問(wèn)正確的AS服務(wù)器,避免網(wǎng)絡(luò )漏洞帶來(lái)的安全隱患。
6、總結
本文章重點(diǎn)介紹SIP新的認證機制Bearer的使用和其和AS/OP進(jìn)行交互的詳解流程。通過(guò)OAuth的方式進(jìn)行用戶(hù)驗證是目前互聯(lián)網(wǎng)技術(shù)中常用的技術(shù)手段,如果今后使用在SIP協(xié)議的用戶(hù)認證流程將會(huì )影響SIP業(yè)務(wù)的處理也會(huì )幫助其他應用級產(chǎn)品的權限訪(fǎng)問(wèn)和服務(wù)控制。
筆者完整介紹了其核心概念和針對UAC,UAS和代理服務(wù)器的處理流程,并且特別針對401和407響應處理做了說(shuō)明。最后,針對部署bearer機制帶來(lái)的安全問(wèn)題進(jìn)行了討論。目前,RFC8898規范是一個(gè)非常新的規范,很多處理細節和SIP業(yè)務(wù)廠(chǎng)家需要進(jìn)行升級才能滿(mǎn)足RFC8898的要求,因此,我們還要繼續等待SIP服務(wù)提供商和服務(wù)器開(kāi)發(fā)平臺首先支持此規范,以后我們才能把令牌訪(fǎng)問(wèn)等技術(shù)應用在具體的SIP網(wǎng)絡(luò )場(chǎng)景中。
參考資料:
https://www.rfc-editor.org/rfc/rfc8898
https://www.rfc-editor.org/rfc/rfc6750.txt
https://www.rfc-editor.org/rfc/rfc7662.txt
https://blog.restcase.com/4-most-used-rest-api-authentication-methods/
https://www.cisco.com/c/dam/en/us/td/docs/voice_ip_comm/jabber/11_9/Unified-CM-OAuth-Whitepaper-v17-FINAL.pdf
融合通信/IPPBX/FreePBX商業(yè)解決方案:www.hiastar.com
最新Asterisk完整中文用戶(hù)手冊詳解:www.asterisk.org.cn
Freepbx/FreeSBC技術(shù)文檔: www.freepbx.org.cn
如何使用FreeSBC,qq技術(shù)分享群:334023047
關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的通信行業(yè)技術(shù)分享