FreeRADIUS介绍

258 views
Skip to first unread message

netkiller

unread,
Jun 20, 2008, 2:04:52 AM6/20/08
to netkiller

RADIUS( Remote Access Dial In User Service) Protocol主要用来提供认证(
Authentication)机制,用来辨认使用者的身份与密码,确认通过之后,经由授权
(Authorization)使用者登入网域使用相关资源,并可提供计费(Accounting)
机制,保存使用者的网络使用记录。Radius协议详细介绍可参见RFC2865,RFC2866
。 FreeRadius是一款OpenSource软件,基于Radius协议,实现Radius
AAA(Authentication,Authorization,Accounting)功能。
FreeRADIUS的功能
FreeRADIUS支持的认证方法:

本地文件 本地DB/DBM数据库 LDAP 数据库 本地可执行程序(比如一个CGI程序)
Perl 程序 Python 程序 SQL 数据库

*
Oracle
*
MySQL
*
PostgreSQL
*
Sybase
*
IBM DB2
*
Any iODBC or unixODBC supported database

FreeRADIUS支持的认证类型

*
本地配置文件中的明文密码(PAP)
*
本地配置文件中的加密密码
*
CHAP
*
MS-CHAP
*
MS-CHAPv2
*
windows域控制器认证
*
代理到其他RADIUS服务器
*
系统认证(通常通过/etc/passwd)
*
PAM(可插拔认证模块)
*
LDAP(只支持PAP)
*
CRAM
*
Perl 程序
*
Python程序
*
SIP Digest(Cisco VoIP,SER)
*
Netscape-MTA-MD5加密的密码
*
Kerberos 认证
*
X9.9认证环

EAP无线的嵌入式认证方法

*
EAP-MD5
*
CISCO LEAP
*
EAP-MSCHAP-V2
*
EAP-GTC
*
EAP-SIM
*
EAP-TLS
*
EAP-TTLS
*
EAP-PEAP

计费方法

计费数据能被同步记录到不同的数据库。以下的计费记录方法都是FreeRADIUS支持
的:

*
本地’detail’文件
*
本地’wtmp’和’utmp’文件
*
代理到其他RADIUS服务器
*
复制到一台或者多台RADIUS服务器
*
SQL数据库
*
Oracle
*
MySQL
*
PostgreSQL
*
Sybase
*
DB2
*
任何iODBC或者unixODBC支持的数据库

Freeradius安装及配置说明

Turbolinux GTES10.5安装光盘中已包含freeradius-1.0.1-2.2.i386.rpm,下面将
以freeradius和MySQL的应用方案为例进行安装说明:
Freeradius安装

# rpm –ivh freeradius-1.0.1-2.2.i386.rpm

MySQL安装

进入MySQL数据库,创建名称为radius的数据库:

# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.1.17-beta-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database radius

导入数据库表结构

编辑/usr/share/doc/freeradius-1.0.1/db_mysql.sql,去掉nas建表脚本中的id
字段定义中,去掉 default ‘0’ 字符。

# mysql -uroot radius < /usr/share/doc/freeradius-1.0.1/db_mysql.sql

Freeradius配置

/etc/raddb/radiusd.conf

Radiusd.conf是freeradius的主要配置文件,包括了下面主要配置内容: 安全配


