我使用 mfa 连接到 OpenVPN。现在客户要求他们通过单击 .bat 或 .cmd 文件连接到 OpenVPN。我找到了一种使用用户名和密码自动连接到 OpenVPN 的解决方案。但是要做到这一点,我必须在 pam 配置文件中禁用 mfa。
有没有办法保留这两种身份验证方法?特定用户可以拥有自动登录配置文件,而其他用户仍需要使用 mfa 才能登录?
我的配置如下:
client
dev tun
proto udp
remote xx.xx.xx.xxx Protocol
nobind
resolv-retry infinite
persist-key
persist-tun
auth-user-pass pass.txt
auth-nocache
ca ca.crt
cert user.crt
key user.key
comp-lzo
verb 4
tls-auth ta.key 1
cipher AES-256-CBC
remote-cert-tls server
keepalive 5 300
reneg-sec 36000
和 server.conf:
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/2.0/keys/xxxx.crt
cert /etc/openvpn/easy-rsa/2.0/keys/xxxx.crt
key /etc/openvpn/easy-rsa/2.0/keys/xxxx.key # This file should be kept secret
dh /etc/openvpn/easy-rsa/2.0/keys/xxxx.pem
server xx.xx.xx.xx 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.16.5.0 255.255.255.0"
push "route 192.16.6.0 255.255.255.0"
push "route 192.16.7.0 255.255.255.0"
push "route 192.16.8.0 255.255.255.0"
push "dhcp-option DNS 132.196.243.9"
push "dhcp-option DNS 8.8.8.8"
keepalive 5 300
reneg-sec 36000
tls-auth /etc/openvpn/easy-rsa/2.0/keys/xxxx.key 0 # This file is secret
cipher AES-256-CBC # AES
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append /var/log/openvpn.log
verb 5
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn # This is my authentication plugin. I want to use another one along with it.
答案1
OpenVPN 2.0 及更高版本包含一项功能,允许 OpenVPN 服务器安全地从连接客户端获取用户名和密码,并使用该信息作为验证客户端的基础。
要使用此身份验证方法,首先将 auth-user-pass 指令添加到客户端配置。它将指示 OpenVPN 客户端向用户查询用户名/密码,并通过安全的 TLS 通道将其传递给服务器。
接下来,配置服务器以使用身份验证插件,该插件可以是脚本、共享对象或 DLL。每次 VPN 客户端尝试连接时,OpenVPN 服务器都会调用该插件,并将客户端上输入的用户名/密码传递给它。身份验证插件可以通过返回失败 (1) 或成功 (0) 值来控制 OpenVPN 服务器是否允许客户端连接。
使用脚本插件
可以通过添加脚本插件来使用授权用户通过验证指令到服务器端配置文件。例如:
auth-user-pass-verify auth-pam.pl via-file
将使用auth-pam.pl
perl 脚本来验证连接客户端的用户名/密码。有关详细信息,请参阅手册页中 auth-user-pass-verify 的描述。
该auth-pam.pl
脚本包含在 OpenVPN 源文件分发中示例脚本子目录。它将使用 PAM 身份验证模块对 Linux 服务器上的用户进行身份验证,而 PAM 身份验证模块又可以实现影子密码、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 模块验证客户端输入的用户名/密码login
。
对于实际生产用途,最好使用插件openvpn-auth-pam
,因为它比脚本有几个优点auth-pam.pl
:
共享对象 openvpn-auth-pam 插件使用分割权限执行模型来提高安全性。这意味着 OpenVPN 服务器可以使用指令 user nobody、group nobody 和 chroot 以较低的权限运行,并且仍然能够针对 root 可读的影子密码文件进行身份验证。OpenVPN 可以通过虚拟内存而不是通过文件或环境将用户名/密码传递给插件,这对服务器机器上的本地安全性更有利。C 编译的插件模块通常比脚本运行得更快。如果您想了解有关开发用于 OpenVPN 的自己的插件的更多信息,请参阅 OpenVPN 源发行版的插件子目录中的 README 文件。
要在 Linux 上构建 openvpn-auth-pam 插件,请转到 OpenVPN 源分发中的 plugin/auth-pam 目录并运行 make。
使用用户名/密码验证作为客户端验证的唯一形式
默认情况下,auth-user-pass-verify
在服务器上使用或用户名/密码检查插件将启用双重身份验证,要求客户端证书和用户名/密码身份验证都成功才能对客户端进行身份验证。
虽然从安全角度来看不建议这样做,但也可以禁用客户端证书,并强制仅进行用户名/密码验证。在服务器上:
client-cert-not-required
此类配置通常还应设置:
username-as-common-name
这将告诉服务器使用用户名进行索引目的,因为它将使用通过客户端证书进行身份验证的客户端的通用名称。
请注意,这client-cert-not-required
不会消除对服务器证书的需求,因此,连接到使用客户端证书不必需的服务器的客户端可以从客户端配置文件中删除cert
和key
指令,但不会删除 ca 指令,因为客户端需要验证服务器证书。