歡迎您光臨本站 註冊首頁

搭建Linux下RADIUS伺服器

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
作者:何千軍 文章來源:開放系統世界——賽迪網 2002年11月22日

RADIUS主要用於對遠程撥入的用戶進行授權和認證.它可以僅使用單一的「資料庫」對用戶進行認證(效驗用戶名和口令).它主要針對的遠程登錄類型有:SLIP、PPP、telnet和rlogin等.

其主要特徵有:

1. 客戶機/伺服器(C/S)模式

一個網路接入伺服器(以下簡稱NAS)作為RADIUS的客戶機,它負責將用戶信息傳入RADIUS伺服器,然後按照RADIUS伺服器的不同的響應來採取相應動作.另外,RADIUS伺服器還可以充當別的RADIUS伺服器或者其他種類認證伺服器的代理客戶.

2.網路安全(Network Security)

NAS和RADIUS伺服器之間的事務信息交流由兩者共享的密鑰進行加密,並且這些信息不會在兩者之間泄漏出去.

3.靈活認證機制(Flexible Authentication Mechanisms)

RADIUS伺服器支持多種認證機制.它可以驗證來自PPP、PAP、CHAP和UNIX系統登錄的用戶信息的有效性.

4.協議可擴展性(Extensible Protocol)

所有的認證協議都是基於「屬性-長度-屬性值」3元素而組成的.所以協議是擴展起來非常方便.在目前很多比較高版本的Linux中,它們都把RADIUS的安裝程序包含在系統源碼中.這樣是的我們可以很容易地通過免費的Linux系統學習RADIUS授權、認證的原理和應用.


RADIUS協議原理


要弄清楚RADIUS協議為何能實現授權和認證,我們必須應該從四個方面去認識RADIUS協議:協議基本原理、數據包結構、數據包類型、協議屬性.下面我們就來詳細地介紹這些內容.

協議基本原理

NAS提供給用戶的服務可能有很多種.比如,使用telnet時,用戶提供用戶名和口令信息,而使用PPP時,則是用戶發送帶有認證信息的數據包.



NAS一旦得到這些信息,就製造並且發送一個「Access-Request」數據包給RADIUS伺服器,其中就包含了用戶名、口令(基於MD5加密)、NAS的ID號和用戶訪問的埠號.

如果RADIUS伺服器在一段規定的時間內沒有響應,則NAS會重新發送上述數據包;另外如果有多個RADIUS伺服器的話,NAS在屢次嘗試主RADIUS伺服器失敗后,會轉而使用其他的RADIUS伺服器.

RADIUS伺服器會直接拋棄那些沒有加「共享密鑰」(Shared Secret)的請求而不做出反應.如果數據包有效,則RADIUS伺服器訪問認證資料庫,查找此用戶是否存在.如果存在,則提取此用戶的信息列表,其中包括了用戶口令、訪問埠和訪問許可權等.

當一個RADIUS伺服器不能滿足用戶的需要時,它會求助於其他的RADIUS伺服器,此時它本身充當了一個客戶端.

如果用戶信息被否認,那麼RADIUS伺服器給客戶端發送一個「Access-Reject」數據包,指示此用戶非法.如果需要的話,RADIUS伺服器還會在此數據包中加入一段包含錯誤信息的文本消息,以便讓客戶端將錯誤信息反饋給用戶.

相反,如果用戶被確認,RADIUS伺服器發送「Access-Challenge」數據包給客戶端,並且在數據包中加入了使客戶端反饋給用戶的信息,其中包括狀態屬性.接下來,客戶端提示用戶做出反應以提供進一步的信息,客戶端得到這些信息后,就再次向RADIUS伺服器提交帶有新請求ID的「Access-Request」數據包,和起初的「Access-Request」數據包內容不一樣的是:起初「Access-Request」數據包中的「用戶名/口令」信息被替換成此用戶當前的反應信息(經過加密),並且數據包中也包含了「Access-Challenge」中的狀態屬性(表示為0或1).此時,RADIUS伺服器對於這種新的「Access-Request」可以有三種反應:「Access-Accept」、「Access-Reject」或「Access-Challenge」.



如果所有的要求都屬合法,RADIUS返回一個「Access-Accept」回應,其中包括了服務類型(SLIP, PPP, Login User等)和其附屬的信息.例如:對於SLIP和PPP,回應中包括了IP地址、子網掩碼、MTU和數據包過濾標示信息等.

數據包結構

RADIUS數據包被包裝在UDP數據報的數據塊(Data field))中,其中的目的埠為1812.具體的數據包結構如表1.


8位 8位 16位
code Identifier Length
Authenticator(128位)
Attributes…(不定長)



· Code Code域長度為8位,具體取值見表2.其中,1、2、3用於用戶認證,而4、5則是統計流量用,12、13 用於試驗階段,255作為保留.


