私は現在、CentOSSelinuxフォレストで「失われています」。
私のセットアップでは、nginxがUWSGIプロセスとの通信に使用する_/var/www/demo/out
_にWSGIソケットをセットアップします。ブラウザでページをリクエストするたびに、nginxエラーが発生します。
なぜこのSelinuxが関連しているのですか?
setenforce 0
_でSelinuxを無効にすると修正されます。denied
およびmissing type enforcement (TE) allow rule
を表示するのか_httpd_sys_content_t
_ラベルをソケットに追加しようとしたので、nginxはソケットファイルの読み取りと書き込みを許可され、新しいラベルを追加した後にrestoreconを実行しました。
_audit2allow
_を介して違反を実行すると、次のポリシーが返されます。
_module nginx 1.0;
require {
type httpd_t;
type var_t;
type httpd_sys_content_t;
class sock_file write;
}
#============= httpd_t ==============
allow httpd_t httpd_sys_content_t:sock_file write;
#!!!! WARNING: 'var_t' is a base type.
allow httpd_t var_t:sock_file write;
_
私が理解している最初のルールですが、2番目のルールは何を伝えていますか? nginxプロセスが_var_t
_を含むtcontextを要求しているので、この新しいコンテキストを含む新しいselinuxポリシーが必要ですか?
では、なぜこの警告がここにあるのでしょうか。 varのようなディレクトリをポリシーに追加するのが一般的すぎる/具体的ではないという不満はありますか?この場合、このポリシーを_var_www_t
_のようなものに絞り込むことはできませんか?また、これが当てはまる場合、root以外のユーザーの下で実行されているuwsgiプロセスがソケットへの書き込みを許可されるのはなぜですか?
SELinuxがすでに期待している場所にソケットを配置することを検討してください。
# semanage fcontext -l | grep httpd_var_run_t | grep wsgi
/var/run/wsgi.* socket system_u:object_r:httpd_var_run_t:s0
したがって、/run/wsgi.anything
を作成し、それをソケットとして使用すると、完全に機能します。これは起動のたびにクリアされる一時ディレクトリであるため、通常は tmpfiles.d
構成 を使用して、起動時に自分でソケットを作成する必要があることに注意してください。例えば:
p+ /run/wsgi.anything 0660 user group - -
あなたがあまりにも多くを与えているかもしれないので、警告はそこにあります。 httpdが/ var内の任意のソケットに書き込むことを許可しますが、これは希望どおりではない可能性があります。
Httpd_unifiedブール値を有効にしていない限り、httpd_sys_content_tコンテキストはファイルへの読み取りアクセスのみを許可します。ソケットをhttpdで書き込み可能にする場合は、ソケットをhttpd_sys_rw_content_tに設定する必要があります。
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/demo/out"
restorecon -Rv /var/www/demo/out
マイケルハンプトンはすぐに私を修正するために一緒にいると確信しています
Selinux基本型はジェネリック型であり、許可されると、基盤となるシステムの非常に重要な部分へのアクセスを許可します。 var_t
に対してselinuxアクセスを有効にすることは、プロセスを制限なしで実行することとほぼ同等です。
私たちが本当に止めたいのは、BASE型に書き込むドメインです。制限されたドメインがetc_tやusr_tなどのBASEタイプに書き込むことを許可すると、他のほとんどすべてのドメインがetc_tまたはusr_tのコンテンツを読み取る必要があるため、ハッキングされたシステムが他のドメインを攻撃する可能性があります。
/var/www/
の下のファイルにはすでにhttpd_sys_content_t
のラベルが付いています。同じラベルでラベルを付け直すことで、何も変更しません。私が覚えていることから、httpd_sys_content_t
はソケットではなく静的HTMLファイルに使用する必要があります。ソケットのラベルを次のように変更してみてください。
semanage fcontext -a -t httpd_var_run_t </your/socket/path>
restorecon -RF </your/socket/path>
同様の問題については ここ を読むことができます。