it-swarm-ja.com

phpセッションフォルダの所有者は変わり続けます

問題

数週間ごとに、nginxを使用しているにもかかわらず、マシンのphpセッションフォルダーが所有者Apacheに変更されます。これにより、PHPアプリケーション、たとえばphpMyAdminがsession_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)-エラーで中断されます。

手動でSudo chown -R nginx /var/lib/php/session/を発行することで修正できます

環境

  • CentOS Linuxリリース7.4.1708を搭載した仮想マシン、自動セキュリティ更新プログラムのインストールが有効になっているyum-cron
  • EPEL-リポジトリがインストールされています
  • nginxバージョン:nginx/1.14.0
  • phpバージョン:7.0.29(PHP-FPM)

さらなる詳細

  • これは数週間ごとに壊れているようですが、このPMAを日常的に使用していないため、正確な時期はわかりません。しかし、今週は壊れました。/var/log/yum.logで、nginxが今週更新されたことがわかります:Apr 18 04:35:53 Aktualisiert: nginx.x86_64 1:1.14.0-1.el7_4.ngx
  • /etc/php.iniにユーザーApacheについての言及が見つかりません。
  • 壊れている間、フォルダのアクセス許可は次のとおりです。drwxrwx---. 2 root Apache 94 28. Mär 07:49 session

質問

(自動)nginx-updatesがphpセッションフォルダーの所有者を変更し、アプリケーションが破損するのはなぜですか?

3
Patrick R.

この問題に取り組むにはいくつかの方法があります

パッケージ検索

パッケージが何らかの変更を引き起こしている疑いがある場合は、パッケージを調べて、問題のファイルを所有していないかどうかを確認します。 RPMには、特定のパッケージが権限を持つファイルの詳細を示す%filesセクションが含まれています。これは、rpm -qlで照会できます。たとえば、/etc/passwdを所有しているパッケージ(存在する場合)を見つけるブルートフォースは、次のようになります。

$ rpm -qa | while read p; do rpm -ql $p | grep -q /etc/passwd && echo $p; done
setup-2.8.71-9.el7.noarch

ただし、このメソッドは、パッケージによって間接的に変更されたファイルを検出しません。 RPMには、任意のアクションを実行できる(または、検索対象の変更を実行するコードの他の任意のビットを呼び出す)ことができるスクリプトが含まれています。これらのスクリプトはrpm -q --scriptsでリストしてから、そのコードを検査できます。調べるコードがたくさんある可能性があるため、検索を最近インストールされたパッケージのみに制限すると役立つ場合があります(これらが含まれているログを確認してください)。

カーネルのデバッグ

Linuxカーネルは、特定のファイルに何かが触れたかどうかを通知するように指示できる、さまざまなカーネルベースのデバッグ機能を提供します。この方法では、SystemTapsysdigなどの設定に適したコードを使用し、それを待って、どのプロセスがファイルを変更したかを通知します。たとえば、sysdigを使用して、関心のあるディレクトリを変更している場合:

# sysdig "fd.directory contains /var/lib/php"

そのディレクトリに関連するシステムコールの詳細(-pフラグで構成可能)を表示する必要があります。このコマンドは、問題のあるコードが見つかるまで自動的に開始されるように、どこかで、おそらくtmuxセッションで、またはカスタムサービスとして実行したままにする必要があります。 (また、検索が広すぎてコマンドが長時間実行されたままになっていると、カーネルデバッグによって大量の情報が生成される可能性があるため、デバッグ出力を制限する必要がある場合があります。)

2
thrig