code 含義
1 Access-Request
2 Access-Accept
3 Access-Reject
4 Accounting-Request
5 5Accounting-Response
11 Access-Challenge
12 Status-Server(experimenta)
13 Status-client(experimenta)
255 Reserved



· Identifier Identifier域長度為8位,主要用於匹配請求和回應數據包,也即是數據包的編號.

· Length 長度為16位,取值範圍(20<=Length<=4096),此長度包括Code、Identifier、Length、Authenticator和 Attribute五個數據域的長度總和(Code、Identifier、Length、Authenticator為定長,Attribute為變長).超出範圍的數據將被視為附加數據(Padding)或直接被忽略.

· Authenticator 長度為16個位元組(128位),主要用於鑒定來自RADIUS伺服器的回應,同時也用於對用戶口令進行加密.

(1) Request Authenticator

在「Access-Request」數據包中,Authenticator是一個16位元組的隨機數,稱為「Request Authenticator」.它在NAS和RADIUS伺服器之間通過「共享密碼」(secret)傳輸數據的整個生命周期中是唯一的.  

(2) Response Authenticator

在「Access-Accept」、「Access-Reject」和「Access-Challenge」中的Authenticator域被稱為「Response Authenticator」.



有下面的計算方法:

ResponseAuth = MD5(Code ID Length RequestAuth Attributes Secret) ——(公式1)



· Attributes 屬性域的數據格式如表3所示.


8位 8位 不定長(0或多個位元組)
Type Length value…



Type指示了Atribute的類型,通用的有幾十種,如表4所示.


Type 說明 Type 說明
1 User-Name 5 NAS-Port-Id
2 Password 6 Service-Type
3 CHAP-Password 7 Framed-Protocol
4 NAS-IP-Address … …

數據包類型

RADIUS數據包的類型由其Code域(頭8位)指定.

· Access-Request(接入-請求)

「Access-Request」數據包由NAS發出,由RADIUS伺服器接收.

其中的「User-Password」或「CHAP-Password」屬性值被默認地以MD5方法加密.

數據包結構如表5所示.


8位 8位 16位
Code=1 Identifier-隨著Attributes的Value變化而變化,重傳時則保持不變 Length
Authenticator(128位)—根據Identifier變化而變化
Attributes…(不定長)



Attributes應該包括以下幾個屬性:

◆ 「User-Name」
◆ 「User-Password」或「CHAP-Password」
◆ 「NAS-IP-Address」
* 「NAS-Identifier」
◆ 「NAS-Port」
◆ 「NAS-Port-Type」



· Access-Accept

「Access-Accept」 由RADIUS伺服器發出,返回給NAS.表示用戶的信息是合法的.其中包括了必要的配置信息,以便下一步為用戶提供服務.數據包結構如表6所示.


8位 8位 16位
Code=2 Identifier-和「Access-Request」的Identifier相同 Length
Authenticator(128位)-屬於Response Authenticator,由公式1計算得到
Attributes…(不定長)



Access-Reject「Access-Reject」由RADIUS伺服器發出,返回給NAS.表示用戶的信息是非法的.其中應該包括一個或多個的「Reply-Message」(回復消息,包含一些便於NAS返回給用戶的一些錯誤信息).數據包結構如表7所示.




8位 8位 16位
Code=3 Identifier-和「Access-Request」的Identifier相同 Length
Authenticator(128位)-屬於Response的Authenticator,由公式1計算得到
Attributes…(不定長)



屬性

屬性如表8所示.其中,Length的計算方法為:Type Length Value.


8位 8位 不定長(0或多個位元組)
Type Length Value…



Value有4種類型:

◆ String —— 0~253位元組,字元串

◆ Ipaddress —— 32位,IP地址

◆ Integer —— 32位,整數

◆ Time —— 32位,從00:00:00 GMT, January 1, 1970到當前的總秒數

從這裡可看出,RADIUS協議是一個不定長的協議棧.

安裝RADIUS Server


要安裝整套的IC-RADIUS,我們需要如表9所示的幾個軟體包.需要說明一下:表9中的源碼包都是免費得到的,它們可以幫助我們架設一個完整的RADIUS應用環境.


軟體源碼包 說明
mysql-3.23.39.tar.gz MySQL資料庫系統
DBI-1.18.tar.gz Perl調用資料庫的通用介面
Msql-Mysql-modules-1.2216.tar.gz Perl DBI針對MySQL的Driver,即DBD for MySQL
RadiusPerl-1.05.tar.gz Perl對Radius的Authen模塊
icradius-0.18.1.tar.gz IC-RADIUS源碼包



假設所有的原碼包都被拷貝到了/usr/tmp目錄下了.

安裝MySQL

1.解壓源碼包:

Linux]#cd /usr/tmp
Linux]#gzip zxvf mysql-3.23.39.tar.gz
Linux]#cd mysql-3.23.39



2.配置參數,安裝軟體:

