Monit: алерты при SSH логинах на сервер

Автор: | 03/18/2019
 

Задача — отсылать уведомления на почту при SSH-логине на хост с недоверенных IP.

Используем Monit.

Устанавливаем:

root@jenkins-dev:/home/admin# apt update && apt -y install monit

Настраиваем отправку почты — задаём 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 user@example.com

Создаём файл /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:

root@jenkins-dev:/home/admin# systemctl restart monit

Проверяем — логинимся на сервер:

12:50:21 [setevoy@setevoy-arch-work ~]  $ sshjenkinsdev
...
admin@jenkins-dev:~$

Логи Monit:

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

И письмо:

 

Само собой, такой подход можно использовать для чего угодно, просто меняя условия в 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 выглядит так:

setevoy@rtfm-do-production:~$ cat /etc/monit/whitelist_ips.txt
194.***.***.26
188.***.***.48

Где один адрес — это сеть офиса, второй — мой домашний.

Готово.