2007年8月30日 星期四

OpenVPN 用戶端使用帳號/密碼的驗證方式

OpenVPN 是屬於 SSL VPN 應用的類型,用戶端需有經由主機簽署的憑證才可以連線,這樣雖然安全但對一些可能會隨時更換機器的用戶而言,卻不是很方便。

這篇文章是以帳號/密碼為主要的登入方式,用戶不需在更換機器後還要向主機重新申請憑證的往返程序。

如果還不了解什麼是 OpenVPN,請參考這篇文章 [轉]OpenVPN中文概述 。

在繼續下述的安裝說明,請先閱讀這篇文章 Install OpenVPN on CentOS 4.4 ,因為以下步驟是延續該文章的進階設定。

作者:A-Lang (alang[dot]hsu[at]gmail[dot]com)

1. 檢查包含的套件有 mysql, mysql-devel, pam_mysql, 如尚未安裝請利用 yum 或網站 rpm.pbone.net 搜尋.
因為找不到相應 CentOS 4 的 pam_mysql 版本, 用 Google 搜尋到最新版的 source rpm , 再進行編譯安裝.
# wget http://www.lfarkas.org/linux/packages/centos/5/SRPMS/pam_mysql-0.7RC1-0.src.rpm
# rpmbuild --rebuild pam_mysql-0.7RC1-0.src.rpm
# rpm -Uvh /usr/src/redhat/RPMS/i386/pam_mysql-*.rpm

2. 建立資料庫管理 VPN 的登入帳號
# mysql -u root -p
mysql> create database vpndb;
mysql> use vpndb;
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('vpn','vpn');

3. 新增一個檔案 /etc/pam.d/openvpn, 內容如下。
auth sufficient pam_mysql.so user=dbuser passwd=dbpass host=localhost db=vpndb
table=vpnuser usercolumn=name passwdcolumn=password
where=active=1 sqllog=0 crypt=0
account required pam_mysql.so user=dbuser passwd=dbpass host=localhost db=vpndb
table=vpnuser usercolumn=name passwdcolumn=password
where=active=1 sqllog=0 crypt=0
說明:
dbuser -- 可存取 vpndb 的帳戶
dbpass -- 同上的密碼
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

4. 測試 pam_mysql 是否正常運作
# saslauthd -a pam
# testsaslauthd -u vpn -p vpn -s openvpn
0: OK "Success."

5. 防止 Dos 的惡意攻擊, 請建立 "HMAC firewall"。
# cd /etc/openvpn/easy-rsa
# openvpn --genkey --secret keys/ta.key
# cd /etc/openvpn
# cp easy-rsa/keys/ta.key ./

6. 修改 OpenVPN 設定檔
# vi /etc/openvpn/server.conf
# For authentication by user/pass
tls-auth ta.key 0
plugin ./openvpn-auth-pam.so openvpn
client-cert-not-required
username-as-common-name

以上是依據這篇 Install OpenVPN on CentOS 4.4 所提及 server.conf 的內容,為使能以 user/pass 方式登入,需再補充的項目。

# cd /etc/openvpn
# cp /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so ./

7. 啟動或重啟 OpenVPN 服務
# service openvpn start

8. 製作用戶端的安裝套件
基本上將用戶端需要的設定檔及 ca.crt,ta.key 憑證檔打包進安裝檔, 用戶在安裝後即可連線。
請參考文件 http://openvpn.se/files/howto/openvpn-howto_roll_your_own_installation_package-Rev1.1.html



Error: Failed build dependencies:
cyrus-sasl-devel is needed by pam_mysql-0.7RC1-0.i386
Answer:
yum install cyrus-sasl-devel

Error:
0: NO "authentication failed"
Answer: crypt 請改用 0, 編者使用 2 也就是 MySQL 的加密函數 password() 但始終無法驗證成功。


參考連結:
http://bbs.chinaunix.net/viewthread.php?tid=513004&extra=page%3D1

2 則留言:

ym 提到...

hi.
博主在centos vps下,用user/password验证的方式能连接上openvpn server吗?我始终不能。

小麥 提到...

我只有試過要windows連openvpn server, 若是centos vps下不能連, 可能要查看防火牆的設定是否正確, 不然是可先暫時關閉centos vps上的防火牆, 再連看看, 謝謝!!