Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD

Nginx SELinux

Дата обновления: 13.05.2020

Теги: SELinux Linux

Вот опять столкнулся в очередном мануале по Nginx: disable SELinux. Люди, зачем?!

Не запускается Nginx? Смотрим, почему:

# cat /var/log/nginx/error.log
2020/05/13 12:41:32 [emerg] 21744#0: bind() to 0.0.0.0:25 failed (13: Permission denied)

Проверяем, может SELinux  мешает (в данном случае мешает):

# grep nginx /var/log/audit/audit.log

type=AVC msg=audit(1589362892.868:2287): avc:  denied  { name_bind } for  pid=21744 comm="nginx" src=25 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:smtp_port_t:s0 tclass=tcp_socket permissive=0

Можно просто разрешить httpd биндить порт 25 (в данном случае это помогло бы):

# semanage port -a -t http_port_t -p tcp 25

А можно сделать модуль для nginx.

# grep nginx /var/log/audit/audit.log | audit2allow -m nginx > nginx.te

Расширение .te - Type Enforcement file.

Содержимое этого файла - набор того, что требуется разрешить (то же, что и вывод команды "cat /var/log/audit/audit.log | audit2allow -m nginx").

Проверяем содержимое файла, чтобы не разрешить что-то лишнее:

# less nginx.te
module nginx 1.0;

require {
        type httpd_t;
        type smtp_port_t;
        class tcp_socket name_bind;
}

#============= httpd_t ==============
allow httpd_t smtp_port_t:tcp_socket name_bind;

Контексту httpd требуется доступ к 25 (smtp). В моем случае это легитимно. Компилю политику:

# checkmodule -M -m -o nginx.mod nginx.te
# semodule_package -o nginx.pp -m nginx.mod

Загружаю модуль:

# semodule -i nginx.pp

Проверяю, что модель загружен:

# semodule -l | grep nginx

Все. Забудьте вы уже про "для начала отключаю SELinux".

Чем хорош модуль? Его можно выключить (semodule -v -d nginx), включить (semodule -e nginx), сохранить для деплоя или истории. 


Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?