如何使用OpenVPN和PrivacyIDEA搭建雙因素認(rèn)證的遠(yuǎn)程接入
原創(chuàng)對(duì)于公司來(lái)講,VPN遠(yuǎn)程接入系統(tǒng)來(lái)滿(mǎn)足員工在家和出差途中訪問(wèn)公司IT資源已經(jīng)成為趨勢(shì)。但是,員工密碼管理意識(shí)薄弱,以及攻擊者利用社工庫(kù)進(jìn)行攻擊等問(wèn)題,往往給攻擊者提供了便利的渠道。使用雙因素認(rèn)證體系是對(duì)密碼驗(yàn)證手段非常有效的加強(qiáng)。當(dāng)前這種安全身份驗(yàn)證系統(tǒng)比較多,著名的就有RSA提供的安全身份認(rèn)證系統(tǒng)。
RSA提供了完整的身份認(rèn)證解決方案,特別是RSA SecurID雙因素身份認(rèn)證解決方案,已成為該領(lǐng)域的事實(shí)標(biāo)準(zhǔn),該解決方案以易于實(shí)現(xiàn)、成熟、可靠等特點(diǎn)在信息安全領(lǐng)域贏得廣泛信賴(lài)。RSA的產(chǎn)品覆蓋也非常的廣,除了傳統(tǒng)的硬件token設(shè)備,也有在智能設(shè)備上使用的軟token,非常方便。
但是對(duì)于中小型公司來(lái)講,使用RSA這種商用身份認(rèn)證解決方案成本高昂。往往因?yàn)镮T預(yù)算不足限制了企業(yè)對(duì)雙因素方案的選擇。
Google Authenticator項(xiàng)目是可用于多手機(jī)平臺(tái)的生成一次性密碼的軟件實(shí)現(xiàn),包含可插拔驗(yàn)證模塊(PAM)的實(shí)現(xiàn)。通過(guò)使用開(kāi)放標(biāo)準(zhǔn)的Initiative for Open Authentication (OATH,與OAuth不同)來(lái)生成一次性密碼。支持RFC 4226文檔定義的基于HMAC的一次性密碼(HOTP)算法和由 RFC 6238文檔定義的基于時(shí)間的一次性密碼 (TOTP)算法。
隨著google-authenticator的成熟,使用openvpn和雙因素認(rèn)證系統(tǒng)結(jié)合,讓搭建完全基于開(kāi)源軟件的安全遠(yuǎn)程接入系統(tǒng)成為可能。
OpenVPN是一個(gè)用于創(chuàng)建虛擬專(zhuān)用網(wǎng)絡(luò)(Virtual Private Network)加密通道的免費(fèi)開(kāi)源軟件。使用OpenVPN可以方便地在家庭、辦公場(chǎng)所、住宿酒店等不同網(wǎng)絡(luò)訪問(wèn)場(chǎng)所之間搭建類(lèi)似于局域網(wǎng)的專(zhuān)用網(wǎng)絡(luò)通道。
在PAM中使用Google Authenticator,提供雙因素認(rèn)證已經(jīng)實(shí)現(xiàn)。但是管理維護(hù)非常麻煩,也不直觀。用戶(hù)必須是系統(tǒng)賬戶(hù),用戶(hù)修改pin碼或者生成新的token需要登陸系統(tǒng),執(zhí)行命令,對(duì)于小白用戶(hù)的使用有些困難,登錄系統(tǒng)也會(huì)有潛在的安全風(fēng)險(xiǎn)。對(duì)于管理員來(lái)講,不能使用公司現(xiàn)有的賬戶(hù)系統(tǒng),需要在認(rèn)證系統(tǒng)上創(chuàng)建管理另一套賬戶(hù)系統(tǒng)。
PrivacyIDEA是一個(gè)模塊化的認(rèn)證系統(tǒng),認(rèn)證服務(wù)器。使用privacyIDEA可以增強(qiáng)本地登錄,VPN,遠(yuǎn)程訪問(wèn),SSH連接,在認(rèn)證期間訪問(wèn)網(wǎng)站或門(mén)戶(hù)網(wǎng)站是很好使用的雙因素,提高現(xiàn)有應(yīng)用程序的安全性。它最初被用于OTP(一次性密碼),認(rèn)證設(shè)備來(lái)作為一個(gè)OTP服務(wù)器。但其他的“設(shè)備”之類(lèi)的挑戰(zhàn)響應(yīng),SSH密鑰和X509證書(shū)也可提供。它可以運(yùn)行在Linux系統(tǒng)并且是完全開(kāi)源的。
PrivacyIDEA有著友好的管理界面。無(wú)論是管理員管理系統(tǒng)還是用戶(hù)自管理,都可以非常方便輕松的在Web上完成操作。PrivacyIDEA可以讀取本地文件中的用戶(hù)、數(shù)據(jù)庫(kù)中的用戶(hù),也可以讀取LDAP中的用戶(hù)。這樣就可以完全和公司的賬戶(hù)系統(tǒng)聯(lián)動(dòng),非常方便。
PrivacyIDEA的HOTP、TOTP使用Google Authenticator。這樣,我們?cè)谥悄苁謾C(jī)上的使用Google Authenticator的APP將非常方便。
PrivacyIDEA提供了三種方式和OpenVPN集成。第一種,使用PAM的privacyidea_pam.py模塊。OpneVPN使用PAM認(rèn)證,PAM調(diào)用privacyidea_pam.py模塊和PrivacyIDEA做驗(yàn)證。第二種,直接集成OpenVPN和FreeRADIUS。OpenVPN使用radius認(rèn)證,F(xiàn)reeRADIUS向PrivacyIDEA驗(yàn)證。第三種,在OpenVPN中使用RADIUS的PAM模塊。
一、方案原理
綜合考慮我們使用第二種方式:OpenVPN+FreeRADIUS+PrivacyIDEA。這種方案非常容易排錯(cuò),通用性要好的多。
原理圖:
OpenVPN
相關(guān)步驟是首先遠(yuǎn)端用戶(hù)發(fā)起VPN連接,提供認(rèn)證信息。然后,OpenVPN向FreeRADIUS去做認(rèn)證并提供用戶(hù)認(rèn)證信息。接著,F(xiàn)reeRADIUS通過(guò)perl腳本向PrivacyIDEA驗(yàn)證信息正確與否。然后,PrivacyIDEA將驗(yàn)證結(jié)果發(fā)給FreeRADIUS,F(xiàn)reeRADIUS再將認(rèn)證結(jié)果發(fā)送OpenvVPN。最后,OpenvVPN查看結(jié)果,認(rèn)證成功建立連接。如果認(rèn)證失敗,斷開(kāi)連接,發(fā)送失敗信息。
二、軟件安裝和配置
我們?cè)诓僮飨到y(tǒng)Ubuntu-Server14.04上進(jìn)行具體操作。
1.安裝管理PrivacyIDEA
1.1 系統(tǒng)時(shí)間
TOTP是基于時(shí)間的一次性密碼,時(shí)間的一致與否直接關(guān)系到token碼和認(rèn)證的成敗。所以,需要終端(手機(jī))和privacyidea系統(tǒng)必須時(shí)鐘同步。
設(shè)置本地時(shí)區(qū),開(kāi)啟ntp服務(wù)。
1.2 添加PrivacyIDEA源
命令添加倉(cāng)庫(kù)或者直接寫(xiě)在/etc/apt/sources.list中?! ?/p>
- ##add-apt-repository ppa:privacyidea/privacyidea
或者:vi /etc/apt/sources.list 添加倉(cāng)庫(kù)。
- deb http://ppa.launchpad.net/privacyidea/privacyidea/ubuntu trusty main
- deb-src http://ppa.launchpad.net/privacyidea/privacyidea/ubuntu trusty main
倉(cāng)庫(kù)升級(jí):apt-get update。
1.3 安裝PrivacyIDEA
- # apt-get install privacyidea-apache2
安裝成功后,需要安裝依賴(lài)包,生成一些web使用的證書(shū)。
創(chuàng)建privacyidea系統(tǒng)管理員
- #pi-manager admin add ideauser –e ideauser@gmail.com
默認(rèn)系統(tǒng)的管理頁(yè)面:https://<you local_ip>,登錄Web界面,管理系統(tǒng)。
安裝完成就可以登錄管理界面,管理你的PrivacyIDEA了。
部分界面圖:
繼續(xù)……
2.安裝配置FreeRADIUS
PrivacyIDEA提供了FreeRADIUS的PrivacyIDEA版本。其實(shí),也就是做了一些配置的FreeRADIUS。也可以直接安裝FreeRADIUS,然后在做配置。我們安裝FreeRADIUS的PrivacyIDEA版本。
2.1 安裝privacyidea-radius
- # apt-get install privacyidea-radius
FreeRADIUS配置的認(rèn)證類(lèi)型是Perl程序,PrivacyIDEA使用POST的方式和Perl程序交互。
默認(rèn)Perl程序是/usr/share/privacyidea/freeradius/privacyidea_radius.pm。
在FreeRADIUS的配置中可以查看。
2.2 配置FreeRADIUS
配置RADIUS的clients文件?! ?/p>
- # vim /etc/freeradius/clients.conf
默認(rèn)本機(jī)127.0.0.1是RADIUS的client,如果有其他的設(shè)備,加在clients中。
安裝完成可以先測(cè)試radius服務(wù)是否正常。
3.安裝配置OpenVPN。
3.1 安裝軟件easy-rsa方便證書(shū)的生成。
- # apt-get install easy-rsa
- # apt-get install openvpn
安裝easy-rsa,方便證書(shū)的生成。
3.2 生成證書(shū)
# 修改vars文件
cd /usr/share/easy-rsa/2.0/
vim vars
# 修改證書(shū)信息。
- 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"
# 初始化環(huán)境變量
- source vars
# 生成根證書(shū)、根密鑰、服務(wù)端證書(shū)、服務(wù)端密鑰、Diffie–Hellman key、ta.key文件。
- ./clean-all
- ./build-ca
- ./build-key-server OpenVPN
- ./build-dh
- openvpn --genkey --secret keys/ta.key
生成的證書(shū)文件會(huì)在當(dāng)前目錄的keys目錄下。
3.3 配置OpenVPN
# 拷貝一份服務(wù)端配置文件到/etc/openvpn下。
- cp /usr/share/doc/openvpn-2.3.2/sample/sample-config-files/server.conf /etc/openvpn/
# 編輯配置文件
根據(jù)需求,修改協(xié)議、網(wǎng)段、證書(shū)密鑰、推送路由、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
啟動(dòng)OpenVPN,測(cè)試能否啟動(dòng),提早解決。
3.4 配置包轉(zhuǎn)發(fā)和防火墻
3.4.1 開(kāi)啟包轉(zhuǎn)發(fā)
- # 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并開(kāi)機(jī)自啟。
4.安裝Radiusplugin
Radiusplugin是OpenVPN支持RADIUS認(rèn)證的插件。
在http://www.nongnu.org下載radiusplugin源碼包。
4.1 安裝gcc c++ libgcrypt
- # apt-get install gcc g++ libgcrypt11
4.2 編譯Radiusplugin
解壓包,進(jìn)入目錄,使用命令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配置文件,客戶(hù)端使用用戶(hù)名密碼認(rèn)證。OpenVPN使用RADIUS的認(rèn)證方式:
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.重啟服務(wù),測(cè)試
6.1 重啟服務(wù)
- /etc/init.d/radiusd restart
- /etc/init.d/openvpn restart
6.2 配置OpenVPN客戶(hù)端
安裝OpenVPN客戶(hù)端。下載根證書(shū)ca.crt,ta.key文件到OpenVPN安裝目錄的config目錄下,然后,配置客戶(hù)端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
注意:客戶(hù)端如果安裝在Windows系統(tǒng)上,打開(kāi)的時(shí)候要使用管理員權(quán)限,要不然系統(tǒng)不會(huì)添加VPN推送的路由。如果有多個(gè)VPN服務(wù),可以將根證書(shū)ca.crt,ta.key文件和客戶(hù)端xx.ovpn文件同樣放置到config下的同一個(gè)目錄。
6.3 測(cè)試
具體PrivacyIDEA的使用,可以查看官方文檔,也可以查看我整理的<PrivacyIDEA管理>。
推薦分3步測(cè)試:1.測(cè)試PrivacyIDEA服務(wù)是否正常運(yùn)行,token認(rèn)證是否成功。2.測(cè)試RADIUS服務(wù)是否正常,RADIUS和PrivacyLDEA驗(yàn)證是否成功。3.測(cè)試OpenVPN認(rèn)證是否成功。根據(jù)提示基本就能判斷問(wèn)題,然后解決即可。
先在智能手機(jī)上安裝google-authtication,在PrivacyIDEA上生成二維碼。然后,打開(kāi)google-authtication,掃一掃添加賬戶(hù)。這個(gè)時(shí)候你就能看到30秒變一次的token碼了。接著,在PrivacyIDEA的【Tokens】界面,測(cè)試token的pin碼或者token碼是否正確。如下:
用命令radtest測(cè)試FreeRADIUS和PrivacyIDEA是否正常。也可以使用FreeRADIUS的debug模式開(kāi)啟FreeRADIUS的服務(wù),更方便的排錯(cuò)。
再使用OpenVPN客戶(hù)端測(cè)試是否認(rèn)證成功。有問(wèn)題可以查看OpenVPN日志。
注意:Radiusplugin在Centos上有時(shí)候會(huì)因?yàn)榘姹締?wèn)題報(bào)錯(cuò)??梢該Q一個(gè)版本編譯。
因?yàn)榘姹締?wèn)題,你需要直接安裝FreeRADIUS的話,需要先修改FreeRADIUS的認(rèn)證類(lèi)型位Perl程序并下載privacyidea_radius.pm文件。最好修改FreeRADIUS的相關(guān)配置,記得2.x版本和3.x版本不一樣。
作者介紹
肖磊,2014年畢業(yè)于西安郵電大學(xué)。現(xiàn)任職360網(wǎng)絡(luò)工程師,負(fù)責(zé)辦公網(wǎng)、無(wú)線網(wǎng)和VPN,喜歡網(wǎng)絡(luò)技術(shù)、linux技術(shù)等。