История начинается с того что мне понадобилось настроить Fail2ban на блокировку по IP если кото-то неудачно залогинился в PostgreSQL, если интересно можно почитать тут. Так вот написал я своё правило верно, но при старте fail2ban получил ошибку Have not found any log file for postgres-lockuser jail. По сути ошибка говорит о том, что нет никаких логов в директории, что я указал. Но я-то знаю, что там есть, да и если выключить Selinux то всё работает прекрасно.

Решение Have not found any log file for jail

Начинающий специалист или в простонародном пофигист просто отключил бы этот вредный Selinux и пошёл дальше смотреть приколы в глобальной паутине. Но это не мой выход, и я решил разобраться. Да и решение на самом деле оказалось довольно простым.

/var/log/audit/audit.log

Для начала проверим логи /var/log/audit/audit.log.

sudo tail -f /var/log/audit/audit.log | grep fail2ban-server
type=AVC msg=audit(1665124834.173:407292): avc:  denied  { read } for  pid=16323 comm="fail2ban-server" name="log" dev="sdi" ino=1442802 scontext=system_u:system_r:fail2ban_t:s0 tcontext=system_u:object_r:unlabeled_t:s0 tclass=dir permissive=0

Да вроде бы и нашли что-то, но кто-то может и не понять, что тут да к чему, поэтому посмотрим немного с другой стороны, более удобной человеческому взгляду.

sudo audit2allow -w -a
type=AVC msg=audit(1665124834.173:407292): avc:  denied  { read } for  pid=16323 comm="fail2ban-server" name="log" dev="sdi" ino=1442802 scontext=system_u:system_r:fail2ban_t:s0 tcontext=system_u:object_r:unlabeled_t:s0 tclass=dir permissive=0
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

В итоге мы видим, что нет правила selinux чтобы Fail2ban имел доступ к логам PostgreSQL.

Создадим это правило

На самом деле всё просто и создаём мы все одной командой.

Для начала узнаем какое правило нам нужно найти в логах. Для этого выполняем:

sudo audit2allow -a
#============= fail2ban_t ==============
#!!!! WARNING: 'unlabeled_t' is a base type.
allow fail2ban_t unlabeled_t:dir read

Теперь используя grep отыщем логи с упоминанием fail2ban и сразу же создадим правило только для fail2ban. Иначе в правило попадут все проблемные сервисы и права для них.

sudo grep fail2ban /var/log/audit/audit.log | sudo audit2allow -M fail2ban-postgresql
To make this policy package active, execute:
semodule -i fail2ban-postgresql.pp

В выводе нам как бы сразу намекают что это еще не всё и нужно применить созданное правило. Но для начала рекомендую проверить какие файлы нам создала команда выше.

sudo ls -la | grep fail2ban
-rw-r-----. 1 root   root   2008 Oct  7 14:07 fail2ban-postgresql.pp
-rw-r-----. 1 root   root    840 Oct  7 14:07 fail2ban-postgresql.te

В файле fail2ban-postgresql.te как раз-таки и прописывается что будет происходить при активации данного правила.

sudo vim fail2ban-postgresql.te
module fail2ban-postgresql 1.0;

require {
        type unlabeled_t;
        type fail2ban_t;
        class dir read;
}

#============= fail2ban_t ==============

#!!!! WARNING: 'unlabeled_t' is a base type.
allow fail2ban_t unlabeled_t:dir read;

Применяем правило

И теперь собственно последний шаг в этом нелегком деле - это применить созданное правило.

sudo semodule -i fail2ban-postgresql.pp

Иногда возможно будет необходимо провести все операции еще раз, так как после исправления одной проблемы с Selinux возможно придётся исправлять новую.