Назад | Перейти на главную страницу

Как создать условное поведение с помощью 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"

Это странное поведение. Последняя строка должна быть выход достигнут.
Поэтому Пэм каждый раз принимает условие ложным. Но для тестирования я поставил echo $PAM_TYPE; в истинном состоянии, и это эхо отображается в терминале при выходе из системы. Итак, оператор if приводит к правда с участием exit 0 но pam_exec принимает это как ложное.

Кто-нибудь знает, что происходит не так?

Заранее спасибо,

Helge

У меня есть ответ с другого сайта:

Вы не можете зависеть от переходов в стеке PAM в вызовах close_session. Стек модулей pam «замораживается» в open_session, и идентичные модули в том же порядке вызываются в вызове close_session.

Теперь поведение моих скриптов ясно: мой подход невозможен!