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
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
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