对于公司来讲,VPN远程接入系统来满足员工在家和出差途中访问公司IT资源已经成为趋势。但是,员工密码管理意识薄弱,以及攻击者利用社工库进行攻击等问题,往往给攻击者提供了便利的渠道。使用双因素认证体系是对密码验证手段非常有效的加强。当前这种安全身份验证系统比较多,著名的就有RSA提供的安全身份认证系统。
RSA提供了完整的身份认证解决方案,特别是RSA SecurID双因素身份认证解决方案,已成为该领域的事实标准,该解决方案以易于实现、成熟、可靠等特点在信息安全领域赢得广泛信赖。RSA的产品覆盖也非常的广,除了传统的硬件token设备,也有在智能设备上使用的软token,非常方便。
但是对于中小型公司来讲,使用RSA这种商用身份认证解决方案成本高昂。往往因为IT预算不足限制了企业对双因素方案的选择。
Google Authenticator项目是可用于多手机平台的生成一次性密码的软件实现,包含可插拔验证模块(PAM)的实现。通过使用开放标准的Initiative for Open Authentication (OATH,与OAuth不同)来生成一次性密码。支持RFC 4226文档定义的基于HMAC的一次性密码(HOTP)算法和由 RFC 6238文档定义的基于时间的一次性密码 (TOTP)算法。
随着google-authenticator的成熟,使用openvpn和双因素认证系统结合,让搭建完全基于开源软件的安全远程接入系统成为可能。
OpenVPN是一个用于创建虚拟专用网络(Virtual Private Network)加密通道的免费开源软件。使用OpenVPN可以方便地在家庭、办公场所、住宿酒店等不同网络访问场所之间搭建类似于局域网的专用网络通道。
在PAM中使用Google Authenticator,提供双因素认证已经实现。但是管理维护非常麻烦,也不直观。用户必须是系统账户,用户修改pin码或者生成新的token需要登陆系统,执行命令,对于小白用户的使用有些困难,登录系统也会有潜在的安全风险。对于管理员来讲,不能使用公司现有的账户系统,需要在认证系统上创建管理另一套账户系统。
PrivacyIDEA是一个模块化的认证系统,认证服务器。使用privacyIDEA可以增强本地登录,VPN,远程访问,SSH连接,在认证期间访问网站或门户网站是很好使用的双因素,提高现有应用程序的安全性。它最初被用于OTP(一次性密码),认证设备来作为一个OTP服务器。但其他的“设备”之类的挑战响应,SSH密钥和X509证书也可提供。它可以运行在Linux系统并且是完全开源的。
PrivacyIDEA有着友好的管理界面。无论是管理员管理系统还是用户自管理,都可以非常方便轻松的在Web上完成操作。PrivacyIDEA可以读取本地文件中的用户、数据库中的用户,也可以读取LDAP中的用户。这样就可以完全和公司的账户系统联动,非常方便。
PrivacyIDEA的HOTP、TOTP使用Google Authenticator。这样,我们在智能手机上的使用Google Authenticator的APP将非常方便。
PrivacyIDEA提供了三种方式和OpenVPN集成。第一种,使用PAM的privacyidea_pam.py模块。OpneVPN使用PAM认证,PAM调用privacyidea_pam.py模块和PrivacyIDEA做验证。第二种,直接集成OpenVPN和FreeRADIUS。OpenVPN使用radius认证,FreeRADIUS向PrivacyIDEA验证。第三种,在OpenVPN中使用RADIUS的PAM模块。
一、方案原理
综合考虑我们使用第二种方式:OpenVPN+FreeRADIUS+PrivacyIDEA。这种方案非常容易排错,通用性要好的多。
原理图:
OpenVPN
相关步骤是首先远端用户发起VPN连接,提供认证信息。然后,OpenVPN向FreeRADIUS去做认证并提供用户认证信息。接着,FreeRADIUS通过perl脚本向PrivacyIDEA验证信息正确与否。然后,PrivacyIDEA将验证结果发给FreeRADIUS,FreeRADIUS再将认证结果发送OpenvVPN。最后,OpenvVPN查看结果,认证成功建立连接。如果认证失败,断开连接,发送失败信息。
二、软件安装和配置
我们在操作系统Ubuntu-Server14.04上进行具体操作。
1.安装管理PrivacyIDEA
1.1 系统时间
TOTP是基于时间的一次性密码,时间的一致与否直接关系到token码和认证的成败。所以,需要终端(手机)和privacyidea系统必须时钟同步。
设置本地时区,开启ntp服务。
1.2 添加PrivacyIDEA源
命令添加仓库或者直接写在/etc/apt/sources.list中。
- ##add-apt-repository ppa:privacyidea/privacyidea
或者:vi /etc/apt/sources.list 添加仓库。
- deb http://ppa.launchpad.net/privacyidea/privacyidea/ubuntu trusty main
- deb-src http://ppa.launchpad.net/privacyidea/privacyidea/ubuntu trusty main
仓库升级:apt-get update。
1.3 安装PrivacyIDEA
- # apt-get install privacyidea-apache2
安装成功后,需要安装依赖包,生成一些web使用的证书。
创建privacyidea系统管理员
- #pi-manager admin add ideauser –e ideauser@gmail.com
默认系统的管理页面:https://<you local_ip>,登录Web界面,管理系统。
安装完成就可以登录管理界面,管理你的PrivacyIDEA了。
部分界面图:
继续……
2.安装配置FreeRADIUS
PrivacyIDEA提供了FreeRADIUS的PrivacyIDEA版本。其实,也就是做了一些配置的FreeRADIUS。也可以直接安装FreeRADIUS,然后在做配置。我们安装FreeRADIUS的PrivacyIDEA版本。
2.1 安装privacyidea-radius
- # apt-get install privacyidea-radius
FreeRADIUS配置的认证类型是Perl程序,PrivacyIDEA使用POST的方式和Perl程序交互。
默认Perl程序是/usr/share/privacyidea/freeradius/privacyidea_radius.pm。
在FreeRADIUS的配置中可以查看。
2.2 配置FreeRADIUS
配置RADIUS的clients文件。
- # vim /etc/freeradius/clients.conf
默认本机127.0.0.1是RADIUS的client,如果有其他的设备,加在clients中。
安装完成可以先测试radius服务是否正常。
3.安装配置OpenVPN。
3.1 安装软件easy-rsa方便证书的生成。
- # apt-get install easy-rsa
- # apt-get install openvpn
安装easy-rsa,方便证书的生成。
3.2 生成证书
# 修改vars文件
cd /usr/share/easy-rsa/2.0/
vim vars
# 修改证书信息。
- export KEY_COUNTRY="CN"
- export KEY_PROVINCE="BeiJing"
- export KEY_CITY="BeiJing"
- export KEY_ORG="NetOps"
- export KEY_EMAIL=”netops@netops.com"
- export KEY_OU="netops"
# 初始化环境变量
- source vars
# 生成根证书、根密钥、服务端证书、服务端密钥、Diffie–Hellman key、ta.key文件。
- ./clean-all
- ./build-ca
- ./build-key-server OpenVPN
- ./build-dh
- openvpn --genkey --secret keys/ta.key
生成的证书文件会在当前目录的keys目录下。
3.3 配置OpenVPN
# 拷贝一份服务端配置文件到/etc/openvpn下。
- cp /usr/share/doc/openvpn-2.3.2/sample/sample-config-files/server.conf /etc/openvpn/
# 编辑配置文件
根据需求,修改协议、网段、证书密钥、推送路由、DNS等。如下:
- port 1194
- proto tcp
- dev tun
- ca /usr/share/easy-rsa/2.0/keys/ca.crt
- cert /usr/share/easy-rsa/2.0/keys/server.crt
- key /usr/share/easy-rsa/2.0/keys/server.key
- dh /usr/share/easy-rsa/2.0/keys/dh2048.pem
- server 192.168.10.0 255.255.255.0
- ifconfig-pool-persist ipp.txt
- push "route 10.0.0.0 255.0.0.0"
- push "dhcp-option DNS 10.10.10.10"
- keepalive 10 120
- tls-auth /usr/share/easy-rsa/2.0/keys/ta.key 0
- comp-lzo
- persist-key
- persist-tun
- status openvpn-status.log
- log openvpn.log
- log-append openvpn.log
- verb 5
启动OpenVPN,测试能否启动,提早解决。
3.4 配置包转发和防火墙
3.4.1 开启包转发
- # echo "1" > /proc/sys/net/ipv4/ip_forward
- # vim /etc/sysctl.conf
- net.ipv4.ip_forward = 1
3.4.2 配置防火墙
- #iptables -I INPUT -p tcp --dport 1194 -m comment --comment "openvpn" -j ACCEPT
- #iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
记得保存iptables并开机自启。
4.安装Radiusplugin
Radiusplugin是OpenVPN支持RADIUS认证的插件。
在http://www.nongnu.org下载radiusplugin源码包。
4.1 安装gcc c++ libgcrypt
- # apt-get install gcc g++ libgcrypt11
4.2 编译Radiusplugin
解压包,进入目录,使用命令make编译。
4.3 配置Radiusplugin
拷贝目录中的radiusplugin.cnf文件和radiusplugin.so文件到/etc/openvpn下。
修改radiusplugin.cnf文件。
- # vim radiusplugin.cnf
- server
- {
- acctport=1813
- authport=1812
- name=127.0.0.1
- retry=1
- wait=1
- sharedsecret=testing123
- }
sharedsecret必须和freeradius clients.conf中的sharedsecret一致。
5.再次修改OpenVPN配置文件
修改OpenVPN配置文件,客户端使用用户名密码认证。OpenVPN使用RADIUS的认证方式:
5.1 修改配置文件server.conf
- # vim /etc/openvpn/server.conf
- client-cert-not-required
- username-as-common-name
- plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf
6.重启服务,测试
6.1 重启服务
- /etc/init.d/radiusd restart
- /etc/init.d/openvpn restart
6.2 配置OpenVPN客户端
安装OpenVPN客户端。下载根证书ca.crt,ta.key文件到OpenVPN安装目录的config目录下,然后,配置客户端xx.ovpn文件。
信息如下:
- client
- dev tun
- proto tcp
- remote <youipaddress> 1194
- resolv-retry infinite
- nobind
- persist-key
- persist-tun
- ca ca.crt
- ns-cert-type server
- tls-auth ta.key 1
- comp-lzo
- verb 3
- auth-user-pass
注意:客户端如果安装在Windows系统上,打开的时候要使用管理员权限,要不然系统不会添加VPN推送的路由。如果有多个VPN服务,可以将根证书ca.crt,ta.key文件和客户端xx.ovpn文件同样放置到config下的同一个目录。
6.3 测试
具体PrivacyIDEA的使用,可以查看官方文档,也可以查看我整理的<PrivacyIDEA管理>。
推荐分3步测试:1.测试PrivacyIDEA服务是否正常运行,token认证是否成功。2.测试RADIUS服务是否正常,RADIUS和PrivacyLDEA验证是否成功。3.测试OpenVPN认证是否成功。根据提示基本就能判断问题,然后解决即可。
先在智能手机上安装google-authtication,在PrivacyIDEA上生成二维码。然后,打开google-authtication,扫一扫添加账户。这个时候你就能看到30秒变一次的token码了。接着,在PrivacyIDEA的【Tokens】界面,测试token的pin码或者token码是否正确。如下:
用命令radtest测试FreeRADIUS和PrivacyIDEA是否正常。也可以使用FreeRADIUS的debug模式开启FreeRADIUS的服务,更方便的排错。
再使用OpenVPN客户端测试是否认证成功。有问题可以查看OpenVPN日志。
注意:Radiusplugin在Centos上有时候会因为版本问题报错。可以换一个版本编译。
因为版本问题,你需要直接安装FreeRADIUS的话,需要先修改FreeRADIUS的认证类型位Perl程序并下载privacyidea_radius.pm文件。最好修改FreeRADIUS的相关配置,记得2.x版本和3.x版本不一样。
作者介绍
肖磊,2014年毕业于西安邮电大学。现任职360网络工程师,负责办公网、无线网和VPN,喜欢网络技术、linux技术等。