web-dev-qa-db-ja.com

SELinuxを使用してPHPスクリプトを制限するにはどうすればよいですか?

SL6.4(RHEL 6.4再構築)Webサーバー上のさまざまなPHPアプリケーションを区分して、互いのデータにアクセスできないようにしたい。SELinuxはこれを実行できるようですが、詳細はわかりませんが、質問には2つの部分があります。

  1. SElinuxはmod_phpを使用してApacheプロセスで実行されているPHPスクリプトをどのように管理しますか?PHPスクリプトを実行しているときに、プロセスは何らかの形でスクリプトコンテキストに入りますか、それともそれだけを行いますか?スクリプトがCGIまたはFastCGIを介してアウトプロセスで実行された場合に機能しますか?スクリプトコンテキストに移行してPHPスクリプトを実行する場合、何がPHPメインのhttpdコンテキストへの遷移をトリガーすることによるバグ?代替のPHPデプロイメントメソッドが必要な場合は、それを知っておくとよいでしょう。
  2. スクリプト/アプリケーションを分離して、たとえばTinyTinyRSSはOpenCloudが所有するものにアクセスできませんか? httpd_unifiedをオフにし、httpd_ttrss_*httpd_opencloud_*と並行して、個別のhttpd_user_foohttpd_sys_fooのコンテキストセットを提供することでこれを実行できるはずです。使用できるアプリの数を考えると、新しいコンテキストなしでsys /ユーザーの区別を使用するだけで十分かもしれません。しかし、httpd_unifiedをオフにすることの意味や、さまざまなHTTPコンテキストを設定する方法についてのドキュメントはあまり見つかりませんでした。特にPHPスクリプトはmod_phpを介して実行されます。

新しいSELinuxポリシーモジュールを作成することは問題ありませんが、新しいポリシーを実行するために必要なことと、SELinuxターゲットポリシーとうまく統合する方法を示すドキュメントが必要です。

SELinuxだけでこの分離を行おうとすることが失われた原因であり、異なるコンテキストで別々のhttpdを起動する必要がある場合、またはLXCコンテナーでさえも、それも有用な答えになります。

8

このレベルの分離を実現する最良の方法は、タイプ遷移ではなく、カテゴリ/ MCS遷移を使用することです。これは、libvirt KVMのもののsvirt実装のように少し機能します。

OK、最初に行う必要があるのは、mod_selinuxというhttpdモジュールをダウンロードすることです。それはかなり長い間Fedoraリポジトリに浮かんでいましたが、残念ながら実際にEL6システムに組み込まれたことはありません。

いずれの場合も、Fedoraソースからパッケージを再構築できます。私はFedoraマシンでこれを行いましたが、ミラーから同じパッケージをダウンロードすることができます。 httpd-2.2を実行するため、ベースとしてF16を使用しました。

yumdownloader --source mod_selinux --releaserver=16
...
mod_selinux-2.2.2454-3.fc15.src.rpm                        |  23 kB   00:00

次に、ダウンロードしたら、EL6ボックスで再構築します。

rpmbuild --rebuild mod_selinux-2.2.2454-3.fc15.src.rpm
...
Wrote: /home/build/rpmbuild/RPMS/x86_64/mod_selinux-2.2.2454-3.el6.x86_64.rpm

最後にモジュールをインストールします。

rpm -i /home/build/rpmbuild/RPMS/x86_64/mod_selinux-2.2.2454-3.el6.x86_64.rpm

RPMは、必要なhttpdのモジュールと、これを実行するためにも必要なhttpdのポリシーをインストールします。

このモジュールのファイルは/etc/httpd/conf.d/mod_selinux.confにインストールされています。

このプロセスの最初の段階は、メインのhttpdプロセスが実行されるカテゴリの数を増やして、正しい範囲にまたがる子スレッドを生成できるようにすることです。ファイルの変更:

selinuxServerDomain     *:s0

selinuxServerDomain     *:s0-s0:c0.c1023

ここで、Apacheの各仮想ホストにカテゴリを割り当てる必要があります。これは、以下の例のようにselinuxDomainValという行を追加することによって行われます。

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/Host1
    ServerName Host1.virtual
    selinuxDomainVal *:s0:c0
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/Host2
    ServerName Host2.virtual
    selinuxDomainVal *:s0:c1
</VirtualHost>

次に、各ホストのドキュメントルートで、ドキュメントルートのラベルをhttpd構成でラベル付けされたものと同じ同じカテゴリに変更します。

chcon -R -l s0:c0 /var/www/vhosts/Host1
chcon -R -l s0:c1 /var/www/vhosts/Host2

システムのラベルを変更した場合にラベルが適用されるようにする場合は、ローカルポリシーも更新することをお勧めします。

semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c0 '/var/www/vhosts/Host1(/.*)?'
semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c1 '/var/www/vhosts/Host2(/.*)?'

以上です!ドキュメントのルートを離れて、今すぐ他の人を探索することは不可能です。

5
Matthew Ife

この質問は7年前のものですが、上記の@MatthewIfeによる回答は役に立ちましたが、いくつかの追加手順が必要でした。箱から出してまだmod_selinuxが含まれていないCentOS8を使用しているので、上記の答えはそれをインストールするのに完璧でした。

ただし、インストール後、および正しいセットアップの後、ApacheはAVCテストに失敗し、起動しませんでした。 /var/log/httpd/error.log/var/log/messages、および/var/log/audit/audit.logで利用可能なエラーはあまり役に立ちませんでした。

最終的に、selinux AVCエラーのトラブルシューティングを可能にする2つの追加ユーティリティをインストールする必要がありました。これは、httpdサービスがsetcurrentコマンドにアクセスできるようにするカスタムポリシーを作成する必要があることを示しています。 selinuxで。

ここで解決策を見つけることができます: CentOS8でSELinuxコンテキストを使用したApache vhost特権分離

それが他の誰かがこれに出くわすのを助けることを願っています。

1
oucil