如何使用 pam_exec 和 PAM_TYPE 创建条件行为?

如何使用 pam_exec 和 PAM_TYPE 创建条件行为?

我想实现 PAM_TYPE open_session 和 close_session 的条件。这样我就可以在不同的时间触发不同的登录和注销操作。

我有一个脚本,它测试变量 PAM_TYPE 并给出适当的退出代码:成功时退出 0,否则退出 1。

但是我在程序集方面遇到了一些奇怪的问题;pam_exec 无法从脚本中获取正确的退出代码。

以下是我的测试实现:

/etc/pam.d/common-session添加了:

session [success=ignore default=1] pam_exec.so debug seteuid /usr/sbin/test.sh logout
session optional        pam_exec.so debug log=/tmp/test_pam.txt /bin/echo "logout reached"
session [success=1 default=ignore] pam_exec.so debug seteuid /usr/sbin/test.sh logout
session optional        pam_exec.so  debug log=/tmp/test_pam.txt /bin/echo "login reached"

脚本/usr/sbin/test.sh

#!/bin/bash
# some actions
# invocted by pam_exec.so

echo $PAM_TYPE
case $1 in
logout)
  if [ $PAM_TYPE == "close_session" ]; then echo $PAM_TYPE; exit 0; else exit 1; fi
  ;;
esac

当我对用户执行 su 并立即注销时,我进入了日志文件

$ cat /tmp/test_pam.txt 
*** Mon Jun  3 12:14:07 2019
"login reached"
*** Mon Jun  3 12:15:00 2019
"login reached"

这种行为很奇怪。最后一行必须是已达到注销
因此,Pam 每次都将条件设为 false。但为了测试,我设置了 echo $PAM_TYPE;true 条件,并且此回显通过 logout 显示在终端中。因此,if 语句导致真的exit 0pam_exec 将其视为错误。

有人知道出了什么问题吗?

提前致谢,

黑尔格

答案1

我从另一个网站得到这个答案:

您不能依赖 close_session 调用中的 PAM 堆栈跳转。pam 模块堆栈在 open_session 中被“冻结”,并且在 close_session 调用中以相同顺序调用相同的模块。

我的脚本的行为现在很清楚:我的方法是不可能的!

答案2

在 /etc/pam.d/sshd 中

会话需要 pam_exec.so /etc/pam_scripts/pam_exec.sh

其中 pam_exec.sh 有类似

如果 [ "$PAM_TYPE" == "open_session" ] && [ "$PAM_USER" != "root" ]; 然后

..做一点事

别的

做点别的事

出口 0

相关内容