RFC 8898-Third-Party Token-Based Authentication and Authorization for Session Initiation Protocol (SIP)
https://www.rfc-editor.org/rfc/rfc8898
因?yàn)榇艘?guī)范的發(fā)布可能會(huì)影響到SIP協(xié)議的支持和一些技術(shù)方面的演進(jìn),雖然,目前的規(guī)范內(nèi)容仍然不是非常具體,框架仍然比較寬泛,但是,筆者認(rèn)為有必要針對(duì)此指導(dǎo)規(guī)范做一個(gè)概要說明,以便在SIP網(wǎng)絡(luò)的未來技術(shù)部署時(shí)可以作為一個(gè)有價(jià)值的參考,一些SIP解決方案廠家可以通過此規(guī)范重新設(shè)計(jì)自己的解決方案。
思科基于OAuth設(shè)計(jì)的融合通信平臺(tái)
在RFC8898中,規(guī)范主要介紹了關(guān)于Bearer 令牌的機(jī)制要和基于第三方的針對(duì)SIP用戶認(rèn)證和注冊(cè)簽權(quán)處理說明(使用OAuth 2.0 framework和 OpenID Connect Core 1.0)。
1、介紹
RFC8898中,SIP協(xié)議使用OAuth 2.0框架作為認(rèn)證機(jī)制對(duì)SIP用戶進(jìn)行認(rèn)證處理,對(duì)SIP注冊(cè)進(jìn)行簽權(quán)進(jìn)行處理。OAuth 2.0使用基于令牌的框架支持OAuth客戶端對(duì)用戶的資源訪問。OpenID Connect Core規(guī)范在OAuth協(xié)議基礎(chǔ)上規(guī)定了一個(gè)簡(jiǎn)單的身份確認(rèn)層,它支持OAuth/OpenID客戶端對(duì)基于認(rèn)證機(jī)制的用戶身份確認(rèn)。驗(yàn)證機(jī)制是專門的第三方授權(quán)服務(wù)器來(authorization server,簡(jiǎn)稱AS)執(zhí)行,例如OpenID 提供方(OP),同時(shí)可獲得用戶的基本信息內(nèi)容。
在本規(guī)范中,用戶簽權(quán)的處理可以支持單個(gè)用戶登錄,一旦用戶通過認(rèn)證,它可以訪問SIP和非SIP服務(wù)資源。
此規(guī)范同時(shí)更新了RFC3261中的一些流程,通過定義UAC流程實(shí)現(xiàn)了更新。當(dāng)UAC通過multiple WWW-Authenticate/Proxy-Authenticate 頭文件獲得401/407響應(yīng)時(shí),同時(shí)對(duì)同樣的realm會(huì)使用不同的認(rèn)證機(jī)制進(jìn)行查詢處理。
在RFC8898中,令牌有不同的類型和格式。在第三方的授權(quán)服務(wù)器中使用的令牌類型取決于授權(quán)服務(wù)器的類型。OAuth AS可以對(duì)一個(gè)成功授權(quán)的UAC提供以下令牌:
Access Token: UAC將使用此令牌(此令牌由SIP服務(wù)器提供)訪問SIP服務(wù)器資源。
Refresh Token:UAC防止使用此令牌對(duì)授權(quán)服務(wù)器刷新過時(shí)令牌。
RFC8898中支持兩種令牌,兩種格式分別為:
- Structured Token:結(jié)構(gòu)化的令牌由一些具體對(duì)象構(gòu)成,包括其和聲明關(guān)聯(lián)的令牌,例如JSON格式,具體定義在RFC7519。
- Reference Token:此令牌有一個(gè)非透明的字符串構(gòu)成,它用來獲得令牌的細(xì)節(jié),和其聲明關(guān)聯(lián)。具體規(guī)范在RFC6749中定義。
在RFC8898中的關(guān)于SIP注冊(cè)的流程中,認(rèn)證機(jī)制可以通過授權(quán)服務(wù)器(AS/OP)對(duì)注冊(cè)請(qǐng)求進(jìn)行簽權(quán)處理。在響應(yīng)消息中401或者407中的頭消息文件使用Bearer機(jī)制。SIP通過AS/OP進(jìn)行注冊(cè)處理的具體的示例如下:
UAC通過AS/OP實(shí)現(xiàn)注冊(cè)流程示例
在以上的處理流程中,UAC實(shí)現(xiàn)注冊(cè)需要經(jīng)過七個(gè)步驟:
- UAC對(duì)注冊(cè)服務(wù)發(fā)送一個(gè)注冊(cè)請(qǐng)求,無任何安全設(shè)置信息。
- 注冊(cè)服務(wù)對(duì)UAC返回一個(gè)響應(yīng)消息401,并且攜帶Bearer處理機(jī)制所要求的驗(yàn)證消息和AS服務(wù)器地址等。
- UAC直接通過AS/OP直接和授權(quán)服務(wù)器進(jìn)行通信,它們雙方通過約定的機(jī)制進(jìn)行處理,例如使用OAuth Aative App機(jī)制(在RFC8252定義)。AS服務(wù)器對(duì)UAC進(jìn)行認(rèn)證處理,然后對(duì)UAC提供一個(gè)令牌,UAC可使用此令牌訪問SIP服務(wù)資源。
- UAC提供AS獲得的令牌消息,然后和注冊(cè)服務(wù)器進(jìn)行提醒注冊(cè)請(qǐng)求。注冊(cè)請(qǐng)求中包含從AS獲得的令牌信息。
- 注冊(cè)服務(wù)通過UAC的令牌對(duì)AS要求進(jìn)行驗(yàn)證處理。如果此令牌是一個(gè)參考令牌,授權(quán)服務(wù)器可能對(duì)令牌執(zhí)行自檢處理,這個(gè)自檢處理由RFC7662定義。
- 自檢處理成功以后,AS對(duì)注冊(cè)服務(wù)返回一個(gè)200 OK。
- 最后注冊(cè)服務(wù)對(duì)UAC返回一個(gè) 200 OK。
如果UAC已經(jīng)預(yù)設(shè)了AS服務(wù)器端的信息的話。處理流程相對(duì)比較簡(jiǎn)單,UAC獲得訪問令牌即可。
2、SIP UA中Bearer機(jī)制的處理
和RFC3261中關(guān)于Digest認(rèn)證的處理流程一樣,使用Bearer機(jī)制時(shí),SIP UAC,UAS和代理也需要經(jīng)過多種處理流程。下面筆者分別介紹關(guān)于在UAC,UAS和代理的處理流程中關(guān)于Bearer框架的使用方式。
UAC端的處理包括:獲得令牌和對(duì)查詢的響應(yīng)處理,保護(hù)令牌訪問,注冊(cè)請(qǐng)求和非注冊(cè)請(qǐng)求的處理。
根據(jù)UAC通過AS/OP實(shí)現(xiàn)注冊(cè)流程示例,在獲得令牌和對(duì)查詢的響應(yīng)處理過程中,當(dāng)UAC在無安全信息對(duì)服務(wù)器發(fā)送請(qǐng)求時(shí),UAC可能收到一個(gè)401(Unauthorized)或者407(Proxy Authentication Required)未授權(quán)訪問的響應(yīng)。在其響應(yīng)消息中,401會(huì)攜帶WWW-Authenticate 頭,407會(huì)攜帶一個(gè)Proxy-Authenticate 頭。在頭中會(huì)指示認(rèn)證機(jī)制使用Bearer,并且包含機(jī)制的詳細(xì)消息,例如AS服務(wù)器地址。通過前面所說的第二步和第三步獲得令牌的信息。為了獲取到令牌信息,UAC必須檢查在401或者407響應(yīng)中獲得的AS的地址,通過對(duì)照檢查一組可信任的AS地址獲得令牌訪問的安全有效地址,這樣的檢查也是為了防止UAC盲目綁定其他AS資源時(shí)的針對(duì)AS地址的安全漏洞,防止訪問一些過期的或非安全保護(hù)的AS地址。關(guān)于OAuth2的處理流程不在本規(guī)范說明的范圍,讀者可以查閱RFC8552和其他相關(guān)的規(guī)范來進(jìn)一步學(xué)習(xí)。
獲取到令牌以后,令牌就會(huì)返回到UAC端。返回UAC的令牌的類型取決于授權(quán)服務(wù)器AS的類型。OAuth AS提供訪問令牌和刷新令牌(可選)。其中,刷新令牌主要應(yīng)用于UAC和AS之間。如果AS對(duì)UAC端提供了刷新令牌的話,UAC可使用此刷新令牌在當(dāng)前訪問令牌到期之前對(duì)AS請(qǐng)求一個(gè)新的訪問令牌。如果AS沒有提供刷新令牌的話,在當(dāng)前訪問令牌到期之前,UAC需要重新對(duì)此用戶執(zhí)行認(rèn)證機(jī)制。OP返回一個(gè)額外的ID令牌,此ID令牌包含一個(gè)關(guān)于此用戶認(rèn)證的聲明信息,此聲明信息是有授權(quán)服務(wù)器提供。ID令牌也可以包括其他關(guān)于此用戶的聲明信息,例如SIP URL,UAC可以使用此URL進(jìn)行注冊(cè)流程處理。
如果UAC收到一個(gè)401或者407,此響應(yīng)中包含多個(gè)WWW- Authenticate/Proxy-Authenticate頭的話,這些頭針對(duì)同一realm提供了不同的認(rèn)證機(jī)制的話,UAC基于本地策略對(duì)其中一種機(jī)制提供安全信息。注意,在RFC8898發(fā)布時(shí),UAC收到多個(gè)認(rèn)證頭的處理規(guī)范還沒有發(fā)布,在未來的規(guī)范規(guī)定中可能會(huì)增加具體的處理機(jī)制。
令牌的安全是一個(gè)非常重要的問題。RFC6749強(qiáng)制規(guī)定了訪問令牌的安全策略,訪問令牌需要通過TLS進(jìn)行加密處理。但是,一些讀者可能知道,如果SIP網(wǎng)絡(luò)使用了中間SIP代理服務(wù)器的話,當(dāng)需要保護(hù)SIP信令時(shí),TLS只能保證hop-to-hop之間的加密,簡(jiǎn)單來說,就是保證兩個(gè)網(wǎng)絡(luò)跳轉(zhuǎn)的加密設(shè)置。因此,訪問令牌必須通過一種方式對(duì)其進(jìn)行安全保護(hù),以便實(shí)現(xiàn)僅授權(quán)的SIP服務(wù)器可訪問令牌。另外,當(dāng)訪問令牌包含在SIP請(qǐng)求中時(shí),除非有其他的加密方式可以保護(hù)訪問令牌,允許授權(quán)的服務(wù)器訪問令牌。否則的話,在支持RFC8898規(guī)范的SIP終端必須使用加密的JWTs方式對(duì)其進(jìn)行編碼和保護(hù)。TLS也可以對(duì)SIP終端和AS之間的數(shù)據(jù)交換進(jìn)行保護(hù)。
這里,我們先討論一下注冊(cè)請(qǐng)求的處理流程。前面內(nèi)容中我們已經(jīng)簡(jiǎn)單介紹了如何發(fā)送注冊(cè)請(qǐng)求的流程。UAC會(huì)根據(jù)收到的訪問令牌等消息對(duì)注冊(cè)服務(wù)器發(fā)送注冊(cè)請(qǐng)求。這里要注意,如果收到了多個(gè)認(rèn)證機(jī)制支持的話,UAC可能會(huì)通過一個(gè)非Bearer機(jī)制的方式,使用安全信息重新嘗試注冊(cè)。一般情況下,對(duì)于一個(gè)新的綁定關(guān)系來說,UAC會(huì)獲得一個(gè)新的訪問令牌。但是,因?yàn)榭赡苤С直镜夭呗栽O(shè)置,UAC可能會(huì)包含一個(gè)訪問令牌,此訪問令牌用來支持請(qǐng)求中同一AOR的其他的綁定關(guān)聯(lián)。如果包含在注冊(cè)請(qǐng)求中的訪問令牌沒有被接受,UAC收到了401或者407響應(yīng)的話,UAC需要重新執(zhí)行獲取令牌的流程。
前面我們討論了注冊(cè)請(qǐng)求的處理流程。如果是一個(gè)非注冊(cè)請(qǐng)求的話,UAC發(fā)送請(qǐng)求時(shí)必須包含一個(gè)Authorization 頭,在此頭中必須聲明Bearer機(jī)制。Bearer機(jī)制中包含一個(gè)有效的訪問令牌,此令牌是通過AS查詢請(qǐng)求中AS標(biāo)識(shí)的訪問令牌;诒镜夭呗裕绻抡(qǐng)求的目的地是同樣的,UAC可以包含一個(gè)訪問令牌,這個(gè)訪問令牌已在其他dialog或者其他獨(dú)立的請(qǐng)求中使用過的。如果包含在注冊(cè)請(qǐng)求中的訪問令牌沒有被接受,UAC收到了401或者407響應(yīng)的話,UAC需要重新執(zhí)行獲取令牌的流程。
討論了UAC端的處理以后,我們繼續(xù)討論UAS的處理。根據(jù)前面的注冊(cè)流程步驟的示例,當(dāng)UAS或者注冊(cè)服務(wù)收到注冊(cè)請(qǐng)求,UAC沒有包含認(rèn)證所需的安全信息以后,UAS/注冊(cè)服務(wù)應(yīng)該回復(fù)UAC一個(gè)401響應(yīng)。如果UAS/注冊(cè)服務(wù)驗(yàn)證此請(qǐng)求,并且接受以訪問令牌的方式作為安全措施進(jìn)行驗(yàn)證的話,UAS或者注冊(cè)服務(wù)必須在返回的響應(yīng)消息中包含一個(gè)WWW-Authenticate 頭,在此頭中標(biāo)識(shí)出Bearer機(jī)制聲明,并且包含一個(gè)AS地址,此地址解析方式根據(jù)RFC7230規(guī)范解析。UAC將來會(huì)從此AS地址獲得訪問令牌。
當(dāng)UAS或者注冊(cè)服務(wù)收到一個(gè)SIP請(qǐng)求,請(qǐng)求中包含Authorization頭,攜帶了訪問令牌的話,UAS或者注冊(cè)服務(wù)必須驗(yàn)證訪問令牌,訪問令牌的驗(yàn)證流程根據(jù)訪問令牌的類型進(jìn)行不同的處理。具體關(guān)于訪問令牌的處理流程查閱RFC7519。如果請(qǐng)求中提供的令牌是一個(gè)過期的訪問令牌,UAS或者注冊(cè)服務(wù)必須對(duì)UAC回復(fù)一個(gè)401響應(yīng)。如果訪問令牌驗(yàn)證成功通過對(duì)話,UAS或者注冊(cè)服務(wù)可以繼續(xù)執(zhí)行其他接下來正常的SIP流程。如果訪問令牌驗(yàn)證失敗,UAS或者注冊(cè)服務(wù)必須返回一個(gè)401響應(yīng)。
前面,我們討論了UAC端和UAS端關(guān)于訪問令牌的處理流程。接下來,我們繼續(xù)討論關(guān)于SIP代理的處理流程。當(dāng)SIP代理收到一個(gè)SIP請(qǐng)求,沒有攜帶任何安全信息時(shí),SIP代理服務(wù)器應(yīng)該返回一個(gè)407的響應(yīng)消息(Proxy Authentication Required)。如果SIP代理服務(wù)器提供驗(yàn)證服務(wù),并且接受以訪問令牌的方式作為安全設(shè)置的話,SIP代理服務(wù)器應(yīng)該在407的返回消息中包含一個(gè)Proxy-Authenticate頭,并且標(biāo)識(shí)出Bearer機(jī)制和AS的訪問地址。此地址解析方式根據(jù)RFC7230規(guī)范解析。UAC將來會(huì)從此AS地址獲得訪問令牌。當(dāng)SIP代理希望驗(yàn)證收到的請(qǐng)求時(shí),SIP代理服務(wù)器會(huì)查詢Proxy-Authorization中realm參數(shù)值來匹配其realm地址。代理服務(wù)器必須至少成功匹配一個(gè)Proxy-Authorization中的安全地址。當(dāng)驗(yàn)證機(jī)制是Bearer時(shí),SIP代理服務(wù)器必須驗(yàn)證訪問令牌,驗(yàn)證訪問令牌的流程根據(jù)訪問令牌的類型來決定(structured 或者 reference 令牌)。
3、訪問Token Claims
讀者應(yīng)該知道,訪問令牌是用來訪問不同的資源的。訪問令牌可以訪問的服務(wù)類型是根據(jù)不同的方式來決定。這些訪問方式是由令牌基于本地策略提供的,本地策略則是由AS和注冊(cè)服務(wù)共同協(xié)商同意的結(jié)果。具體的協(xié)商內(nèi)容需要授權(quán)服務(wù)器和注冊(cè)服務(wù)器雙方進(jìn)行核實(shí)驗(yàn)證。
如果訪問令牌被解碼為JWT格式,它會(huì)包含一個(gè)聲明列表(claim),其中包含已注冊(cè)狀態(tài)信息的和應(yīng)用級(jí)的聲明。注冊(cè)服務(wù)授權(quán)聲明中對(duì)象訪問授權(quán)的服務(wù)。如果訪問令牌是一個(gè)參考令牌的話,注冊(cè)服務(wù)會(huì)被允許基于其他的機(jī)制來進(jìn)行訪問。其他的機(jī)制包括自檢機(jī)制和用戶屬性查詢等。
4、響應(yīng)頭-WWW-Authenticate
在401或者407的響應(yīng)中,Bearer機(jī)制的標(biāo)識(shí)是通過認(rèn)證頭來進(jìn)行傳輸?shù)。具體的用法格式和HTTP的類似。如果基于Bearer認(rèn)證機(jī)制支持的話,UAC收到的Bearer消息頭用法應(yīng)該和以下語法相似:
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消息。讀者可以根據(jù)RFC規(guī)范做進(jìn)一步了解,這里不再累述。
5、Bearer機(jī)制的安全考慮
安全問題是一個(gè)非常重要的因素。如果協(xié)議或者規(guī)范設(shè)計(jì)不當(dāng)會(huì)給系統(tǒng)帶來很多的安全隱患和技術(shù)漏洞。安全問題存在很多討論的空間。在前面的章節(jié)中筆者已經(jīng)說明了使用TLS加密的傳輸方式。這里不再過多討論。其他方面的安全設(shè)置都通過不同的規(guī)范來規(guī)定,其中OAuth在RFC6749做了規(guī)定,Bearer的令牌的安全規(guī)范在RFC6750有細(xì)節(jié)說明,JWT的安全規(guī)范通過RFC7519做了規(guī)定。這些規(guī)范都支持了SIP協(xié)議中通過訪問令牌實(shí)現(xiàn)的安全機(jī)制。
Single Sign-On (SSO),單點(diǎn)登錄的驗(yàn)證方式是SIP終端使用的一個(gè)比較常用的場(chǎng)景。SSO可以支持用戶一次登錄驗(yàn)證,使用訪問令牌來獲取SIP和其非SIP的服務(wù)。這里,SSO就會(huì)存在一個(gè)比較寬泛的訪問范圍,如果SSO模式存在潛在風(fēng)險(xiǎn)的話,SIP和其他非SIP服務(wù)就會(huì)存在比較大的安全風(fēng)險(xiǎn)。因?yàn)镾SO的中國問題,所以,規(guī)范必須規(guī)定一個(gè)針對(duì)SSO非常嚴(yán)格的安全設(shè)置方式,例如包括一個(gè)比較長的passphrase替代密碼,支持多要素的認(rèn)證機(jī)制和使用原生瀏覽器的安全設(shè)置。
在應(yīng)用層級(jí)方面,如果UAC注冊(cè)時(shí),在注冊(cè)請(qǐng)求中,注冊(cè)服務(wù)器可以提供不同層級(jí)的服務(wù)級(jí)別。RFC8898推薦在響應(yīng)消息中包含一個(gè)服務(wù)的級(jí)別scope來表示其訪問的層級(jí)。當(dāng)然,通過scope的修改,AS也可以提供更高級(jí)別的訪問權(quán)限。對(duì)于SIP用戶和應(yīng)用級(jí)程序是一個(gè)非常好的安全保護(hù),管理員也可以通過scope授權(quán)的方式允許某些SIP 用戶訪問某些特定的應(yīng)用服務(wù)。
網(wǎng)絡(luò)漏洞是經(jīng)常發(fā)生的。攻擊者可能會(huì)專門制造出一些非法的AS服務(wù)器地址來引誘UAC進(jìn)行訪問。因此,UAC必須檢查AS的有效性,保證UAC訪問正確的AS服務(wù)器,避免網(wǎng)絡(luò)漏洞帶來的安全隱患。
6、總結(jié)
本文章重點(diǎn)介紹SIP新的認(rèn)證機(jī)制Bearer的使用和其和AS/OP進(jìn)行交互的詳解流程。通過OAuth的方式進(jìn)行用戶驗(yàn)證是目前互聯(lián)網(wǎng)技術(shù)中常用的技術(shù)手段,如果今后使用在SIP協(xié)議的用戶認(rèn)證流程將會(huì)影響SIP業(yè)務(wù)的處理也會(huì)幫助其他應(yīng)用級(jí)產(chǎn)品的權(quán)限訪問和服務(wù)控制。
筆者完整介紹了其核心概念和針對(duì)UAC,UAS和代理服務(wù)器的處理流程,并且特別針對(duì)401和407響應(yīng)處理做了說明。最后,針對(duì)部署bearer機(jī)制帶來的安全問題進(jìn)行了討論。目前,RFC8898規(guī)范是一個(gè)非常新的規(guī)范,很多處理細(xì)節(jié)和SIP業(yè)務(wù)廠家需要進(jìn)行升級(jí)才能滿足RFC8898的要求,因此,我們還要繼續(xù)等待SIP服務(wù)提供商和服務(wù)器開發(fā)平臺(tái)首先支持此規(guī)范,以后我們才能把令牌訪問等技術(shù)應(yīng)用在具體的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完整中文用戶手冊(cè)詳解:www.asterisk.org.cn
Freepbx/FreeSBC技術(shù)文檔: www.freepbx.org.cn
如何使用FreeSBC,qq技術(shù)分享群:334023047
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的通信行業(yè)技術(shù)分享