web-dev-qa-db-ja.com

SELinuxはApache / PHPアクセスを制限します

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で同じことを試し、同じ結果を得ました)

3
jbrsn

誰もが/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によって制限されないことを覚えておいてください。

1
Michael Hampton

Phpでブロックシステムコマンドが必要ですか? phpディレクティブを確認してください

disable_functions =

この?

0
AntonMZ

私の観点からは、/etc/passwdはシステムのすべてのユーザーから読み取れる必要があります。

PHPスクリプトはApacheユーザーで実行されるため、通常、スクリプトは/etc/passwdを読み取ることができます。

Apache仮想ホストでは"php_admin_value open_basedir /var/www/example.com"を使用します。upload_tmp_dirsession.save_pathに対して同じことができます。

0
c4f4t0r