使用其他身份验证方法
OpenVPN 2.0和更高版本包含一项功能,该功能允许OpenVPN服务器从连接的客户端安全地获取用户名和密码,并将该信息用作认证客户端的基础。
要使用此身份验证方法,请首先将 auth-user-pass 指令添加到客户端配置。它将指导OpenVPN客户端向用户查询用户名/密码,并将其通过安全的TLS通道传递给服务器。
接下来,将服务器配置为使用身份验证插件,该身份验证插件可以是脚本,共享对象或DLL。每当VPN客户端尝试连接时,OpenVPN服务器都会调用该插件,并向其传递在客户端上输入的用户名/密码。身份验证插件可以通过返回失败(1)或成功(0)值来控制OpenVPN服务器是否允许客户端连接。
- 使用脚本插件 可以通过将auth-user-pass-verify 指令添加到服务器端配置文件来使用脚本插件 。例如:
auth-user-pass-verify auth-pam.pl via-file
将使用 auth-pam.pl perl脚本来验证连接客户端的用户名/密码。看到的描述 AUTH-用户通-验证 在 手册页 获得更多信息。
该 auth-pam.pl 脚本被包括在OpenVPN的源文件分配 样品的脚本子目录。它将使用PAM身份验证模块对Linux服务器上的用户进行身份验证,该模块又可以实施影子密码,RADIUS或LDAP身份验证。 auth-pam.pl 主要用于演示
目的。对于真实的PAM身份验证,请使用下面描述的 openvpn-auth-pam共享库插件。
- 使用共享库或DLL插件 共享对象或DLL插件通常是编译的C模块,由OpenVPN服务器在运行时加载。例如,如果您在Linux上使用基于RPM的OpenVPN软件包,则 应该已经构建了 openvpn-auth-pam插件。要使用它,请将其添加到服务器端配置文件中:
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
这将告诉OpenVPN服务器验证客户端使用登录PAM模块输入的用户名/密码 。
对于实际的生产用途,最好使用 openvpn-auth-pam 插件,因为它比auth-pam.pl 脚本具有多个优点 :
共享库 openvpn-auth-pam 插件使用拆分权限执行模型来提高安全性。这意味着,OpenVPN服务器可以通过使用伪指令user nobody, group nobody和 chroot来以降低的特权运行 ,并且仍然能够针对仅根目录可读的影子密码文件进行身份验证。
OpenVPN可以通过虚拟内存(而不是通过文件或环境)将用户名/密码传递给插件,这对于服务器计算机上的本地安全性更好。
C编译的插件模块通常比脚本运行得更快。
如果您想了解有关开发自己的插件以与OpenVPN一起使用的更多信息,请参阅 OpenVPN源发行版 的插件子目录中的自述文件 。
要 在Linux上构建 openvpn-auth-pam插件,请cd到 OpenVPN源代码分发中的 plugin / auth-pam目录,然后运行 make。
- 使用用户名/密码身份验证作为客户端身份验证的唯一形式 默认情况下, 在服务器上使用 auth-user-pass-verify 或用户名/密码检查 插件将启用双重身份验证,要求客户端证书和用户名/密码身份验证都必须成功,才能对客户端进行身份验证。
从安全角度考虑,虽然不建议这样做,但也可以禁用客户端证书,并仅强制执行用户名/密码身份验证。在服务器上:
client-cert-not-required
通常还应设置以下配置:
username-as-common-name
它会告诉服务器使用用户名进行索引,因为它将使用通过客户端证书进行身份验证的客户端的公用名。
请注意, 不需要客户端证书 不会消除对服务器证书的需要,因此,连接到使用不需要客户端证书的服务器的 客户端 可以 从客户端配置文件中删除 cert 和 key伪指令,但不能在 CA 的指令,因为它是必要的客户端验证服务器证书。