Задача — отсылать уведомления на почту при SSH-логине на хост с недоверенных IP.
Используем Monit.
Устанавливаем:
[simterm]
root@jenkins-dev:/home/admin# apt update && apt -y install monit
[/simterm]
Настраиваем отправку почты — задаём localhost (у нас крутится локальный exim
), формат письма и получателя алертов.
Редактируем /etc/monit/monitrc
:
... set mailserver localhost set mail-format { from: Monit <monit@$HOST> subject: monit alert -- $EVENT $SERVICE message: $EVENT Service $SERVICE Date: $DATE Action: $ACTION Host: $HOST Description: $DESCRIPTION Your faithful employee, Monit } ... set alert [email protected]
Создаём файл /etc/monit/conf.d/ssh_alerts.conf
:
check file ssh_logins with path /var/log/auth.log ignore match "/etc/monit/whitelist_ips.txt" if match "Accepted publickey" then alert
См. документацию по IGNORE
тут>>>, и по формату письма — тут>>>.
Если вместо авторизации по ключам используется парольная авторизация — меняем «Accepted publickey» на «Accepted password«.
В файл /etc/monit/whitelist_ips.txt
пока заносим 1.1.1.1 — после теста обновим, и укажем реальный адрес, который надо игнорировать.
Перезапускаем monit
:
[simterm]
root@jenkins-dev:/home/admin# systemctl restart monit
[/simterm]
Проверяем — логинимся на сервер:
[simterm]
12:50:21 [setevoy@setevoy-arch-work ~] $ sshjenkinsdev ... admin@jenkins-dev:~$
[/simterm]
Логи Monit:
[simterm]
root@jenkins-dev:/home/admin# tail -f /var/log/monit.log Stored in '/var/lib/monit/id' [EET Mar 15 12:32:11] info : Starting Monit 5.20.0 daemon [EET Mar 15 12:32:11] info : 'jenkins-dev' Monit 5.20.0 started [EET Mar 15 12:39:37] info : Monit daemon with pid [5074] stopped [EET Mar 15 12:39:37] info : 'jenkins-dev' Monit 5.20.0 stopped [EET Mar 15 12:40:28] info : Starting Monit 5.20.0 daemon [EET Mar 15 12:40:28] info : 'jenkins-dev' Monit 5.20.0 started [EET Mar 15 12:50:28] error : 'ssh_logins' content match: Mar 15 12:50:25 localhost sshd[5262]: Accepted publickey for admin from 194.***.***.26 port 33586 ssh2 [EET Mar 15 12:52:28] info : 'ssh_logins' content doesn't match
[/simterm]
И письмо:
Само собой, такой подход можно использовать для чего угодно, просто меняя условия в if match
.
Например — для одного из своих сайтов, который закрыт от мира, и куда кроме меня никто заходить не должен — я добавил такое правило:
check file nginx_web_access with path /var/log/nginx/example.com-access.log ignore match "/etc/monit/whitelist_ips.txt" if match "GET" then alert
При любом GET
-запросе с IP, не добавленного в доверенные — придёт алерт на почту.
Сам /etc/monit/whitelist_ips.txt
выглядит так:
[simterm]
setevoy@rtfm-do-production:~$ cat /etc/monit/whitelist_ips.txt 194.***.***.26 188.***.***.48
[/simterm]
Где один адрес — это сеть офиса, второй — мой домашний.
Готово.