Centos配置OpenVPN+OpenLDAP认证
Centos搭建OpenVPN的环境有很多资料,自行查询配置
一、安装openvpn-auth-ldap插件
yum -y install epel-release
yum -y install openvpn-auth-ldap
cp /etc/openvpn/auth/ldap.conf /etc/openvpn/auth/ldap.conf.bak
二、配置ldap.conf文件
vim /etc/openvpn/auth/ldap.conf
修改如下内容:
<LDAP>
URL ldap://192.168.9.999:389 # 自己的ldap服务器地址
Timeout 15
TLSEnable no
</LDAP>
<Authorization>
BaseDN "ou=users,dc=ss,dc=com" # 这里的dc是你ldap服务器中设置的域名等
SearchFilter "(uid=%u)"
RequireGroup false
<Group>
BaseDN "dc=ss,dc=com"
SearchFilter "(|(cn=developers)(cn=artists))"
MemberAttribute uniqueMember
</Group>
</Authorization>
三、配置openvpn中的server.conf文件
vim /etc/openvpn/server.conf
修改如下内容:
duplicate-cn # 定义openvpn一个证书在同一时刻是否允许多个客户端接入,默认没有启用
server 10.1.0.0 255.255.240.0 # 设置vpn给予的ip地址范围在10.1.0.0/20网段内(涵盖10.1.0.0-10.1.0.15网段)
;push "route 192.168.1.0 255.255.255.0" # 注释掉原先定义的推送路由(后面会给每个用户设置他们的访问权限等)
;push "route 192.168.9.0 255.255.255.0"
client-config-dir ccd # 开启配置文件夹功能,用于配置用户/组能使用vpn拿到的虚拟ip地址和访问的网段
# 新增如下:(openldap 认证配置项)
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf"
client-cert-not-required
script-security 3
username-as-common-name
client-connect connect.sh # 有新连接 连接时执行脚本(后面会根据该脚本给每个用户设置他们的访问权限等)
四、配置客户端client.ovpn文件
修改如下内容:
# 注释如下证书
;cert client.crt
;key client.key
# 新增验证方式
ns-cert-type server
auth-user-pass
五、开启路由转发功能
yum -y install iptables-services
systemctl enable iptables --now
iptables -t nat -A POSTROUTING -s 10.1.0.0/20 -o eth0 -j MASQUERADE # 添加iptables规则,确保服务器可以转发数据包到外网
iptables-save > /etc/sysconfig/iptables # 永久保存
iptables -t nat -L # 查看iptables路由转发信息
# 下面是清除iptables nat表规则的命令
iptables -t nat -F
六、脚本编辑
公司的ldap组织架构如图所示:
脚本设计思路:
- blacklist组是离职的,所以只在users中查找对应的用户uid
- 当客户端输入用户名密码,ldap会先识别用户名密码输入是否正确
- 查询ccd目录下是否有同用户名一样的common_name文件存在?若存在,则openvpn会从该目录下调用与用户名相同名称的策略
若不存在,则用ldapsearch查询在某个组里面是否有该用户存在。若有该用户,则拷贝该组的访问策略并重命名到指定的ccd目录下,下次可直接调用
mkdir /etc/openvpn/ccd # 用于客户端输入用户名密码后,调用哪个配置文件(下面的脚本会让其拷贝rules中组的配置信息)
mkdir /etc/openvpn/rules # 用于配置存放ldap用户对应组能使用openvpn的哪个虚拟ip地址、访问哪些网段
设置caiwu组的成员分配到10.1.4.5和10.1.4.9两个虚拟ip地址使用(若有组内有多个成员,则需要给足虚拟ip地址)
虚拟ip地址需要遵循特定规则,详细见:https://blog.csdn.net/dl_wdp/article/details/119324734、https://blog.csdn.net/qdwyj/article/details/108151198
设置caiwu组的成员连接vpn后,可以访问内网中的1、4网段
vim /etc/openvpn/rules/caiwu
ifconfig-push 10.1.4.5 10.1.4.6
ifconfig-push 10.1.4.9 10.1.4.10
push "route 192.168.1.0 255.255.255.0"
push "route 192.168.4.0 255.255.255.0"
要想执行ldapsearch查询,需要安装openldap-clients才行:yum install openldap-clients
测试是否能正常访问到ldap,获取ldap信息:ldapsearch -x -b 'dc=ss,dc=com' -H ldap://192.168.9.999
vim /etc/openvpn/connect.sh
#!/bin/bash
if [[ ! -f "/etc/openvpn/ccd/${common_name}" ]]; then
echo "查询到用户对应的common_name文件未在ccd目录中存在,拒绝访问!"
if ( ldapsearch -x -LLL -b 'ou=产品,ou=users,dc=ss,dc=com' -H ldap://192.168.9.999 "uid=${common_name}" | grep -c dn ); then
echo "找到了用户 ${common_name},执行操作"
cp /etc/openvpn/rules/chanpin /etc/openvpn/ccd/${common_name}
fi
if ( ldapsearch -x -LLL -b 'ou=财务,ou=users,dc=ss,dc=com' -H ldap://192.168.9.999 "uid=${common_name}" | grep -c dn ); then
echo "找到了用户 ${common_name},执行操作"
cp /etc/openvpn/rules/caiwu /etc/openvpn/ccd/${common_name}
fi
......
exit 1
fi
chmod +x /etc/openvpn/connect.sh
七、测试
直接用户名、密码登录即可。rules目录中的规则根据业务实际情况去自定义。