Nginx proxy_pass не работает в selinux
У меня есть приложение, прослушивающее порт 8081 и Nginx, запущенный на порту 8080. Заявление прокси-сервера выглядит так:
/var/etc/opt/lj/output/services/abc.servicemanager.conf
location /api/abc.servicemanager/1.0 { proxy_pass http://localhost:8081;}
В nginx.conf я включаю этот файл как:
include /etc/nginx/conf.d/services/*.conf;
/etc/nginx/conf.d/service является символической ссылкой:
# ll /etc/nginx/conf.d/
lrwxrwxrwx. 1 root root 39 Dec 10 00:19 services -> ../../../var/etc/opt/lj/output/services
Это система Centon 7.0 SELinux Enabled. Если я установлю 0 и сделаю это Допустимым, я не вижу никаких проблем. Таким образом, файл находится в нужном месте и проблем с путями нет. Если SELinux работает, я вижу следующее в журнале аудита:
type=AVC msg=audit(1418348761.372:100930): avc: denied { getattr } for pid=3936 comm="nginx" path="/var/etc/opt/lj/output/services/abc.servicemanager.conf" dev="xvda1" ino=11063393 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=file
Я хочу знать, как включить Nginx для поиска файла conf без отключения SELinux. Благодарим вас за помощь.
-Vijay
Ответы
Ответ 1
Прочитайте о audit2allow и используйте его для создания политики, позволяющей получить доступ к отклоненным запросам для nginx.
[root]# sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -m nginxlocalconf > nginxlocalconf.te
[root]# cat nginxlocalconf.te
module nginxlocalconf 1.0;
require {
type httpd_t;
type var_t;
type transproxy_port_t;
class tcp_socket name_connect;
class file { read getattr open };
}
#============= httpd_t ==============
#!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'
allow httpd_t transproxy_port_t:tcp_socket name_connect;
allow httpd_t var_t:file { read getattr open };
[root]# sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M nginxlocalconf
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i nginxlocalconf.pp
[root]# semodule -i nginxlocalconf.pp
Ответ 2
Стоит отметить, что для начинающих в SELinux, если ваша прокси-служба работает на 8080, вы можете использовать следующую команду без компиляции политики.
$sudo setsebool httpd_can_network_connect 1 -P
Ответ 3
Если у вас есть другой порт или настраиваемый порт, разрешите его:
Показать разрешить порт в http:
semanage port -l | grep http
Это выводится в моем localhost:
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
И разрешите 8081:
semanage port -a -t http_port_t -p tcp 8081
Ответ 4
Всегда предпочитайте изменять типы для создания настраиваемых политик. В этом случае Nginx будет обслуживать файлы с типом httpd_sys_content_t
. Предполагая, что ваши файлы находятся в каталоге /var/www:
semanage fcontext -a -t httpd_sys_content_t /var/www/*
restorecon -R -v /var/www