我目前正在使用 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 客户端后最终删除。