FreezeJ' Blog

自建radius服务器,使用邮箱认证

2020-09-28

公司想实现无线上网接入使用企业邮箱用户名密码登录,控制网络接入。但是没有比如ACS、ISE这种专门的radius服务器,所以只能自建freeradius与WLC无线控制器对接,使用python扩展模块认证用户名密码,判断是否能接入。

编译安装freeradius

安装相关库

yum install -y wget expat-devel gcc make gmp-devel gmp pkgconfig perl libpcap gcc-c++ logrotate tar cpio gawk flex bison bison-devel lsof libpcap-devel patch openssl openssl-devel libgcrypt* crypt* autoconf automake libtasn1-devel zlib zlib-devel trousers trousers-devel texinfo libnl-devel libnl dbus dbus-devel ncurses-devel readline-devel libtool-ltdl libtalloc* hiredis* redhat-lsb python python-devel gcc gcc-c++ openssl openssl-devel pcre pcre-devel libtalloc-devel hiredis* ykclient libpcap libpcap-devel libnl-devel libnl net-snmp net-snmp-utils

下载源码安装包
http://freeradius.org/releases/

解压编译安装
./configure --with-modules=rlm_rest,rlm_sql_mysql,rlm_python --prefix=/usr/local

确保/root/freeradius-server-3.0.17/src/modules/rlm_python/.configure 编译没问题,否则不能使用python模块

make && make install

启用调试模式
radiusd -X

如果报ssl错误:
修改/usr/local/etc/raddb/radiusd.conf文件
找到allow_vulnerable_openssl = no,修改成allow_vulnerable_openssl = yes

启用python模块
ln -s /usr/local/etc/raddb/mods-available/python mods-enabled/

image.png

在/usr/local/lib 应该有python相关的文件,如果没有,请看rlm_python模块在编译过程中有没有出错,安装一下python-devel

修改/usr/local/etc/raddb/mods-enabled/python
image.png

在/usr/local/etc/raddb/mods-config创建python文件夹(如果没有)
在/usr/local/etc/raddb/mods-config/python中创建example.py文件,这对应刚刚的module名称,以及python_path

官方参考文档

example.py代码

#!/usr/bin/env python
#-*- encoding: utf-8 -*-
import os
import radiusd
import sys
reload(sys)  
sys.setdefaultencoding('utf8')  
# 可能需要设置python path,以便加载其它模块,这个要根据实际情况编辑
import poplib

def authorize(argv):
  print "*** authorize ***"
  radiusd.radlog(radiusd.L_INFO, '*** radlog call in authorize llllll***')
  for i in argv:
    if 'NAS-IP-Address' in i:
      nas_ip =  i[1]
    if 'User-Name' in i:
      user_name = i[1]
    if 'User-Password' in i:
      user_passwd = i[1]
  print '开始认证邮箱地址'
  # pop3服务器地址
  host = "pop.exmail.qq.com"
  # 创建一个pop3对象,这个时候实际上已经连接上服务器了
  print '已经连接pop3'
  pp = poplib.POP3_SSL(host)
  # 设置调试模式,可以看到与服务器的交互信息
  # pp.set_debuglevel(1)
  check_result = False
  try:
    # 向服务器发送用户名
    pp.user(user_name)
    # 向服务器发送密码
    pp.pass_(user_passwd)
    # 获取服务器上信件信息,返回是一个列表,第一项是一共有多上封邮件,第二项是共有多少字节
    print '登录成功'
    pp.quit()
    check_result = True
  except Exception:
    print '登录失败'
    pp.quit()
    check_result = False

  if check_result:  # 如果通过邮箱校验
    reply = (('Reply-Message', ':=', 'Authen OK!'),)
    config = (('Cleartext-Password', user_passwd),)
    radiusd.radlog(radiusd.L_INFO, '*** python part end ***')
    return (radiusd.RLM_MODULE_OK, reply, config)
  else:
    radiusd.radlog(radiusd.L_INFO, '*** python ########part end ***')
    reply = (('Reply-Message', ':=', 'Authen Failed!'),)
    config = (('Cleartext-Password', user_passwd),)
    radiusd.radlog(radiusd.L_INFO, '*** python part end ***')
    return (1, reply, config)

注意
调整代码需要重启radiusd才能生效

开启python认证模块
编辑 /usr/local/etc/raddb/sites-enabled/default,在authorize中加入python
image.png

调试模式启动freeradius server
radiusd -X

模拟客户端进行radius认证

echo "User-Name=xxxx@xxxxxx.com,User-Password=123123123" | radclient 127.0.0.1:1812 auth testing123 -x

testing123为radius的预共享密钥
/usr/local/etc/raddb/clients.conf 可以修改预共享密钥
image.png