security {
max_attributes = 200 /*允许一个Radius包中包含的属性数量
/*0表示允许
任意数量的属性

reject_delay = 1 /*回复Access-Reject包延时时间(1-5)
/*0表示马上
送Access-Reject包

status_server = no /*是否开启Status-Server请求应答功能
}

线程池配置

thread pool {
start_servers = 5 /*Radius Server启动时运行线程的
数量
max_servers = 32 /*运行时最大允许启动线程的数量
min_spare_servers = 3 /*备用Server最低阀值
max_spare_servers = 10 /*备用Server最高阀值
max_requests_per_server = 0 /*每个线程处理的最大请求数,达到该请

/
*数后,该线程会退出,0表示不
退出
}

初始化模块启动配置

authorize {
Preprocess /*预处理模块
Chap /*chap认证处理模块
Mschap /*mschap认证处理模块
Sql /*读取数据库中的用户进行认

}

/etc/raddb/clients.conf

下面配置是以本机作为NAS,进行配置。

client 127.0.0.1 {
secret = testing123 /*NAS与Freeradius之间通讯的密钥。
shortname = localhost /*NAS名称
nastype = other /*NAS类型
}
/etc/raddb/sql.conf
sql {
driver = "rlm_sql_mysql" /*使用的数据库类型,当前表示MySQL
server = "127.0.0.1" /*数据库服务器地址
login = "root" /*连接数据库使用的用户名
password = "" /*连接数据库的密码
radius_db = "radius" /*数据库名称

acct_table1 = "radacct" /*计费开始时写记录到此表
acct_table2 = "radacct" /*计费结束时写记录到此表

num_sql_socks = 5 /*启动数据库连接数量
.
.
.
}

Freeradius使用举例

在数据库中添加用户test,密码,123456,通过freeradius对该用户进行认证。

Insert into radcheck (username,attribute,op,value) values ('test',
'User-Password','==','123456');

使用下面指令启动freeradius server

# radiusd –xx (-xx表示启动debug模式)

使用freeradius自带客户端测试程序radtest作为客户端进行测试

# radtest test 123456 localhost 0 testing123
Sending Access-Request of id 48 to 127.0.0.1:1812
User-Name = "test"
User-Password = "123456"
NAS-IP-Address = turbo200
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=48,
length=20

Freeradius Server端显示LOG信息如下:

Thread 1 got semaphore
Thread 1 handling request 10, (3 handled so far)
User-Name = "test"
User-Password = "123456"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
Processing the authorize section of radiusd.conf
modcall: entering group authorize for request 10
modcall[authorize]: module "preprocess" returns ok for request 10
modcall[authorize]: module "chap" returns noop for request 10
modcall[authorize]: module "mschap" returns noop for request 10
rlm_realm: No '@' in User-Name = "test", looking up realm NULL
rlm_realm: No such realm "NULL"
modcall[authorize]: module "suffix" returns noop for request 10
rlm_eap: No EAP-Message, not doing EAP
modcall[authorize]: module "eap" returns noop for request 10
radius_xlat: 'test'
rlm_sql (sql): sql_set_user escaped user --> 'test'
radius_xlat: 'SELECT id,UserName,Attribute,Value,op FROM radcheck
WHERE
Username = 'test' ORDER BY id'
rlm_sql (sql): Reserving sql socket id: 4
radius_xlat: 'SELECT radgroupcheck.id,radgroupcheck.GroupName,
radgroupcheck.Attribute,radgroupcheck.Value,radgroupcheck.op FROM
radgroupcheck,usergroup WHERE usergroup.Username = 'test' AND
usergroup.GroupName = radgroupcheck.GroupName ORDER BY radgroupcheck.
id'
radius_xlat: 'SELECT id,UserName,Attribute,Value,op FROM radreply
WHERE
Username = 'test' ORDER BY id'
radius_xlat: 'SELECT radgroupreply.id,radgroupreply.GroupName,
radgroupreply.Attribute,radgroupreply.Value,radgroupreply.op FROM
radgroupreply,usergroup WHERE usergroup.Username = 'test' AND
usergroup.GroupName = radgroupreply.GroupName ORDER BY radgroupreply.
id'
rlm_sql (sql): Released sql socket id: 4
modcall[authorize]: module "sql" returns ok for request 10
modcall: group authorize returns ok for request 10
auth: type Local
auth: user supplied User-Password matches local User-Password
Sending Access-Accept of id 48 to 127.0.0.1:32769
Finished request 10
Going to the next request
Thread 1 waiting to be assigned a request

Reply all
Reply to author
Forward
0 new messages