Задача
Нужно отправлять уведомления, когда пользователь подключается по 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