Apache、PHP、SELinuxをデフォルト構成で使用した最小限のCentOSシステムをインストールしました。
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 29
Apacheルートディレクトリを変更したい場合は、この新しいディレクトリにラベルを付け直す必要があります。そうしないと、SELinuxがアクセスをブロックします。しかし、PHPスクリプトを使用すると、予想よりもはるかに多くのことを実行できることがわかりました。たとえば、アラートなしで次のアクションを実行できます。
/etc/passwd
を読んで、/var/tmp
、ただし、/etc/shadow
の属性を読み取ろうとしたとき、またはホームディレクトリにアクセスしようとしたときに、AVCアラートを受け取ります。
まず第一に、それは正常ですか?そして、SELinuxを微調整してより多くのPHPアクションを制限するにはどうすればよいですか?
CentOS 7を使用しており、selinux-policyのバージョンは3.13.1-23.el7_1.7です。 (私もFedoraで同じことを試し、同じ結果を得ました)
誰もが/etc/passwd
を読み取って/var/tmp
に書き込むことができる必要があります。したがって、これらは問題ではありません。
Kspliceなどを使用して実際に更新をインストールしている場合は、カーネルバージョンも実際には問題ではありません。
アウトバウンドネットワーク接続を確立する場合、一部のWebサイトはそのような接続を確立する必要がないため、これを制限できます。ただし、そうすることもあります。たとえば、ほとんどのWebサイトはデータベースに接続する必要があります。これは、次のようなSELinuxブール値で管理できます。
# semanage boolean -l | grep httpd_can_network
httpd_can_network_relay (off , off) Allow httpd to can network relay
httpd_can_network_connect_db (off , off) Allow httpd to can network connect db
httpd_can_network_connect (off , off) Allow httpd to can network connect
httpd_can_network_memcache (off , off) Allow httpd to can network memcache
httpd_can_network_connect_cobbler (off , off) Allow httpd to can network connect cobbler
httpd_can_network_connect
を設定すると、どこへでもすべてのアウトバウンドネットワーク接続が可能になります。その他はより制限が厳しく、特定の各サービスへの接続のみを許可します。
また、nginxとphp-fpmを使用している場合、そのphpはCentOS6.6と7までSELinuxによって制限されないことを覚えておいてください。
Phpでブロックシステムコマンドが必要ですか? phpディレクティブを確認してください
disable_functions =
この?
私の観点からは、/etc/passwd
はシステムのすべてのユーザーから読み取れる必要があります。
PHPスクリプトはApacheユーザーで実行されるため、通常、スクリプトは/etc/passwd
を読み取ることができます。
Apache仮想ホストでは"php_admin_value open_basedir /var/www/example.com"
を使用します。upload_tmp_dir
とsession.save_path
に対して同じことができます。