//將mysql安裝在/usr/local/mysql中
Linux]#./configure prefix=/usr/local/mysql
Linux]#make //編譯,時間有點長,要有耐心
Linux]#make install //安裝到/usr/local/mysql中



3.創建初始資料庫:

Linux]#cd /usr/local/msyql/bin
Linux]#./mysql_install_db



4.創建共享庫鏈接

Linux]#ldconfig //更新系統共享庫鏈接





5.複製啟動/停止腳本:

Linux]#cp /usr/tmp/mysql-3.23.39/support-files/mysql.server
     /etc/rc.d/init.d/mysql.server



6.複製並修改初始化配置文件:

Linux]#cp /usr/tmp/mysql-3.23.39/support-files/my-medium.cnf
/etc/my.cnf



使用vi打開my.cnf,在[client]下加入user=root,password處留空.

7.改變root口令:

Linux]#mysqladmin u root p password 『新口令』



8.如果有多個版本的mysql共存

在/etc/my.cnf的[mysqld]下加入:

1. Log-bin
2. Server-id=1 //必須是唯一的,以區別於其他的mysql.server的id



安裝DBI

Linux]#cd /usr/tmp
Linux]#tar zxvf DBI-1.18.tar.gz
Linux]#cd DBI-1.18
Linux]#perl Makefile.PL
Linux]#make test
//如果測試不通過,則使用make test TEST_VERBOSE=1
Linux]#make install



安裝DBD for MySQL

Linux]#cd /usr/tmp
Linux]#tar zxvf Msql-Mysql-modules-1.2216.tar.gz
Linux]#cd Msql-Mysql-modules-1.2216
Linux]#perl Makefile.PL



這時,系統開始和用戶交互,如下:

MySQL only
mSQL only (either of mSQL 1 or mSQL 2)
MySQL and mSQL (either of mSQL 1 or mSQL 2)
mSQL 1 and mSQL 2
MySQL,mSQL1andmSQL2
Enter the appropriate number: [3] 1



在我們這裡的需求,應該回答1(說明此模塊是同時for MySQL和mSQL的)

Do you want to install the MysqlPerl emulation? You might keep your old Mysql module (to be distinguished from DBD::mysql!) if you are concerned

about compatibility to existing applications! [n] n 這裡回答n

Where is your MySQL installed? Please tell me the directory that

contains the subdir 'include'. [/usr/local/mysql]?

這是預設的mysql安裝目錄,我們已經按照上面的方式安裝,則MySQL自動被安裝到這個目錄下,則這裡直接回車即可



Which database should I use for testing the MySQL drivers? [test]

直接回車即可

On which host is database test running (hostname, ip address

or host:port) [localhost]?

若mysql伺服器和icradius伺服器安裝在同一個伺服器上 則這裡直接回車即可

User name for connecting to database test? [undef] root?

root Password for connecting to database test? [undef] passwd?

這裡輸入mysql的root用戶的密碼

make
make test
make install

安裝RadiusPerl:Authen模塊

Linux]#cd /usr/tmp
Linux]#tar zxvf RadiusPerl-0.05.tar.gz
Linux]#cd RadiusPerl-0.05
Linux]#perl Makefile.PL
Linux]#make
Linux]#make test
Linux]#make install



安裝IC-RADIUS

1. 安裝軟體:

Linux]#cd /usr/tmp
Linux]#tar zxvf icradius-0.18.1.tar.gz
Linux]#cd icradius-0.18.1
Linux]#cp Makefile.lnx Makefile
Linux]#make
Linux]#make install



2.創建radius資料庫:

Linux]#cd scripts
Linux]#mysql u root p mysql
Mysql>create database radius; //創建radius資料庫
//添加radius用戶
Mysql>grant all on radius.* on radius@localhost identified by 『radius』;
Linux]#mysqladmin u root p refresh //刷新資料庫內容



3.導入數據表:

Linux]# mysql -u root -pyourpassword radius < radius.db
修改dictimport.pl,設置
my $dbusername = 'radius';
my $dbpassword = 'radius'



然後,導入dictionary內容,使radius.dictionary數據表中包含了基本的屬性(ATTRIBUTE)和屬性值(VALUE)等信息.

Linux]# ./dictimport.pl ../raddb/dictionary



Radius資料庫結構如表10所示.


Radius資料庫
dictionary radgroupcheck
hints radgroupreply
nas radreply
radacct realmgroup
radact_summary realms
radcheck usergroup



4. 啟動radiusd

Linux]#cd /etc/rc.d/init.d


Linux]#radiusd start



這樣,我們已經在Linux上成功的安裝了一個完整的RADIUS伺服器,你可以體驗一下RADIUS伺服器運行的感覺了.若你對RADIUS協議的開發還興趣的話,你可以在此基礎上做深入的研究.


[火星人 ] 搭建Linux下RADIUS伺服器已經有722次圍觀

http://coctec.com/docs/linux/show-post-56501.html