Задача: после каждой авторизации пользователя root по SSH/SFTP слать уведомление админу на почту с ip адресом пользователя.
Для определения входа используем PAM.
Ip адрес буду брать из /var/log/auth.log
как последние 10 строк.
В файл /etc/pam.d/common-auth
добавить строку
auth optional pam_exec.so /bin/login-notify
Создаём файл /bin/login-notify
и вставляем:
#!/bin/bash exec /root/root-auth-sender.sh &
Из /etc/pam.d/common-auth
нельзя запустить скрипт из произвольных папок (у меня не получилось). Поэтому помещаем скрипт-враппер в папку /bin
или /usr/bin
и уже из него запускаем внешний наш скрипт.
Зачем запускать скрипт в фоне через &
?
Запись в лог /var/log/auth.log
об успешной авторизации происходит после выполнение скрипта /bin/login-notify
, поэтому необходимо выждать какую нибудь паузу, например 1 сек., и уже потом считать из него последние несколько строк с ip адресом последнего авторизованного пользователя.
Содержимое файла /root/root-auth-sender.sh
#!/bin/bash PATH=/bin:/usr/bin MAILTO="root@localhost" MAILFROM="root@localhost" sleep 1 if [ $PAM_USER == "root" ]; then CURDATE=`date +%Y-%m-%d_%H:%M:%S` TAILLOG=`tail -10 /var/log/auth.log` echo "${CURDATE} root user auth via ssh/sftp tail -10 /var/log/auth.log ${TAILLOG}" | mutt -s "root user auth" -e 'my_hdr From: rootAuth <${MAILFROM}>' -- $MAILTO fi
Для отправки письма с сервера должен быть настроен почтовый сервер и установлен mutt. Так же проставить флаг запуска +x на обоих созданных файлах:
chmod +x /bin/login-notify chmod +x /root/root-auth-sender.sh
Пример получаемого письма:
2020-01-17_16:44:51 root user auth via ssh/sftp tail -10 /var/log/auth.log Jan 17 16:41:01 s1 CRON[18635]: pam_unix(cron:session): session closed for user root Jan 17 16:42:01 s1 CRON[18656]: pam_unix(cron:session): session opened for user root by (uid=0) Jan 17 16:42:01 s1 CRON[18656]: pam_unix(cron:session): session closed for user root Jan 17 16:43:01 s1 CRON[18675]: pam_unix(cron:session): session opened for user root by (uid=0) Jan 17 16:43:02 s1 CRON[18675]: pam_unix(cron:session): session closed for user root Jan 17 16:44:01 s1 CRON[18696]: pam_unix(cron:session): session opened for user root by (uid=0) Jan 17 16:44:01 s1 CRON[18696]: pam_unix(cron:session): session closed for user root Jan 17 16:44:50 s1 sshd[18715]: Accepted password for root from 192.168.56.1 port 62529 ssh2 Jan 17 16:44:50 s1 sshd[18715]: pam_unix(sshd:session): session opened for user root by (uid=0) Jan 17 16:44:50 s1 systemd-logind[1114]: New session 2392 of user root.
Как видно из письма скрипт запустился в 16:44:51, а авторизация в логе прошло в 16:44:50 — разница в 1 сек. Всё правильно.