OpenWRT+FreeRadius+TinyRadius+Daloradius实现portal加radius认证
想要实现的需求是:当接入网络时,需要跳转到自定义的portal认证页面,输入用户名和密码后,跳转到Freeradius进行认证,认证完成后才允许用户联网。实质上就是实现了portal认证和radius认证方式的相结合,以此来实现多重安全认证。
基本知识介绍
AAA:
AAA是认证(Authentication)、授权(Authorization)和计费(Accounting)的简称,是网络安全中进行访问控制的一种安全管理机制,提供认证、授权和计费三种安全服务。
-
认证(Authentication):是对用户的身份进行验证,判断其是否为合法用户。
-
授权(Authorization):是对通过认证的用户,授权其可以使用哪些服务。
-
计费(Accounting):是记录用户使用网络服务的资源情况,这些信息将作为计费的依据。
portal认证:
Portal在英语中是入口的意思。Portal认证通常也称为Web认证,一般将Portal认证网站称为门户网站。未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务。当用户需要使用互联网中的其它信息时,必须在门户网站进行认证,只有认证通过后才可以使用互联网资源。用户可以主动访问已知的Portal认证网站,输入用户名和密码进行认证,这种开始Portal认证的方式称作主动认证。反之,如果用户试图通过HTTP访问其他外网,将被强制访问Portal认证网站,从而开始Portal认证过程,这种方式称作强制认证。Portal业务可以为运营商提供方便的管理功能,门户网站可以开展广告、社区服务、个性化的业务等,使宽带运营商、设备提供商和内容服务提供商形成一个产业生态系统。
radius认证:
RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系统由RFC2865,RFC2866定义,是应用最广泛的AAA协议。AAA是一种管理框架,因此,它可以用多种协议来实现。在实践中,人们最常使用远程访问拨号用户服务(Remote Authentication Dial In User Service,RADIUS)来实现AAA。
RADIUS是一种C/S结构的协议,它的客户端最初就是NAS(Net Access Server)服务器,任何运行RADIUS客户端软件的计算机都可以成为RADIUS的客户端。RADIUS协议认证机制灵活,可以采用PAP、CHAP或者Unix登录认证等多种方式。RADIUS是一种可扩展的协议,它进行的全部工作都是基于Attribute-Length-Value的向量进行的。RADIUS也支持厂商扩充厂家专有属性。
FreeRadius:
FreeRADIUS 是一个实现了 RADIUS 的服务器。Freeradius包含一个radius服务器和radius-client,可以对支持radius协议的网络设备进行鉴权记账,常见的开源路由器操作系统:如Openwrt,DD-wrt等,都支持radius协议,对PPPOE,热点,VPN等服务器进行账户管理认证,记账。
daloRadius:
来自github主页的介绍:daloRADIUS(daloRADIUS)是一种高级 RADIUS Web 管理应用程序,旨在管理热点和通用 ISP 部署。它具有用户管理、图形报告、会计、计费引擎,并与 GoogleMaps 集成以进行地理定位。
daloRADIUS 是用 PHP 和 JavaScript 编写的,并利用了一个数据库抽象层,这意味着它支持许多数据库系统,其中包括流行的 MySQL、PostgreSQL、Sqlite、MsSQL 等。
它基于FreeRADIUS部署,数据库服务器作为后端。除了实现 ACL 的其他功能外,它还集成了用于可视化定位热点/接入点的 GoogleMaps 集成以及更多功能。
说白了就是一个Freeradius的web管理工具,有了它可以更方便的管理操作freeradius。
TinyRadius:
来自github主页的介绍:TinyRadius 是一个小巧、快速且可靠的 Java Radius 库,按照 RFC 2865/2866 的规定发送和接收 Radius 数据包。就是一个实现了radius协议的java版本实现的radius客户端。通过它对接portal和radius服务器。
环境准备:
-
ubuntu18.04 TLS 安装Freeradius服务器以及运行daloradius
-
Openwrt armv8
-
php7.2
-
mysql 5.7.35
-
Apache 2.4
-
FreeRadius 3.0
安装FreeRadius
step1.更新软件源并重启
sudo apt update sudo apt -y upgrade sudo reboot
step2.安装mysql数据库并创建数据库
sudo apt update sudo apt install mariadb-server sudo mysql_secure_installation
创建数据库:
database name: radius database user: radius database user password: radius
$ sudo mysql -u root -p CREATE DATABASE radius; GRANT ALL ON radius.* TO radius@localhost IDENTIFIED BY "radius"; FLUSH PRIVILEGES; QUIT
step3.安装并配置FreeRadius on Ubuntu18.04
sudo apt -y install freeradius freeradius-mysql freeradius-utils
上述命令安装了freeradius以及 freeradius-mysql和工具包。
Import the freeradius MySQL database scheme:
mysql -u root -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
检查刚才导入的数据库:
sudo mysql -u root -p -e "use radius;show tables;" Enter password: +------------------+ | Tables_in_radius | +------------------+ | nas | | radacct | | radcheck | | radgroupcheck | | radgroupreply | | radpostauth | | radreply | | radusergroup | +------------------+
创建sql模块的软连接到mods-enabled:
sudo ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/
配置freeradius使其支持sql模块以及修改数据库的连接配置:
sudo vim /etc/freeradius/3.0/mods-enabled/sql
打开的文件中找到下面这段进行修改:
sql { driver = "rlm_sql_mysql" dialect = "mysql" # Connection info: server = "localhost" // port = 3306 //mysql的端口 login = "radius" //使用之前创建的用户名和密码 password = "radius" # Database table configuration for everything except Oracle radius_db = "radius" //之前创建的数据库名 } # Set to ‘yes’ to read radius clients from the database (‘nas’ table) # Clients will ONLY be read on server startup. read_clients = yes # Table to keep radius client info client_table = "nas"
改变 /etc/freeradius/3.0/mods-enabled/sql
的所属组和所属用户:
sudo chgrp -h freerad /etc/freeradius/3.0/mods-available/sql sudo chown -R freerad:freerad /etc/freeradius/3.0/mods-enabled/sql
重启freeradius 服务:
sudo systemctl restart freeradius.service
测试Freeradius(使用openwrt创建一个WPA-EAP认证的热点进行测试)
首先要确保openwrt机器和freeradius服务器能够相互ping通,不一定非得在同一个局域网。
step1:在Radius服务器端添加Radius客户端(这一步是必须做的,否则从客户端发来的认证请求会被服务器忽略)
vim /etc/freeradius/3.0/clients.conf
添加如下:
client openwrt { ipaddr = 192.168.1.2 secret = testing123 shortname = openwrt }
step2:创建测试用户
vim /etc/freeradius/3.0/users
在末尾添加 : 123 Cleartext-Password:="123"
step3:将freeradius 以调试模式重新启动
在Openwrt系统中的命令为 radius -X ,在ubuntu系统中的命令为freeradius -X .
如果启动的时候遇到错误说:
Failed binding to auth address * port 1812 bound to server default: Address already in use /etc/freeradius/3.0/sites-enabled/default[59]: Error binding to port for 0.0.0.0 port 1812
这说明系统已经有一个进程在运行了,这时候执行 ps aux | grep "radius",将已经运行的进程kill,再次启动就好了。
当执行freeradius -X之后提示如下,说明freeradius服务器启动成功:
step4:配置WPA-EAP认证方式的wifi热点
主要设置加密方式和Radius认证服务器的ip地址以及刚在添加客户端时填写的radius认证密钥。其余的可以默认即可。
设置完毕重启openwrt设备。
step5:连接测试
使用手机或者笔记本电脑搜索wifi热点,点击连接,输入之前设置的测试用户名及密码。
此时,freeradius服务器端应该会收到认证请求,并完成认证流程,之后wifi便连接成功!
至此,完成了freeradius服务器的搭建与测试认证过程。
安装daloRadius
Step 1: Install Apache Web Server and PHP
Daloradius will require php and Apache web server to be installed on the host system.
Installing Apache on Ubuntu:
Install Apache web server by running:
sudo apt -y install apache2
For installation of PHP on Ubuntu 18.04 and Ubuntu 16.04, run:
sudo apt -y install php libapache2-mod-php php-{gd,common,mail,mail-mime,mysql,pear,db,mbstring,xml,curl}
Check the version of php installed:
$ php -v PHP 7.2.19-0ubuntu0.18.04.2 (cli) (built: Aug 12 2019 19:34:28) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.19-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zen
至此,完成了apache2和php7.2的安装。
Step 2: Install and Configure Daloradius on Ubuntu
sudo apt -y install wget unzip wget https://github.com/lirantal/daloradius/archive/master.zip unzip master.zip mv daloradius-master daloradius
Change directory for configuration:
cd daloradius
Configuring daloradius
-
Now import Daloradius mysql tables
sudo mysql -u root -p radius < contrib/db/fr2-mysql-daloradius-and-freeradius.sql sudo mysql -u root -p radius < contrib/db/mysql-daloradius.sql
-
Configure daloRADIUS database connection details:
cd .. sudo mv daloradius /var/www/html/
Then change permissions for http folder and set the right permissions for the daloradius configuration file.
sudo mv /var/www/html/daloradius/library/daloradius.conf.php.sample /var/www/html/daloradius/library/daloradius.conf.php sudo chown -R www-data:www-data /var/www/html/daloradius/ sudo chmod 664 /var/www/html/daloradius/library/daloradius.conf.php
You should now modify the filedaloradius.conf.php
to adjust the MySQL database information. Open the daloradius.conf.php and add the database username, password and db name.
sudo vim /var/www/html/daloradius/library/daloradius.conf.php
Especially relevant variables to configure are:
$configValues['CONFIG_DB_HOST'] = 'localhost'; $configValues['CONFIG_DB_PORT'] = '3306'; $configValues['CONFIG_DB_USER'] = 'radius'; $configValues['CONFIG_DB_PASS'] = 'radius'; $configValues['CONFIG_DB_NAME'] = 'radius';
To be sure everything works, restart freeradius and apache2
sudo systemctl restart freeradius.service apache2
Open Admin link using your system IP address or domain name:
http://ip-address/daloradius/login.php
输入用户名和密码:
Username: administrator Password: radius
打开主页面:
至此完成了daloradius的安装与配置。
之后在daloradius上面进行配置会同步对freeradius服务器进行配置,其实原理就是二者操作同一个数据库系统。
之前我们测试openwrt时候采用的是修改文件的方式进行管理,到这里就可以在web页面上进行配置用户和NAS了,这是采用数据库的管理方式了。
测试daloRadius与Freeradius服务器配合使用
首先同样的创建一个测试用户:名为zms,密码为zms
然后创建一个NAS(Network Access Server):
设置NAS ip,密钥,类型为other。这里就对应之前的openwrt的热点信息。
配置好之后重启apache2和freeradius服务器。
以同样的方式连接热点进行测试,发现认证成功,完成freeradius与daloRadius 的联动。
使用TinyRadius运行一个radius认证客户端
下载tinyRadius源代码:https://github.com/ctran/TinyRadius
用IDE打开,导入项目,进行maven引包。
由于项目使用log4j,所以需要对其进行配置,
在src/main/java包下新建resource包,新建一个文件log4j.properties
粘贴以下内容:
log4j.rootLogger=debug, stdout, R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=5 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
在org.tinyradius.util包下新建initLogRecord.java文件,粘贴如下内容:
package org.tinyradius.util; import org.apache.log4j.PropertyConfigurator; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class initLogRecord { public static void initLog() { FileInputStream fileInputStream = null; try { Properties properties = new Properties(); ///TinyRadius-1.1.0/src/main/java/resources/log4j.properties fileInputStream = new FileInputStream("src/main/java/resources/log4j.properties"); properties.load(fileInputStream); PropertyConfigurator.configure(properties); } catch (Exception e) { e.printStackTrace(); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
打开TestClient.java
修改main函数进行测试:指定host为你的radius服务器的ip,shared为认证密钥,user用户名,pass密码。
然后执行,如果一切配置正常,在控制台会输出认证信息:
同时,服务器端会输出认证信息。
至此,完成了TinyRadius与FreeRadius服务器的配合使用。
总结:
本文搭建起来一套基于freeradius的认证系统,验证了系统之间的连通性,下一步将尝试开发一套radius认证客户端来实现自定义的系统认证功能。添加上更为安全的认证和验证方式,以及添加对流程的可溯源可循证系统。敬请期待!