我们现在已经实现了openVPN服务器的搭建(巧用openVPN实现访问云资源池业务),并且完成了众多终端系统的连接配置(openVPN客户端连接指南、Ubuntu系统如何连接或断开openVPN)。但是,有小伙伴反馈,感觉跟商用的客户端有些差异,那就是没有用户名密码的验证。而且我们对证书和配置文件做了合一操作,如果配置文件泄露,那就毫无安全性可言了。
所以,我们今天要尝试给openVPN配置一个用户名密码认证。
实际上,OpenVPN服务器版本在2.0或更高的版本中就默认支持基于用户名和密码的身份验证了,不需要加载额外的插件。先检查一下我的服务器版本。
auth-user-pass /etc/openvpn/server/user.txt auth-nocache
其中,auth-user-pass是指使用用户名/密码与服务器进行身份验证。/etc/openvpn/server/user.txt中包含了用户名和密码,格式为“用户名:密码”。为了防止客户端传递恶意形成的用户名或密码字符串,用户名字符串必须仅包含以下字符:字母数字、下划线('_')、破折号('-')、点('.')或at('@')。如果不指定账户文件,则控制台将提示用户名/密码。
auth-nocache是指OpenVPN在使用用户名/密码后立即忘记输入。所以,当OpenVPN需要用户名/密码时,它将提示从stdin输入,在OpenVPN会话期间可能会多次输入。
然后我们重新启动OpenVPN服务器测试一下。
哦吼,报错了。报错提示:Options error: --auth-user-pass cannot be used with --mode server (it should be used on the client side only)。选项错误:--auth-user-pass不能与--mode服务器一起使用(它只应在客户端使用)。
然后我翻了一下官方手册,发现了一条额外说明:在配置auth-user-pass时,服务器配置必须指定--auth-user-pass-verify脚本,以验证客户端提供的用户名/密码。
好家伙,还要自己写一个验证脚本。太难了,求助一下ChatGPT。
额,这个脚本有点简单,还是和密码本结合起来用更好一点。再给他提个小需求。
看起来差不多了,配置上测试一下。
#!/bin/sh
#从环境变量中读取用户名和密码
username=$1
password=$2
#在用户文件中查找给定用户名的密码
expected_password=$(grep "^${username}:" /etc/openvpn/server/user.txt | cut -d ':' -f 2)
#将预期密码与提供的密码进行比较
if [ "${password}" = "${expected_password}" ]; then
exit 0 # Authentication succeeded
else
exit 1 # Authentication failed
fi
然后配置命令就变成了下面这两条:
auth-user-pass-verify /etc/openvpn/passwd.sh via-env
script-security 2
其中auth-user-pass-verify指要求客户端提供用户名/密码以进行身份验证,验证逻辑使用外部的脚本文件/etc/openvpn/passwd.sh。认证方法方法设置为via-env,表示OpenVPN将调用环境变量username和password设置为客户端提供的用户名/密码字符串的脚本。请注意,此方法在某些平台上是不安全的,这些平台使进程的环境对其他非特权进程公开可见。
将“script-security”设置为2,以启用外部脚本的执行,需要注意赋予脚本可执行权限。
然后我们再次测试一下。
OK,没有报错了,测试一下客户端连接。
发现客户端一直处于连接状态,查看有无报错信息。
发现提醒客户端未提供用户名密码信息。
这里需要在客户端的ovpn配置文件增加一行。
auth-user-pass
修改之后再次测试一下。这次连接的时候就弹出了用户名和密码的对话框了,我们输入预先配置的用户名和密码,点击“connect”。
连接成功。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/6286.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~