我正在为 OpenVPN 设置 PAM 服务,以便 OpenVPN PAM 模块可以向我将使用 shell 脚本实现的外部服务验证用户名/密码。
OpenVPN PAM 模块大致说明以下文档:
插件 openvpn-auth-pam.so “openvpn 名称 USERNAME 密码 PASSWORD”
虽然“USERNAME”和“PASSWORD”是替代客户端提供的值的特殊字符串,但也可以命名文字值以用作 PAM 模块查询响应。例如,假设登录模块查询第三个参数“domain”,该参数将使用常量值“mydomain.com”来回答:
所以现在我在 /etc/pam.d/openvpn 中创建了一个 openvpn PAM 配置:
auth required pam_exec.so expose_authtok /tmp/outputenv
这让我能够执行脚本并从 stdin 获取密码,太棒了,我已经完成了 95%。但我无法访问用户名。我检查了环境变量和我能想到的任何东西,但我不知道如何将用户名和密码都传递给我的脚本进行外部身份验证。
有想法吗?
答案1
该问题的完整答案发布在此处:
https://forums.openvpn.net/post13002.html#p13002
基本上,openvpn 的 PAM 模块文档中的示例会误导您,它使用:
plugin openvpn-auth-pam.so "login login USERNAME password PASSWORD"
但是openvpn的server.config正确的配置是:
plugin /usr/local/openvpn/sbin/openvpn-auth-pam.so "openvpn"
如果您包含文档示例中显示的额外参数,它将永远不会将 PAM_USER 写入环境变量,正如 pam_exec.so 文档所预期的那样。