私はポート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
別のポートまたはカスタムポートがある場合は、それを許可します。
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
カスタムポリシーの作成よりも常にタイプの変更を優先します。この場合、Nginxはhttpd_sys_content_t
タイプ。ファイルが/ var/wwwにあると仮定します。
semanage fcontext -a -t httpd_sys_content_t /var/www/*
restorecon -R -v /var/www