無線區域網中RADIUS協議原理與實現
摘要 RADIUS協議是一個被廣泛應用於網路認證、授權和計費的協議。本文在介紹了RADIUS協議原理的基礎上,對RADIUS協議的實現做了分析與設計。
1 引言
遠端認證撥號使用者服務協議(Remote Authentication Dial In User Service, RADIUS)最初是由Livingston公司提出的一個為撥號使用者提供認證和計費的協議。後經多次改進,逐漸成為一項通用的網路認證、計費協議,並定義於IETF提交的RFC2865和RFC2866檔案中。RADIUS協議以Client/Server方式工作,客戶端為網路接入伺服器(NAS),它向RADIUS伺服器提交認證、計費等資訊,RADIUS伺服器處理資訊並將結果返回給NAS。
RADIUS協議的應用範圍很廣,在移動、資料、智慧網等業務的認證、計費系統中都有所應用。無線區域網的802.1X認證框架中,在認證端也建議使用RADIUS協議。
本文將論述RADIUS協議的原理,並探討它在WLAN中的應用及實現方案。
2 RADIUS協議
2.1 WLAN網路模型
實際商用的無線區域網,可以用區域網交換機來實現802.1X認證協議中的埠控制功能。為保證網路的安全性,在無線區域網的出口和認證端應加上防火牆。RADIUS伺服器和資料庫還可以採取主、備結構,以保證網路的健壯性。
網路模型如下圖所示:
圖1 無線區域網網路模型
無線區域網的認證端由RADIUS伺服器、網路接入伺服器(NAS)和資料庫組成。其中:
NAS:作為RADIUS伺服器的客戶端,向RADIUS伺服器轉交使用者的認證資訊。並在使用者通過認證之後,向RADIUS伺服器傳送計費資訊。
RADIUS伺服器:作為認證系統的中心伺服器,它與NAS、資料庫相連,它接受來自NAS提交的資訊,對資料庫進行相應的操作,並把處理結果返回給NAS。
資料庫:用於儲存所有的使用者資訊、計費資訊和其他資訊。使用者資訊由網路管理員新增至資料庫中;計費資訊來自於RADIUS伺服器;其他資訊包括日誌資訊等。
2.2 RADIUS的資料包結構
RADIUS是應用層的協議,在傳輸層它的報文被封裝在UDP的報文中,進而封裝進IP包。RADIUS認證使用
乙太網上的RADIUS封裝後的包結構:
RADIUS資料包分為5個部分:
(1) Code:1個位元組,用於區分RADIUS包的型別:常用型別有:
接入請求(Access-Request),Code=1;接入應答(Access-Accept),Code=2;接入拒絕(Access-Reject),Code=3;計費請求(Accounting-Request),Code=4等。
(2)Identifier:一個位元組,用於請求和應答包的匹配。
(3)Length:兩個位元組,表示RADIUS資料區(包括Code, Identifier, Length, Authenticator, Attributes)的長度,單位是位元組,最小為20,最大為4096。
(4)Authenticator:16個位元組,用於驗證伺服器端的應答,另外還用於使用者口令的加密。RADIUS伺服器和NAS的共享金鑰(Shared Secret)與請求認證碼(Request Authenticator)和應答認證碼(Response Authenticator),共同支援發、收報文的完整性和認證。另外,使用者密碼不能在NAS和RADIUS 伺服器之間用明文傳輸,而一般使用共享金鑰(Shared Secret)和認證碼(Authenticator)通過MD5加密演算法進行加密隱藏。
(5)Attributes:不定長度,最小可為0個位元組,描述RADIUS協議的屬性,如使用者名稱、口令、IP地址等資訊都是存放在本資料段。
2.3 RADIUS的認證、計費過程
如圖1網路模型所示:
(1)申請者登入網路時,NAS會有一個客戶定義的Login提示符要求申請者輸入使用者資訊(使用者名稱和口令),申請者輸入相關的認證資訊後,等待認證結果。
(2)NAS在得到使用者資訊後,將根據RADIUS的資料包格式,向RADIUS伺服器發出“接入請求”(Access-Request)包。包中一般包括以下RADIUS屬性值:使用者名稱、使用者口令、訪問伺服器的ID、訪問埠的ID。
(3)當RADIUS伺服器收到“接入請求”包後,首先驗證NAS的共享密碼與RADIUS伺服器中預先設定的是否一致,以確認是所屬的RADIUS客戶端。在查驗了包的正確性之後,RADIUS伺服器會依據包中的使用者名稱在使用者資料庫中查詢是否有此使用者記錄。如果使用者資訊不符合,就向NAS發出“接入拒絕”(Access-Reject)包。NAS在收到拒絕包後,會立即停止使用者連線埠的服務要求,使用者被強制退出。
(4)如果使用者資訊全部符合,伺服器向NAS發出“接入質詢”包(Access-Challenge),對使用者的登入請求作進一步的驗證。其中包括:使用者口令、使用者登入訪問伺服器的IP、使用者登入的物理埠號等。NAS收到“接入質詢”包後,將訊息顯示給使用者,要求使用者進一步確認登入請求。使用者再次確認後,RADIUS伺服器將比較兩次的請求資訊,決定如何響應使用者(傳送Access-Accept、Access-Reject或再一次的Access-Challenge)。
(5)當所有的驗證條件和握手會話均通過後,RADIUS伺服器會將資料庫中的使用者配置資訊放在“接入接受”(Access-Accept)包中返回給NAS,後者會根據包中的配置資訊限定使用者的具體網路訪問能力。包括服務型別:SLIP、PPP、Login User、Rlogin、Framed、Callback等等。還包括與服務型別相關的配置資訊:IP地址、時間限制等等。
(6)在所有的驗證、授權完成後,區域網交換機的控制埠被開啟。使用者可以通過交換機進入網路。同時,NAS向RADIUS伺服器傳送 “計費請求開始”包(Accounting-Request Start),通知RADIUS伺服器開始計費。當用戶下網時,NAS向RADIUS伺服器傳送“計費請求結束”包(Accounting-Request Stop),RADIUS伺服器根據計費包的資訊計算使用者使用網路的費用。
3 WLAN模型中RADIUS認證系統的設計與實現
3.1 WLAN網路模型的簡化
在實驗室的模擬環境下,由於網路使用者少,可以採用中、小型的資料庫來存放所需資訊,並可以將RADIUS伺服器與資料庫在同一主機上實現。區域網交換機可以實現埠控制功能。網路結構可簡化如下:
圖2 實驗室環境下WLAN網路模型
3.2 NAS設計
(1)RADIUS客戶端處理程式:負責接收申請者的資訊;向RADIUS伺服器提交認證、計費、管理等資料包;向申請者返回相應結果。
(2)伺服器管理程式:為了方便網路管理員對RADIUS伺服器和資料庫的管理,在NAS主機上,還可以執行伺服器管理程式,管理程式的功能應該包括有:管理員模組(新增、刪除網路管理員,設定管理員許可權等);使用者資訊模組(實現使用者的查詢、新增、刪除等操作);計費資訊模組(查詢使用者的計費資訊,建立、修改、刪除各種不同的計費方式,);日誌資訊模組等。
(3)使用者資訊的提交:使用者需要向NAS提交使用者資訊,有多種方法可以實現,最簡單的方法是採用Web方式提交。在NAS上建立一個Web伺服器,這樣,使用者可以直接使用瀏覽器來和NAS互動,Web伺服器接受到使用者提交的資訊後,把這些資訊傳給RADIUS的客戶端處理程式。後者把這些資訊封裝成RADIUS的接入請求(Access-Request)包格式,通過認證埠(1812)向RADIUS伺服器提出認證請求。
(4)計費資訊的提交:認證通過之後,NAS客戶端程式通過認證埠(1812)向RADIUS伺服器傳送包含有使用者名稱、使用者IP、上網起始時間等資訊的“計費請求開始”包(Accounting-Request Start),通知RADIUS伺服器開始計費。RADIUS伺服器在資料庫中紀錄下相應項,並返回“計費響應”包(Accounting-Response)。當用戶下網時,NAS向RADIUS伺服器傳送包含有結束時間、資料流量等資訊的“計費請求結束”包(Accounting-Request Stop)。後者返回“計費響應”包(Accounting-Response)確認。
(5)伺服器管理程式的提交:也通過RADIUS客戶端處理程式來向RADIUS伺服器提交。客戶端處理程式將管理程式的請求包裝成標準的RADIUS包格式,並通過為伺服器管理程式定義一個埠號提交給RADIUS伺服器。
3.3 RADIUS伺服器設計
RADIUS伺服器處理來自NAS的各項資料和實現對資料庫的操作,並返回相應的結果。RADIUS客戶端和伺服器端的協議通訊採用Socket程式設計來實現。
(1)對資料庫的操作:RADIUS伺服器通過資料庫介面與資料庫建立起連線。在RADIUS伺服器中用SQL語句實現所需的資料庫操作模組(如:使用者、計費、管理員等資訊的查詢、新增、修改等操作),當RADIUS伺服器需要對資料庫操作時,就呼叫相應的模組。
(2)認證包處理:通過*認證埠(1812),來監測NAS提交的認證資料包,收到認證包後,查詢資料庫驗證使用者,並把結果以RADIUS資料包格式從1812埠返回。對於多個使用者申請併發的情況,使用多執行緒方式處理。
(3)計費包的處理:當用戶的認證通過時,查詢該使用者計費資訊。確定其計費型別、費率等。當*到NAS在計費埠(1813)提交計費包後,就向資料庫中新增“計費請求開始”包中所提交的計費資訊(包括使用者名稱、上網起始時間等)。在收到使用者下網的“計費請求結束”後,根據包中提交的使用者結束時間、資料流量等資訊,計算使用者的上網時長和資料流量,並根據使用者計費型別來計算出使用者本次上網費用,記錄入資料庫。
(4)伺服器管理程式請求的處理:*管理程式請求的埠(自定義),收到後解包並執行相應的處理函式。
3.4 資料庫的設計
用於儲存所有的使用者資訊、計費資訊等。資料庫中包含的表項至少應包括以下幾類:
(1) 使用者資訊:包括使用者名稱、口令、認證方式、訪問許可權、付費方式等。
(2) 授權資訊:伺服器返回給使用者的授權等配置資訊,如服務型別,會話時間等。
(3) 計費資訊:存放與計費有關的各種統計資訊。如:上網時間、計費費率、使用者
的歷次上網的資料流量和費用、使用者帳戶餘額等。
(4) 管理員資訊:網路管理員的ID號和口令、管理員的許可權。
(5) NAS資訊:RADIUS伺服器所屬的各NAS紀錄。包括各NAS的ID號、與
RADIUS伺服器的共享密碼等。
(6) 日誌資訊:儲存使用者上網的歷史記錄、網路管理員的登入及操作紀錄。
3.5認證端各部分的實現:
作業系統:RADIUS伺服器和NAS均採用Linux(Red Hat 9.0,核心Linux-2.4.20-8)作為作業系統。
(1) NAS:
用Apache和Tomcat構建一個支援JSP的Web伺服器,這樣申請者可以通過Web頁面來提交登入資訊。伺服器管理程式主要是處理系統管理員的資訊,用QT3.0完成使用者介面。RADIUS客戶端程式(C語言實現)將使用者或系統管理員提交的訊息封裝成RADIUS包,並通過相應的埠轉發給RADIUS伺服器。
(2) 資料庫:
採用MySQL資料庫來實現,MySQL是一個多使用者、多執行緒SQL資料庫伺服器。它由一個伺服器守護程式mysqld和很多不同的客戶程式和庫組成。Red Hat 9.0中自帶有MySQL服務,將服務啟動即可。我們可以將RADIUS伺服器與SQL資料庫相連,建立使用者資料庫和計費資料庫,對使用者資訊和計費資訊進行有效的管理。
(3) RADIUS伺服器 :
採用freeradius-0.9.0來搭建RADIUS伺服器,實現RADIUS協議,並使用RADIUS伺服器的EAP-Identity認證方式(即:RADIUS伺服器對申請者的使用者名稱和口令進行認證)。freeradius的程式碼是開源的,可以在www.freeradius.org上下載。另外,實現時,在freeradius的原始碼中添加了資料庫處理模組以及伺服器管理程式處理模組。
freeradius支援訪問SQL資料庫,首先需要建立RADIUS資料庫(以MySQL為例:mysql -uroot -prootpass radius < db_mysql.sql),建立後的資料庫會包含如下一些表項:radcheck:用於指明使用者的認證方式;radgroupcheck:將使用者分組進行管理,指明各組的屬性,如限定有些使用者組預設的認證結果就是Accept或Reject;radgroupreply:對各使用者組設定迴應的屬性;usergroup:指明使用者與組的關係;radacct:存放與計費有關的各種統計資訊。我們還可以新增一些我們所需的其他表項。
4 結束語
RADIUS協議最初作為撥號網路中協議,由於它易於管理、可擴充套件性好等特點,而逐漸被廣泛使用,成為多種網路的認證、授權和計費的協議。但RADIUS協議仍然存在諸如:基於Response Authenticatior對共享金鑰的攻擊、基於User-Password屬性對使用者密碼的攻擊等安全缺陷。這些都有待於作進一步的研究和完善。
注:本文轉載:http://blog.csdn.net/jinhill/article/details/5901042,謝謝!