紧接上一篇,Open×××使用用户名密码登录之后,觉得可能本地文件的安全性不是很好,毕竟密码还是明文显示的嘛,所以这次鼓捣Open×××使用MySQL进行认证。部署环境什么的,依然参考上一篇中的配置,不同的是,需要在Open×××上安装MySQL数据库。

1、安装MySQL

yum -y install mysql-server mysql-devel mysql
/etc/init.d/mysqld start
chkconfig mysqld on

2、创建open***数据库以及相关表

mysqladmin -u root password 123456
mysql -uroot -p123456
mysql> create database open***;
Query OK, 1 row affected (0.00 sec)
mysql> use open***;
Database changed
mysql> create table ***user (
    -> name            char(100) not null,
    -> password        char(255) default null,
    -> active          int(10) not null default 1,
    -> primary key (name)
    -> );
Query OK, 0 rows affected (0.06 sec)
mysql> desc ***user;
+----------+-----------+------+-----+---------+-------+
| Field    | Type      | Null | Key | Default | Extra |
+----------+-----------+------+-----+---------+-------+
| name     | char(100) | NO   | PRI | NULL    |       |
| password | char(255) | YES  |     | NULL    |       |
| active   | int(10)   | NO   |     | 1       |       |
+----------+-----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> create table logtable (
    -> msg          char(254),
    -> user         char(100),
    -> pid          char(100),
    -> host         char(100),
    -> rhost        char(100),
    -> time         char(100)
    -> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc logtable;
+-------+-----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| msg   | char(254) | YES  |     | NULL    |       |
| user  | char(100) | YES  |     | NULL    |       |
| pid   | char(100) | YES  |     | NULL    |       |
| host  | char(100) | YES  |     | NULL    |       |
| rhost | char(100) | YES  |     | NULL    |       |
| time  | char(100) | YES  |     | NULL    |       |
+-------+-----------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> insert into ***user (name,password) values ('test1',password('123456'));
Query OK, 1 row affected (0.00 sec)
mysql> grant all on open***.* to ***@'localhost' identified by '***';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye

3、安装pam_mysql模块

使用MySQL数据库来验证Open×××服务器登陆需要使用pam_mysql模块,因此我们需要安装这个模块,直接使用yum安装即可。

yum install pam_mysql -y

4、配置pam_mysql模块

vim /etc/pam.d/open***   #该文件默认不存在

auth sufficient pam_mysql.so user=*** passwd=*** host=localhost db=open*** table=***user usercolumn=name passwdcolumn=password [where=***user.active=1] sqllog=0 crypt=2 sqllog=true logtable=logtable logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time

account required pam_mysql.so user=*** passwd=*** host=localhost db=open*** table=***user usercolumn=name passwdcolumn=password [where=***user.active=1] sqllog=0 crypt=2 sqllog=true logtable=logtable logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time


[root@open*** ~]# cat /etc/pam.d/open*** 

auth sufficient pam_mysql.so user=*** passwd=*** host=localhost db=open*** table=***user usercolumn=name passwdcolumn=password [where=***user.active=1] sqllog=0 crypt=2 sqllog=true logtable=logtable logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time

account required pam_mysql.so user=*** passwd=*** host=localhost db=open*** table=***user usercolumn=name passwdcolumn=password [where=***user.active=1] sqllog=0 crypt=2 sqllog=true logtable=logtable logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time

使用testsaslauthd验证登录情况,如果出现下面的情况,说明我们的配置是正确的。

[root@open*** ~]# testsaslauthd -u test1 -p test1 -s open***

0: OK "Success."

5、安装auth_pam插件

在编译安装Open××× 2.0.9后会生成一个open***-auth-pam.so,文件路径为/usr/lib64/open***/plugin/lib/open***-auth-pam.so,但是该文件有问题,好像网上有人测试过2.1以上的open***自带的open***-auth-pam.so文件都会出现验证错误问题,所以这里需要编译一个低版本的。

yum -y install pam-devel 
wget https://open***.net/release/open***-2.0.7.tar.gz 
tar -zxf open***-2.0.7.tar.gz
cd open***-2.0.7/plugin/auth-pam/
make

[root@open*** auth-pam]# make

gcc -O2 -Wall -DDLOPEN_PAM=1 -fPIC -c -I../.. auth-pam.c

gcc -O2 -Wall -DDLOPEN_PAM=1 -fPIC -c -I../.. pamdl.c

gcc -O2 -Wall -DDLOPEN_PAM=1 -fPIC -shared -Wl,-soname,open***-auth-pam.so -o open***-auth-pam.so auth-pam.o pamdl.o -lc -ldl

cp open***-auth-pam.so /etc/open***/ #将编译好的模块文件拷贝到/etc/server.conf中定义的地方

6、编辑open***配置文件

vi /etc/server.conf

添加如下几行:

# script-security 3 system  #这一行在open***2.0.9中无法识别script-security,但是在2.1中可以,但是2.0.9无须添加这一行也可以完成认证。

plugin /etc/open***/open***-auth-pam.so open***

client-cert-not-required

username-as-common-name

例如:

[root@open*** auth-pam]# cat /etc/server.conf

port 1194

proto tcp

dev tun

ca   /opt/tools/open***-2.0.9/easy-rsa/2.0/keys/ca.crt

cert /opt/tools/open***-2.0.9/easy-rsa/2.0/keys/server.crt

key  /opt/tools/open***-2.0.9/easy-rsa/2.0/keys/server.key

dh   /opt/tools/open***-2.0.9/easy-rsa/2.0/keys/dh1024.pem

server 10.8.0.0 255.255.255.0

push "route 192.168.140.0 255.255.255.0"

ifconfig-pool-persist ipp.txt

client-to-client

keepalive 10 120

comp-lzo

persist-key

persist-tun

status open***-status.log

verb 5

###############################################################################################

####open*** authenticated with openldap

#plugin /usr/lib64/open***/plugin/lib/open***-auth-ldap.so "/etc/open***/auth/ldap.conf cn=%u"

#client-cert-not-required

#username-as-common-name

###############################################################################################

####open*** authenticated with user/pass

#auth-user-pass-verify /etc/open***/checkpsw.sh via-env

#client-cert-not-required  

#username-as-common-name

###############################################################################################

####open*** authenticated with mysql

#script-security 3 system

plugin /etc/open***/open***-auth-pam.so open***

client-cert-not-required

username-as-common-name

7、编辑客户端配置文件

其实MySQL和之前的用户名密码的客户端配置文件都一样,直接按照之前的复制一份即可。

例如:

client

dev tun

proto tcp

remote 192.168.49.135 1194

resolv-retry infinite

nobind

persist-key

persist-tun

ca ca.crt

;cert eva.crt

;key eva.key

ns-cert-type server

auth-user-pass

comp-lzo

verb 3

8、客户端连接测试

wKiom1fiRySgqqUtAAL1EM3j4sc270.jpg-wh_50

客户端配置,和用户名密码一样,只需将服务器端CA证书放到目录中即可,另外配置文件内容也和用户名密码的客户端配置文件一样。

wKiom1fiRyWBVZp5AAFjLBVUdt0249.jpg-wh_50

输入数据库中的用户名密码,进行认证。

wKioL1fiRyaiF9yiAAIUlJ8qmjM490.jpg-wh_50

认证通过,连接成功。

wKiom1fiR13T5p_zAABOyDWAJwU340.jpg-wh_50

已经获取IP地址。

9、查看日志

[root@open*** auth-pam]# tail -f /opt/tools/open***-2.0.9/easy-rsa/2.0/open***-status.log

Open××× CLIENT LIST

Updated,Wed Sep 21 04:42:22 2016

Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since

test1,192.168.49.1:4922,44194,16000,Wed Sep 21 04:04:06 2016

ROUTING TABLE

Virtual Address,Common Name,Real Address,Last Ref

10.8.0.22,test1,192.168.49.1:4922,Wed Sep 21 04:04:20 2016

GLOBAL STATS

Max bcast/mcast queue length,0

END

10、查看MySQL中的用户登录表

wKiom1fiSJLSLcdEAAKIBHn2CkY922.jpg-wh_50

11、禁用用户示例

如果需要禁用用户,只需要在MySQL中将***user表中的用户的active修改为0即可,例如:

wKiom1fiSdOAXdyaAAF3CUOioWQ997.jpg这样的话,test1的active值为0,就无法通过认证了。(禁用需要下次连接生效,如果当前用户已连接,会在用户断开重连时生效)

wKiom1fiSk7SYSPIAAIiDHF14ww939.jpg-wh_50

可以看到,使用test1再次连接失败。

wKioL1fiSsyhyb_0AAM2tPyIIlg168.jpg-wh_50

在MySQL中的logtable中也可以查看到失败的登录。

wKiom1fiSyCgftZTAAQKjiA1o44246.jpg-wh_50

而其他用户可以正常连接。