我正在尝试检查通过 SSH 连接到 Linux 服务器的用户是否已使用 Active Directory (Centrify) 进行身份验证。
如果他使用本地帐户(位于/etc/passwd
),我需要显示一条警告,要求他使用他的 Active Directory 帐户,然后提示再次登录。
我的第一次尝试是使用 PAM 模块 pam_script/etc/pam.d/login
来执行一个脚本,该脚本在用户登录时检查 /etc/passwd 中是否存在当前用户名,如果找到则显示警告并login
再次调用该命令。
我添加了以下行/etc/pam.d/login
session required pam_script.so runas=root
该行执行一个脚本文件,其中/etc/security/onsessionopen
包含:
#!/bin/sh
username=$1
if [ $(grep -c '^'$username':' /etc/passwd) = 1 ]
then
echo "Warning, please user your AD credentials"
login
fi
但同样的场景在/etc/pam.d/sshd
.使用 SSH 时,脚本会运行,但不会显示文本或登录提示。
有什么想法吗 ?谢谢
答案1
使用id
它相对容易知道您是通过广告还是本地连接/etc/passwd
。下一步将是有一个函数/etc/profile
可以发出警告消息。
答案2
更改相关帐户的外壳/etc/passwd
会很好
将其放入(例如)/usr/local/etc/mustuseadlogin
并使其可执行:
#!/bin/sh
echo
echo "Please log in with AD authentication" >&2
echo
sleep 10
exit 0
现在编辑/etc/passwd
(最好使用vipw
)并将所有受影响帐户的最后一个字段更改为/usr/local/etc/mustuseadlogin
。例如,
roaima:x:1001:1001:I am roaima:/home/roaima:/usr/local/etc/mustuseadlogin
答案3
标准“登录”的绝佳解决方案。不幸的是,我认为您不会有太多运气让“sshd”获得同样的行为。这是由于 sshd 在建立连接时使用的基本连接过程造成的。当我们到达 PAM 堆栈(或配置文件位,如其他建议中)时,用户名已经解析;由 SSH 客户端提交。
这是一个可以更详细地说明这一点的资源:https://serverfault.com/questions/330310/force-ssh-to-prompt-for-user
鉴于此信息,我建议一个理想的解决方案可能是坚持使用您的脚本(或 /etc/profile 添加),但是对于“sshd”堆栈;不要点击“登录”,而是让它休眠 10 秒或其他什么(以确保看到警告),然后关闭会话。
答案4
该pam_script
模块使用其退出状态来告诉调用堆栈要做什么。将您的代码更改为此,它将起作用:
#!/bin/bash
username="$1"
if [[ root != "$username" ]] && grep -q '^'"$username"':' /etc/passwd
then
echo "Warning, please user your AD credentials"
exit 1
fi
exit 0
我已将其排除root
在区块之外。您可以调整[[ ... ]]
UID < 500 等的测试,以应用于您自己的场景。