結合MySQL實現OpenVPN用戶名密碼登錄認證 原

使用User/Pass方式驗證登錄VPN,雖然使用的是User/Pass方式登錄,但是在Server端仍然需要證書,這樣的VPN和web的HTTPs方式有點類似(不能等同),只需Server端有證書,Client可以不提供自己的證書,Client只需驗證Server的合法性即可,所以Client端只需ca.crt(根證書)即可。當然,由於Client不是使用證書驗證的,所以安全性方面必然有所下降,但是省去了煩瑣的CA管理,我們可以通過用戶名和密碼來登錄VPN,這樣使得VPN可以很容易和論壇、郵件系統或者其他統一驗證系統結合,使用現成的管理界面。

VPN的安裝和配置:
環境:
OS: CentOS 6.5            (在公司網絡出口處,做路由或者是NAT設備使用)
eth0: *.*.220.145        (外網地址,直接與Internet相連)
eth1: *.*.28.130        (內網地址)

Client端硬件及網絡環境配置:
OS: Windows7,IP地址不固定

#同步系統時間
yum install chrony -y
service chronyd start && chronyc sources && chkconfig chronyd on

yum install ntpdate -y
crontab添加
*/1 * * * * /usr/sbin/ntpdate 0.rhel.pool.ntp.org > /dev/null 2>&1
service crond restart

Server端配置
檢查pam-devel包是否安裝,可yum安裝該軟件包
rpm -qa | grep pam
pam-1.1.1-17.el6.x86_64
檢查mysql是否安裝,確認mysql-devel包已經安裝
rpm -qa | egrep "Percona|mysql"
mysql-libs-5.1.71-1.el6.x86_64
檢查lszo是否安裝,確認lzo-devel包已經安裝
rpm -qa | grep lzo

#安裝以上所需包
yum install epel-release -y
yum install ntpdate -y
yum install openssl openssl-devel lzo lzo-devel pam pam-devel pam_mysql automake pkgconfig gcc gcc-c++
rpm -ivh http://repo.mysql.com/mysql-community-release-el6.rpm
yum -y install  mysql-community-client  mysql-community-server mysql-community-devel
/etc/init.d/mysqld start


安裝openvpn
https://openvpn.net/release/
cd /usr/local/src/

tar -zxvf openvpn-2.4.4.tar.gz
cd openvpn-2.4.4
./configure --prefix=/opt/openvpn
make && make install
cp -a distro/rpm/openvpn.init.d.rhel /etc/init.d/openvpn    
#創建啓動腳本

ln -s /opt/openvpn/sbin/openvpn /usr/sbin/openvpn    
#啓動腳本中會用到,也可以不執行此命令,直接在啓動腳本中修改

vi /etc/init.d/openvpn                        
#在85行,修改爲:
work=/opt/openvpn

#複製主配置文件模板
cp -a sample/sample-config-files/server.conf /opt/openvpn/

 #創建日誌及keys目錄
mkdir logs                        
mkdir keys

#詳細參數如下
cd /opt/openvpn
mv server.conf server.conf.bak
vim server.conf

port 1195                #使用1195端口
proto tcp                #使用tcp傳輸模式
dev tun                #使用tun虛擬網卡設備(還有一種是Tap)
ca keys/ca.crt            #指定server端證書路徑
cert keys/server.crt        #指定server端證書路徑
key keys/server.key        #Thisfile should be kept secret
dh keys/dh2048.pem
tls-auth keys/ta.key 0
cipher AES-256-CBC
server 10.8.0.0 255.255.255.0        #openvpn使用的網絡
push "route 10.8.0.0 255.255.0.0"        #添加openvpn路由                    
ifconfig-pool-persist ipp.txt            #客戶端連入後使用的IP地址池
push "dhcp-option DNS 223.5.5.5"        #客戶端連入後使用的DNS
push "dhcp-option DNS 223.6.6.6"
keepalive 10 120                    #保持VPN會話
comp-lzo                            #開啓Lzo數據壓縮
user nobody
group nobody
persist-key
persist-tun
verb 3
plugin openvpn-auth-pam.so openvpn
#調用openvpn-plugin-auth-pam.so於pam連接
client-cert-not-required            #不請求客戶的CA證書,使用User/Pass驗證
username-as-common-name        #使用客戶提供的UserName作爲Common Name
link-mtu 1500                    #設置MTU連接數值
status logs/openvpn-status.log
log         logs/openvpn.log
log-append  logs/openvpn.log

 
生成openvpn-auth-pam.so,使用openvpn-2.0.*.tar.gz源碼,否則會報錯:AUTH-PAM:BACKGROUND: user 'tester' failed to authenticate: Permission denied

tar -zxvf openvpn-2.0.9.tar.gz
cd open-2.0.9/plugin/auth-pam
make
cp -a openvpn-auth-pam.so /opt/openvpn
cd /opt/openvpn && chmod 755 openvpn-auth-pam.so


安裝easy-rsa,用來生成證書和密鑰:
cd /usr/local/src/
wget http://download.freenas.org/distfiles/easy-rsa-2.2.0_master.tar.gz

#http://download.freenas.org/distfiles/
tar -zxvf easy-rsa-2.2.0_master.tar.gz
cp -a easy-rsa-2.2.0_master/easy-rsa /opt/openvpn/
    
cd /opt/openvpn/easy-rsa/2.0/
mv vars vars.bak

