SELinux、Nginx、fcgiWrap: fcgiWrap ソケットへのアクセスを許可するにはどうすればよいでしょうか?

SELinux、Nginx、fcgiWrap: fcgiWrap ソケットへのアクセスを許可するにはどうすればよいでしょうか?

私は 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 を対話させる方が、安全性は低くなりますが、はるかに簡単です。

関連情報