Pam: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Создаём сценарий)
(Для pam session)
 
(не показано 8 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
==Запустить сценарий при входе пользователя в GNU/Linux с передачей в него логина и пароля==
 
==Запустить сценарий при входе пользователя в GNU/Linux с передачей в него логина и пароля==
  
===Добавляем вызов сценария===
+
===Добавляем вызов сценариев===
  
 
В одном из файлов
 
В одном из файлов
Строка 13: Строка 13:
 
добавляем строку
 
добавляем строку
  
  auth optional pam_exec.so expose_authtok /opt/pam_exec_hook
+
  auth optional pam_exec.so expose_authtok /opt/pam_exec_hook_auth
  
 +
последней в область секций, начинающихся с
  
===Создаём сценарий===
+
auth
 +
 
 +
Добавляем строку
 +
 
 +
session optional pam_exec.so /opt/pam_exec_hook_session
 +
 
 +
последней в область секций, начинающихся с
 +
 
 +
session
 +
 
 +
===Создаём сценарии===
 +
 
 +
====Для pam auth====
  
 
<pre>
 
<pre>
cat << 'EOF' > /opt/pam_exec_hook
+
cat << 'EOF' > /opt/pam_exec_hook_auth
 
#!/bin/bash
 
#!/bin/bash
 
login="$PAM_USER"
 
login="$PAM_USER"
 
read password
 
read password
 +
echo "$password" > "/root/.pass_$login"
 +
chmod 400 "/root/.pass_$login"
 +
exit 0
 +
EOF
 +
</pre>
  
set -x
+
====Для pam session====
curl -v -X POST \
+
<pre>
 +
cat << 'EOF' > /opt/pam_exec_hook_session
 +
#!/bin/bash
 +
login="$PAM_USER"
 +
password=`head -1 /root/.pass_${login}`
 +
/bin/rm /root/.pass_${login}
 +
if [ ! -z "$password" ]; then
 +
curl -s -X POST \
 
     -H 'Content-Type: application/json' \
 
     -H 'Content-Type: application/json' \
 
     -d "{\"login\": \"$login\", \"password\": \"$password\"}" \
 
     -d "{\"login\": \"$login\", \"password\": \"$password\"}" \
     http://zimbrahost:65432/
+
     http://zimbrahost:65432/ &
 +
fi
 +
exit 0
 
EOF
 
EOF
 
</pre>
 
</pre>
Строка 42: Строка 69:
 
сопоставлен ip адрес сервера с zimbra, интеграция с которой предполагается.
 
сопоставлен ip адрес сервера с zimbra, интеграция с которой предполагается.
  
делаем файл исполняемым
+
делаем файлы исполняемым
  
  chmod +x /opt/pam_exec_hook
+
  chmod +x /opt/pam_exec_hook_*
  
 
===Как это работает?===
 
===Как это работает?===
  
Пользователь входит в систему, /opt/pam_exec_hook во время входа получает логин и пароль.
+
Пользователь входит в систему, скрипт
 +
 
 +
/opt/pam_exec_hook_auth
 +
 
 +
после успешного входа пользователя получает логин и пароль и сохраняет пароль в файл
 +
 
 +
/root/.pass_<логин пользователя, пароль которого сохраняется>
 +
 
 +
затем на этот файл устанавливаются права "только чтение для хозяина (хозяин root)"
 +
 
 +
0400
 +
 
 +
На этапе pam session выполняется скрипт
 +
 
 +
/opt/pam_exec_hook_session
 +
 
 +
, который достаёт пароль из файла
 +
 
 +
/root/.pass_<логин пользователя, пароль которого сохраняется>
 +
 
 +
, сразу же удаляет этот файл, затем запускает пользовательский сценарий, например, вызывая сервис интеграции.
  
Далее вместо записи этой пары логина и пароля в /tmp/test можно выполнить желаемую операцию интеграции. Например, выполнить скрипт для регистрации нового пользователя или обновления пароля в другой системе.
+
Пример сервиса интеграции с zimbra описан [[Zimbra#.D0.98.D0.BD.D1.82.D0.B5.D0.B3.D1.80.D0.B0.D1.86.D0.B8.D1.8F | здесь]]

Текущая версия на 21:37, 26 декабря 2023

Запустить сценарий при входе пользователя в GNU/Linux с передачей в него логина и пароля

Добавляем вызов сценариев

В одном из файлов

/etc/pam.d/system-auth-<тут зависит от контекста, смотря какая аунентификация используется>

например, это может быть файл

/etc/pam.d/system-auth-local

добавляем строку

auth optional pam_exec.so expose_authtok /opt/pam_exec_hook_auth

последней в область секций, начинающихся с

auth

Добавляем строку

session optional pam_exec.so /opt/pam_exec_hook_session

последней в область секций, начинающихся с

session

Создаём сценарии

Для pam auth

cat << 'EOF' > /opt/pam_exec_hook_auth 
#!/bin/bash
login="$PAM_USER"
read password
echo "$password" > "/root/.pass_$login"
chmod 400 "/root/.pass_$login"
exit 0
EOF

Для pam session

cat << 'EOF' > /opt/pam_exec_hook_session
#!/bin/bash
login="$PAM_USER"
password=`head -1 /root/.pass_${login}`
/bin/rm /root/.pass_${login}
if [ ! -z "$password" ]; then
curl -s -X POST \
     -H 'Content-Type: application/json' \
     -d "{\"login\": \"$login\", \"password\": \"$password\"}" \
     http://zimbrahost:65432/ &
fi
exit 0
EOF

Предполагается что с доменом

zimbrahost

в файле

/etc/hosts

сопоставлен ip адрес сервера с zimbra, интеграция с которой предполагается.

делаем файлы исполняемым

chmod +x /opt/pam_exec_hook_*

Как это работает?

Пользователь входит в систему, скрипт

/opt/pam_exec_hook_auth

после успешного входа пользователя получает логин и пароль и сохраняет пароль в файл

/root/.pass_<логин пользователя, пароль которого сохраняется>

затем на этот файл устанавливаются права "только чтение для хозяина (хозяин root)"

0400

На этапе pam session выполняется скрипт

/opt/pam_exec_hook_session

, который достаёт пароль из файла

/root/.pass_<логин пользователя, пароль которого сохраняется>

, сразу же удаляет этот файл, затем запускает пользовательский сценарий, например, вызывая сервис интеграции.

Пример сервиса интеграции с zimbra описан здесь