目錄
前言
1、OpenSIPS對請求進行鑑權
1.1 SIP鑑權請求過程
2、鑑權模塊配置
3、REGISTER註冊請求鑑權
4、Proxy代理請求鑑權
前言
註冊鑑權和代理鑑權鑑權是RFC3261中規定的,但這不是強制要求的,事實上在實踐中很多時候是不用鑑權的,一是鑑權需要耗費時間,二是很多時候已經對IP做了鑑權,所以非法請求基本都會被過濾掉。但鑑權在一些場景下是會用到的。
1、OpenSIPS對請求進行鑑權
OpenSIPS做爲一個sip代理服務器,支持客戶端註冊到OpenSIPS。註冊客戶端可以呼叫經由OpenSIPS代理轉發到其它sip服務器或網關,或者直接呼叫註冊在同一個OpenSIPS上的SIP終端。
OpenSIPS數據庫使用subscriber表存儲自己的賬號和密碼,如果需要創建賬號測試,可以使用腳本創建賬號,如:
./opensipsctl add 101 101 # 添加用戶101,密碼101 |
SIP鑑權請求過程
Sip鑑權主要有兩種,一種是Register鑑權,一種是代理鑑權。如下圖所示(省略了ACK):
註冊鑑權只針對REGISTER請求,代理鑑權則一般會針對REGISTER之外的其他請求。對請求進行鑑權不是必需的,鑑不鑑權取決於業務需要。而在OpenSIPS中,如果需要鑑權,只需在需要鑑權的請求路由腳本中添加ww_authorize()或proxy_authorize()函數即可實現。下面用實例進行說明。
2、鑑權模塊配置
通常情況下,我們都不會用opensips庫的subscriber表中的賬號和密碼進行鑑權,而是使用項目業務系統的賬號系統進行鑑權。也就是使用業務系統的數據庫中的賬號密碼進行鑑權。如下圖配置
loadmodule "auth.so" loadmodule "auth_db.so" modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "password_column", "password") # 鑑權表中密碼字段名 modparam("auth_db", "user_column", "clientNumber") # 鑑權表中賬號字段名 modparam("auth_db", "db_url", "mysql://root:[email protected]:3306/my_user_db") # 數據庫鏈接設置 |
需要在auth_db模塊中配置我們賬號系統的數據庫地址和用戶名,已及用戶和密碼對應的表字段名。
3、對REGISTER請求鑑權
SIP終端註冊到SIP服務器上一般需要鑑權,以驗證註冊終端的有效性,只允許成功註冊上的SIP終端發起呼叫。OpenSIPS中對註冊請求使用我們自己的賬號體系進行鑑權很簡單。如下是路由配置:
route{ ... if (is_method("REGISTER")){ # authenticate the REGISTER requests # auth_db模塊中配置的數據庫中的用戶表 if (!www_authorize("", "tb_extension")){ www_challenge("", "0"); exit; } if (!db_check_to()) { sl_send_reply("403","Forbidden auth ID"); exit; } if (client_nat_test("11")) { fix_contact(); # 修復AOR,解決NAT問題 } ... exit; } ... } |
4、代理請求鑑權
代理鑑權與註冊鑑權類似。
route{ ... if (is_method("REGISTER")){ # auth_db模塊中配置的數據庫中的 # 用戶表、字段鑑權 if (!proxy_authorize("", "tb_extension")){ www_challenge("", "0"); exit; } if (!db_check_from()) { sl_send_reply("403","Forbidden auth ID"); exit; } } else { if (!uri==myself) { send_reply("403","Rely forbidden"); exit; } } } ... } |
小結
當OpenSIPS作爲註冊服務器的時候,這兩種鑑權操作是會用到的。首先用戶註冊上來需要鑑權通過纔可以,註冊上的用戶發起請求也要對請求進行代理鑑權。其他時候可能要求就沒有這麼嚴格了。
(全文完)
更多參考官方文檔:
http://www.opensips.org/html/docs/modules/2.3.x/auth_db.html