私は Fedora 31 (Linux カーネル 5.4.13、Nginx 1.16.1、fcgiwrap 1.1.0) を使用して、SELinux を強制モード (ポリシー: 対象 3.14.4-44.fc31) で実行しています。
私のマシンはNginxで動作するサーバーをホストしています。その一部はPerlスクリプトに依存しています。Nginxは、fcgiwrap(Unixソケット/var/run/fcgiwrap/経由の接続)を使用してFastCGIを介してCGI実行を渡すように構成されています。[メールアドレス])。
すべては「Permissive」モードでテストされました。その後、「Enforcing」モードに切り替えられました。監査コメントで提案されているように、ブール値を変更するかカスタム ポリシーを作成することで処理できる AVC が多数受信されました。
しかし、1 つの AVC だけを扱うことはできません。ジャーナルは次のように伝えています。
type=AVC msg=audit(1580046727.459:548): avc: denied { connectto } for pid=4619 comm="nginx" path="/run/fcgiwrap/fcgiwrap-0.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
カスタム ポリシーには次の内容が含まれます。
module nginx 1.0;
require {
type httpd_t;
type soundd_port_t;
type http_port_t;
type tor_port_t;
type unconfined_service_t;
type httpd_user_content_t;
class tcp_socket { name_bind name_connect };
class file { getattr read };
class unix_stream_socket connectto;
}
#============= httpd_t ==============
#!!!! This avc is allowed in the current policy
allow httpd_t http_port_t:tcp_socket name_connect;
#!!!! This avc is allowed in the current policy
allow httpd_t httpd_user_content_t:file { getattr read };
allow httpd_t soundd_port_t:tcp_socket name_bind;
#!!!! This avc is allowed in the current policy
allow httpd_t tor_port_t:tcp_socket name_connect;
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
自動生成されたコメントからわかるように、このカスタム ポリシーはグローバル ポリシーにすでに含まれているため、効果はありません。
このモジュールを追加した後、何も変わりません。同じ修正を提案する AVC アラートが引き続き表示されます。
「許可」に戻すかドメインを設定するとhttpd許可モードでは、CGI スクリプトが実行され、期待どおりの出力が得られます。
ls -Z /var/run/fcgiwrap/fcgiwrap-0.sock
戻り値:
system_u:object_r:httpd_var_run_t:s0 /var/run/fcgiwrap/fcgiwrap-0.sock
ラベルがどこで使用されているか、またこのファイル タイプへのアクセスをブール値で制御しているかどうかはわかりませんでしたhttpd_var_run_t
(私は SELinux 構成の初心者です)。
「Enforcing」モードでソケットへのアクセスを許可するにはどうすればよいですか?
編集 2020-01-27
モジュールにはすでに遷移ルールがあるようですアパッチのために:
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
しかし、それは効果がない、または別のモジュール(どれ?)がそれをブロックしています。一時的な回避策は、ドメインhttpd許可モードでは、どの Web サーバーでも何でも実行できるようになるため、このモードは気に入りません。
移行が拒否される理由について何かご存知ですか?
答え1
私はこれを十分に確認したりテストしたりしていません。実際、これだけでは機能しないと確信しています。
パスの作成には/var/run/fcgiwrap
ディレクトリ タイプがあると想定していますunconfined_service_t
が、実際にそうであるかどうかはわかりません。
しかし、これで何かを始めるきっかけになるはずです。
policy_module(nginx_local, 31.0.0)
require {
type httpd_t;
type unconfined_service_t;
}
stream_connect_pattern(httpd_t, unconfined_service_t, unconfined_service_t, unconfined_service_t)
ネットワークの問題に関しては、ブール値をオンにするだけで、httpd_can_network_connect
すでにいくつかの問題が解消されるはずです。ただし、特定の問題を特定したい場合を除く。
最良かつ理想的な状況では、fcgi プロセス専用のポリシーを作成するのが理想的ですが、これははるかに困難な作業であるため、制限のないサービスとのみ nginx を対話させる方が、安全性は低くなりますが、はるかに簡単です。