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

时间:2019-06-03 10:47:38

标签: pam

我想为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每次将条件设为假。但是为了进行测试,我将echo $PAM_TYPE;设置为true,并且该回显通过注销显示在终端中。因此,如果if语句使用exit 0导致 true ,但pam_exec将其视为false。

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

预先感谢

Helge

1 个答案:

答案 0 :(得分:0)

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

  

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

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