Nginx proxy pass не работает в selinux


У меня есть приложение, прослушивающее порт 8081, и Nginx, работающий на порту 8080. Оператор proxy pass выглядит следующим образом:

/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

Это система с поддержкой Centos 7.0 SELinux. Если я установлю силу 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. Заранее благодарю за помощь.

- Виджай

4 12

4 ответа:

Стоит отметить для новичков в SELinux, что если ваш проксируемый сервис работает на 8080, вы можете использовать команду ниже без компиляции политики.

$sudo setsebool httpd_can_network_connect 1 -P

Прочитал о 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

Всегда предпочитайте изменение типов созданию пользовательских политик. В этом случае Nginx будет обслуживать файлы с типом httpd_sys_content_t. Предположим, что ваши файлы находятся в /var / www:

semanage fcontext -a -t httpd_sys_content_t /var/www/*
restorecon -R -v /var/www

Если у вас есть другой порт или пользовательский порт, разрешите ему:

Показать разрешенный порт в 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