前言
新学期课程开始了,其中有一门神奇的课要求构建一个安全的公司内网接入访问控制系统。第一个要部署的就是中心认证服务器(Authentication Server)。认证服务器选取freeradius的很多,但是相关文档非常稀有且古老。CSDN甚至只能找出几年前关于EAP-TLS的配置文档,实在是让人踩了不少坑。故写下这篇文章,希望对后来者起到作用。
安装
本文假定你已经有了树莓派/远程服务器/虚拟机作为安装平台。要注意的第一个坑就是Windows下的Linux子系统对freeradius极其不友好,会出现无法收到request包的情况,需要配置防火墙(坑1),所以建议不要使用Windows下的Linux子系统进行安装配置。
首先需要安装freeradius最新版本与mysql、openssl。对于debian/ubuntu,直接使用apt安装即可:
sudo su
apt update
apt-get install freeradius freeradius-mysql mysql openssl
配置
Freeradius基础配置
接着需要进行初步配置,确保freeradius可以在本机运行与测试。3.0版本以后的freeradius安装路径改为了/etc/freeradius/3.0/,导致几乎所有搜索到的step-by-step教程都无法直接使用(坑2)。
首先需要修改users文件,加入第一个测试用户,便于进行测试。Freeradius可以使用文本文档或数据库检索用户,测试当然先使用文本文档方式。这里要注意的是,很多文档,甚至官方how-to都会让你修改mods-config/files/authorize文件,但freeradius已经为我们做好了软链接,将其链接到了根目录下的users文件,我们直接修改即可(坑3)
cd /etc/freeradius/3.0/
nano users
此时可以在合适位置添加一行
testing Cleartext-Password := "password"
这句话的意思是,定义一个用户名为testing,密码为password的用户。当然也可以将文件中的bob解注释,用以测试。
此时你已经可以在本机测试Freeradius了。首先在本终端中执行以下语句:
freeradius -X
若出现Ready to process requests字样,代表服务器启动成功,可以接收认证包。此时打开另一个终端或新建一个ssh连接,执行以下语句:
sudo radtest testing password localhost 0 testing123
这个语句的意思是:向本地服务器发送一个认证请求,账号为testing,密码为password,对称密钥为testing123。若收到Access-Accept包,则代表认证成功,可以进行下一步的配置。
下一步要修改的是位于根目录的clients.conf文件,这个文件定义了每一个可以接受的认证终端与使用的对称密钥,如果认证终端(通常为无线接入点)的ip地址不存在于本文件中,该终端的所有请求都将被拒绝。
nano clients.conf
在适当的位置添加如下语句
client client1 { #client1是认证终端的别名
ipaddr = 192.168.0.1 #这是认证终端地址,通常为路由器LAN接口地址。
#如果想允许整个子网的使用,可以加/子网掩码,如192.168.0.0/24
#如果是IPv6网络,可以使用ipv6addr = <IPv6地址>/<子网掩码>
#如果网内存在DNS服务器,此处也可以为一个域名
secret = testing123 #共享对称密钥,可以任意修改,注意在路由器参数也需要修改以匹配
require_message_authenticator = no #建议为no,旧版本协议设备不支持message authenticator
#还有一些参数可以修改,详见clients.conf中的注释,此处对于日常使用已经足够
}
此时我们可以接收来自于192.168.0.1的路由器的认证请求了。对于大多数路由器,只需要将WLAN安全设置改为WPA-EAP/WPA2-EAP/WPA-Enterprise/WPA2-Enterprise,并配置好认证服务器地址与对称密钥就可以了。
TLS模块的配置
现在让我们来转向如何使用Freeradius中的TLS模块以确保传输安全或使用证书完成认证过程。首先要进行的是生成一套测试用证书文件:
cd /etc/freeradius/3.0/certs
make
经过一段时间的密钥生成,一套证书被存在了certs文件夹内,其中如下文件对我们而言具有作用:
ca.pem: 自签发根证书,用于服务器验证客户证书或客户验证服务器证书。
server.pem: 服务器证书
server.key: 服务器私钥,保护密码为whatever
client.p12: PKCSv12编码的个人证书文件,包含了证书,私钥,并由密码“whatever”保护,需要导出并在自有设备上安装。
将client.p12用邮件发送至iPhone设备即可安装,或存储至Android手机也可安装,windows10下直接双击安装即可。
接下来我们需要修改freeradius配置文件使其支持TLS,此时需要编辑mods-enabled/eap(坑4,几乎没有文档指出该文件的位置):
cd /etc/freeradius/3.0/mods-enabled
nano eap
接着修改如下参数(未列出的不修改)
eap{
default_eap_type=tls #其实不修改也可以,Freeradius会自己根据请求包调用相应的方法
tls-config tls-common {
private_key_password = whatever #服务器私钥密码
private_key_file = ${certdir}/server.key #也可以为绝对路径,服务器私钥
certificate_file = ${certdir}/server.pem #也可以为绝对路径,服务器证书
ca_file = ${cadir}/ca.pem #也可以为绝对路径,CA根证书
dh_file = ${certdir}/dh #也可以为绝对路径,Diffie-Hellman参数
}
}
此时,重启freeradius服务器,EAP-TLS/EAP-TTLS已配置成功。
SQL模块的链接
最后一步是链接mysql到Freeradius中。首先需要配置MySQL,为其配置数据库与账号密码:
mysql -uroot
CREATE USER radius IDENTIFIED by 'radpass';
CREATE DATABASE radius;
GRANT all on radius.* to radius@'localhost' identified by 'radpass';
然后需要导入数据表结构(坑5,数据表结构存放位置改变了):
mysql -uradius -pradpass radius
source /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
最后修改相关配置文件mods-enabled/sql(坑6,配置文件位置貌似也变了):
cd /etc/freeradius/3.0/mods-enabled
nano sql
修改配置文件如下(未列出的不修改):
sql {
driver = "rlm_sql_mysql"
dialect = "mysql"
server = "localhost"
port = 3306
login = "radius"
password = "radpass"
}
接着重启freeradius服务,如果没有错误信息,说明sql模块加载成功。