web-dev-qa-db-ja.com

SELinuxが有効になっていると、proxy_passが機能しません。なぜですか?

私はポート8081でアプリケーションをリッスンし、ポート8080でNginxを実行しています。プロキシパスステートメントは次のようになります。

$ cat /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対応システムです。もし私が setenforce 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がSELinuxを無効にすることなくconfファイルを見つけられるようにする方法を知りたいです。

Audit2allowについて読み、それを使用して、Nginxの拒否された要求へのアクセスを許可するポリシーを作成します。

ステップ1では、nginxlocalconfをターゲットにしてaudit2allowを実行します。

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

ステップ2、結果を確認します。

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

アクティブ化する手順を確認します。

$ 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

ステップ3、アクティブ:

$ Sudo semodule -i nginxlocalconf.pp

プロキシサービスが8080で実行されている場合は、ポリシーをコンパイルせずに以下のコマンドを使用できることをSELinuxの初心者に注目する価値があります。

$ Sudo setsebool httpd_can_network_connect 1 -P
35

別のポートまたはカスタムポートがある場合は、それを許可します。

Httpで許可ポートを表示:

semanage port -l | grep http

これは私のローカルホストに出力されます:

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
denzfarid

カスタムポリシーの作成よりも常にタイプの変更を優先します。この場合、Nginxはhttpd_sys_content_tタイプ。ファイルが/ var/wwwにあると仮定します。

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