web-dev-qa-db-fra.com

proxy_pass ne fonctionne pas lorsque SELinux est activé, pourquoi?

Je fais écouter une application sur le port 8081 et Nginx s'exécute sur le port 8080. L'instruction de passe du proxy ressemble à:

$ cat /var/etc/opt/lj/output/services/abc.servicemanager.conf

location /api/abc.servicemanager/1.0 { proxy_pass     http://localhost:8081;}

Dans nginx.conf, J'inclus ce fichier comme:

include /etc/nginx/conf.d/services/*.conf;

Le /etc/nginx/conf.d/service est un lien symbolique:

# ll /etc/nginx/conf.d/

lrwxrwxrwx. 1 root root   39 Dec 10 00:19 services -> ../../../var/etc/opt/lj/output/services

Il s'agit d'un système compatible CentOS 7.0 SELinux. Si je setenforce 0, et le rendre permissif, je ne vois aucun problème. Le fichier est donc au bon endroit et aucun problème avec les chemins. Si SELinux est en vigueur, je vois ce qui suit dans le journal d'audit:

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

Je veux savoir comment permettre à Nginx de trouver le fichier conf sans avoir à désactiver SELinux.

Lisez à propos de audit2allow et utilisez-le pour créer une stratégie permettant d'autoriser l'accès aux demandes refusées pour Nginx.

L'étape 1 consiste à exécuter audit2allow ciblant nginxlocalconf:

$ Sudo grep nginx /var/log/audit/audit.log | \
     grep denied | audit2allow -m nginxlocalconf > nginxlocalconf.te

Étape 2, examinez les résultats:

$ 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 };

Passez en revue les étapes d'activation:

$ Sudo grep nginx /var/log/audit/audit.log | grep denied | \
   audit2allow -M nginxlocalconf
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i nginxlocalconf.pp

Étape 3, active:

$ Sudo semodule -i nginxlocalconf.pp

Il convient de noter pour les débutants dans SELinux que si votre service proxy s'exécute sur 8080, vous pouvez utiliser la commande ci-dessous sans compiler de stratégie.

$ Sudo setsebool httpd_can_network_connect 1 -P
35

Si vous avez un autre port ou un port personnalisé, autorisez-le:

Afficher le port autorisé dans http:

semanage port -l | grep http

Ceci est sorti dans mon 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

Et autorisez 8081:

semanage port -a -t http_port_t -p tcp 8081
4
denzfarid

Préférez toujours changer de type à créer des politiques personnalisées. Dans ce cas, Nginx servira les fichiers avec le httpd_sys_content_t type. En supposant que vos fichiers se trouvent dans/var/www:

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