PHP は SELinux で「権限が拒否されました」というエラーが発生し、PostgreSQL に接続できません

PHP は SELinux で「権限が拒否されました」というエラーが発生し、PostgreSQL に接続できません

私の PHP アプリは、SELinux をオフにすると接続できますが、オンにすると接続できません。

setenforce 0; curl -I http://domain.com; setenforce 1

ではエラーは発生しません/var/log/httpd/error_log。ただし、オンにすると、次のエラーが発生します。

PHP 警告: pg_connect(): PostgreSQL サーバーに接続できません: サーバーに接続できませんでした: 権限が拒否されました。サーバーはローカルで実行されており、Unix ドメイン ソケット "/tmp/.s.PGSQL.5432" で接続を受け入れていますか?

私はもう試した

# restorecon -R -v /home/domain/public_html
#  chcon -R -t httpd_sys_rw_content_t /home/domain/public_html/
#  chcon -v --type=httpd_sys_content_t /home/domain/public_html
# semanage fcontext -a -t httpd_sys_content_t "/home/domain/public_html(/.*)?"
# service httpd restart

SELinux がオンの場合でも、次の操作を実行できます。

# php -a
Interactive shell

php > $connection = pg_connect ("dbname=domain user=domain password=xxxxxx") or die(pg_last_error());
php > echo $connection;
Resource id #1

以下からのエラーです/var/log/audit/audit.log:

type=AVC msg=audit(1404684735.513:97245): avc:  denied  { write } for  pid=3594 comm="httpd" name=".s.PGSQL.5432" dev=xvde ino=2552 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1404684735.513:97245): arch=c000003e syscall=42 success=no exit=-13 a0=b a1=7f40ae4fd640 a2=6e a3=0 items=0 ppid=26231 pid=3594 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=2700 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

6.5 の

答え1

次の方法で httpd が DB 接続できるようにする SELinux ポリシー ブール値を単純に設定してみましたか:

setsebool -P httpd_can_network_connect_db 1

これは私の場合はうまくいきました。設定が正しいかどうかは、次の方法で確認できます。

getsebool httpd_can_network_connect_db

'... => on' を返すはずです

その後、tail -f /var/log/audit/audit.log を実行して操作を再試行すると、操作が成功するはずです。

答え2

さらに詳しい情報が必要です:

avc 拒否については、/var/log/audit/audit.log を確認する必要があります。

または、以下がインストールされていることを確認してください

  1. トラブルシューティングサーバの設定
  2. 監査された
  3. メッセージバス

メッセージは/var/log/messagesに表示されます。

さらに詳しい情報:http://danwalsh.livejournal.com/7995.html

PHP インタラクティブ シェルが機能する理由は、アプリケーションが Apache コンテキストで実行されているのに対し、PHP インタラクティブ シェルはユーザー コンテキストで実行されているためです。

答え3

修正しました! ここで解決策を見つけました:https://bugzilla.redhat.com/show_bug.cgi?id=772084#c8

私がやったことは、audit.log に書き込まれた 2 行を取得し、それらを にパイプしてaudit2allow、バイナリとテキストの 2 つのファイルを生成することでした。次に、そのファイルを にインポートしましたsemodule。ただし、そのファイルは理解できません。httpd エラーを必ずキャプチャしてください。

tail -2 /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp # takes a while

実際に生成されたテキストファイルはmypol.te

module mypol 1.0;

require {
        type httpd_t;
        type initrc_t;
        class unix_stream_socket connectto;
}

#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;

関連情報