OpenVPN 客户端连接到服务器后,通过脚本的退出状态进行额外身份验证

OpenVPN 客户端连接到服务器后,通过脚本的退出状态进行额外身份验证

我目前正在使用 pam 插件来验证 openvpn 客户端。它工作正常。我正在使用重复的证书,但需要在主机上进行后续检查 - 自制的 Pulse Secure 主机检查器。

我尝试过客户端连接、up 等,但不起作用。我可能完全搞错了。客户端连接和 up 都给我:

警告:运行命令失败():外部程序因错误状态退出:1

我想要发送给客户端的脚本会查找是否存在“秘密”文件。实际实现会查找 10 个文件,但我想保持简单。总之,我需要进行身份验证查找此文件以允许连接。理想情况下,客户端会收到一条消息,如“不是批准的平台。”。当我不能让用户修改他们的 ovpn 文件时,这可能吗?

hostcheck.sh(777 权限)

cat hostcheck.sh
#!/bin/sh

if [ -f /etc/secretfile ] ; then 
    exit 0
else
    exit 1
fi

exit 1

server.conf

duplicate-cn
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
#auth-user-pass-verify /etc/openvpn/hostcheck.sh via-file
script-security 2 
#client-connect /etc/openvpn/hostcheck.sh
up /etc/openvpn/hostcheck.sh
username-as-common-name
#tmp-dir /dev/shm
tmp-dir /tmp

答案1

首先,您是否尝试过从命令行运行脚本?它返回了吗exit 1?您是否尝试过调试您的if语句?是否/etc/secretfile存在?如果不存在,则脚本正在执行您要求它执行的操作。的权限是什么secretfile?如果用户无法访问它,那么它可能对他们来说不“存在”。

通过到期锁定用户帐户

您能不能不将文件放在那里或者删除它,而直接锁定帐户呢?

当您不希望用户访问机器时锁定帐户:

usermod username -e 1999-01-01

当您想要允许访问时,请解锁帐户:

usermod username -e

在这里,我们使用 Linux 身份验证的原生功能(而不是我们自己的自定义脚本)来解决问题,这应该有助于防止额外的安全风险。如果您确实想要或需要这样做,您可以按照您描述的方式进行操作。例如,使用作业cron或轮询文件来锁定/解锁帐户,而不是在连接时使身份验证复杂化。


通过黑名单/白名单组进行限制pam

如果您不希望用户访问整个系统,而不是限制单个用户,您还有其他选择,例如完全禁用 SSH,将 SSH 连接限制到白名单 CIDR 块,或者最简单且符合您的目标,pam针对特定组使用。

/etc/pam.d/system-auth

auth required pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.group.allowed

/etc/login.group.allowed

wheel
sudo

在此示例中,我们仅允许用户wheel登录sudo。这将允许您禁用大多数用户的登录,同时允许某些管理员访问,或者如果您愿意,撤销所有访问权限。您需要确保它归管理员所有,root并且具有类似644权限以防止未经授权的写入(以/etc/password权限为模型)。


使用双因素一次性密码 (OTP)pam

这只是一个很酷的替代方案,它可以根据有权访问 OTP 机密的用户列表来帮助限制访问。pam_oath模块设置简单,并支持 FOSS 客户端,例如验证器。此示例显示基于用户的 OTP,但可以针对组进行调整,类似于上一个示例。您需要oath-toolkit并想要qrencode

touch /etc/users.oath
chown 600 /etc/users.oath # Will contain sensitive information
vim /etc/pam.d/sshd
#%PAM-1.0
#auth     required  pam_securetty.so     #disable remote root
#auth      include   system-remote-login
auth      required  pam_oath.so usersfile=/etc/users.oath window=30 digits=6
account   include   system-remote-login
password  include   system-remote-login
session   include   system-remote-login

对于每个用户:

USER=myusername
SECRET=$(head -10 /dev/urandom | sha512sum | cut -b 1-30)
echo "HOTP/T30/6 ${USER} - ${SECRET}" >> /etc/users.oauth
QR_SECRET=$(oauthtool -v -d6 ${SECRET} | grep "Base32 secret" | awk '{print $3}')
qrencode -o ${USER}-OTP-secret.png $QR_SECRET

这将仅允许基于密钥的身份验证,然后要求在登录时输入一次性密码。有命令行 OTP 生成器,但通常使用二维码来输入凭据。SECRET 和 QR_SECRET 以及生成的图像文件都应视为机密,并在设置 OTP 客户端后最终删除。

相关内容