检查通过 SSH 登录的用户是否通过 Active Direcory

检查通过 SSH 登录的用户是否通过 Active Direcory

我正在尝试检查通过 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 等的测试,以应用于您自己的场景。

相关内容