Задача
Нужно отправлять уведомления, когда пользователь подключается по SSH.
Реализовать это можно несколькими способами.
Тут я рассмотрю варианты с отправкой уведомлений средствами sshrc и pam_exec.
sshrc
Скрипт sshrc запусается от имени пользователя при успешном установлении ssh-сессии в интерактивном режиме (то есть неинтерактивные сессии, которые, например, создают ssh-туннели, этот скрипт не запускают). Чтобы с его помощью отправлять уведомления нужно настроить sendmail, убедиться, что сообщения отправляются и потом прописать в файл /etc/ssh/sshrc такое:
ip=`echo $SSH_CONNECTION | cut -d " " -f 1` #logger -t ssh-wrapper $USER login from $ip printf "Subject: SSH Connection\nFrom: admin@autosys.tk\nUser $USER just logged in from $ip" | sudo sendmail admin@autosys.tk 2>/dev/null
Вероятно, может понадобиться разрешить запуск sendmail от имени непривилегированных пользователей:
sudo chmod 4755 /usr/sbin/sendmail sudo ln -s /usr/sbin/sendmail /usr/bin
Отправка уведомлений с помощью pam_exec
К сожалению, отправка уведомлений с помощью sshrc может не работать, если у пользователя сконфигурирован собственый файл ~/.ssh/rc. В этом случае, скрипт /etc/ssh/sshrc не работает и на помощь приходит pam_exec. В качестве бонуса - этот метод позволяет настроить уведомление и о других событиях входа (не только по ssh).
Итак, пишем скрипт login-notify.sh, который будет запускаться при успешной аутентификации. Например такой:
#!/bin/sh
sender="admin@autosys.tk"
recepient="admin@autosys.tk"
if [ "$PAM_TYPE" != "close_session" ]; then
host="`hostname`"
subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
# Message to send, e.g. the current environment variables.
message="`env`"
printf "Subject: $subject\nFrom: $sender\n$message\n`date`" | sendmail $recepient 2>/dev/null
# echo "$message" | mailx -r "$sender" -s "$subject" "$recepient"
fi
И делаем файл исполняемым.
После этого в файл /etc/pam.d/sshd добавляем строку:
session optional pam_exec.so seteuid /path/to/login-notify.sh
Для отладки, модуль pam_exec добавляем как optional (впоследствии можно заменить на required).
И указываем файл запускаемомго скрипта.
Discussion