修改vars文件
vim vars

export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=2048                    #修改爲2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="CN"        #以下根據自己情況修改
export KEY_PROVINCE="ShaanXi"
export KEY_CITY="XA"
export KEY_ORG="yjz"
export KEY_EMAIL="[email protected]"
export KEY_CN=yjz
export KEY_NAME=yjz
export KEY_OU=yjz

ln -s openssl-1.0.0.cnf openssl.cnf

source vars                    #全局變量

##生成證書,以下命令全部一直回車
./clean-all                             
#清空所有證書(keys目錄下)
./build-ca                              
#生成服務器ca證書
./build-key-server server        
#生成服務端證書
./build-dh                              
#生成DH(Diffie-Hellman)驗證文件
openvpn --genkey --secret ta.key    
#降低DDoS風險
./build-key client            
#生成客戶端證書(建議以使用者命名)

#拷貝證書到/opt/openvpn/keys目錄下
cd /opt/openvpn/easy-rsa/2.0/keys/
cp -a ca.crt server.crt dh2048.pem server.key /opt/openvpn/keys
cd .. && cp ta.key  /opt/openvpn/keys                 

配置數據庫用於管理openvpn的賬戶密碼
以管理員身份登錄數據庫:
mysql> create database vpn;
mysql> GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY 'vpn123';
mysql> flush privileges;
mysql> use vpn;
mysql> CREATE TABLE vpnuser(name char(20)NOT NULL,password char(128) default NULL,active int(10) NOT NULL DEFAULT 1,PRIMARY KEY(name));
mysql> insert into vpnuser (name,password) values('ipad',password('ipad'));
mysql> show tables;
+---------------+
| Tables_in_vpn |
+---------------+
| vpnuser       |
+---------------+
1 row in set (0.00 sec)

mysql> select * from vpnuser;
+------+-------------------------------------------+--------+
| name | password                                  | active |
+------+-------------------------------------------+--------+
| ipad | *44249DDD1E67F607625C57A3B32D07FDC4663A14 |      1 |
+------+-------------------------------------------+--------+
1 row in set (0.00 sec)

#創建vpn用戶,對vpn這個database有所有操作權限,密碼爲vpn123             
在PAM配置中使用該用戶
#active不爲1,無權使用VPN
#增加用戶 用戶名:ipad 密碼:ipad

配置pam_mysql模塊
cd /etc/pam.d
vim openvpn
auth sufficient pam_mysql.so user=vpn passwd=vpn123 host=127.0.0.1 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2

account required  pam_mysql.so  user=vpn passwd=vpn123 host=127.0.0.1 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2

crypt(0)-- Used to decide to use MySQL's PASSWORD() function or crypt()
0= No encryption. Passwords in database in plaintext. NOT recommended!
1= Use crypt
2= Use MySQL PASSWORD() function

#crypt=0:明文密碼
#crypt=1: 使用crpyt()函數(對應SQL數據裏的encrypt(),encrypt()隨機產生salt)
#crypt=2: 使用MYSQL中的password()函數加密。
#根據mysql內創建用戶時配合使用 ipad用戶使用password函數加密 所以用crypt=2


openvpn、mysql、pam連通性測試
開啓系統的Forward功能
 vim /etc/sysctl.conf
net.ipv4.ip_forward= 1                             #重要
modprobe bridge && sysctl -p

iptables設置
iptables -t nat -A POSTROUTING -s 10.127.1.0/24 -o eth1 -j SNAT --to-source  *.*.154.166
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -p tcp -m tcp --dport 1195 -j ACCEPT

開啓openvpn程序
/etc/init.d/openvpn start
lsof -i:1195
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
openvpn 16993 nobody    8u  IPv4  35738      0t0  TCP *:rsf-1 (LISTEN)

開啓mysql程序
service mysql start
lsof -i:3306
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  53483 mysql   27u  IPv6 204369      0t0  TCP *:mysql (LISTEN)

檢查下saslauthd是否有安裝可以通過yum安裝此測試工具
rpm -qa | grep cyrus-sasl
cyrus-sasl-lib-2.1.23-13.el6_3.1.x86_64
cyrus-sasl-2.1.23-13.el6_3.1.x86_64
yum install  cyrus-sasl-devel  cyrus-sasl-gssapi  cyrus-sasl-md5  cyrus-sasl-plain cyrus-sasl-lib cyrus-sasl

saslauthd -a pam
testsaslauthd -u ipad -p ipad -s openvpn
0: OK "Success."                        測試通過。

配置openvpn客戶端
安裝openvpn-2.4.4-install.exe應用
從VPN服務端下載ca.crt,client.crt,client.key,ta.key證書
將ca.crt,client.crt,client.key,ta.key證書放到C:/Program Files/OpenVPN/config目錄下
編輯client.ovpn文件

client
;dev tap
dev tun                #使用虛擬網絡設備tun  與server配置的必須相同
proto tcp-client        #使用TCP傳輸(tcp-client/tcp-server)
;proto udp
remote *.*.154.166 1195        #openvpn服務所在的公網IP或域名以及開啓端口
remote-random
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
auth-user-pass            #詢問用戶名和密碼
remote-cert-tls server
tls-auth ta.key 1
route 10.8.0.0 255.255.255.0    #openvpn使用的網絡段
comp-lzo            #開啓Lzo數據壓縮
verb 4
link-mtu 1500

保存並測試登陸openvpn.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章