FreeRADIUS介绍
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
1481

被折叠的 条评论
为什么被折叠?



