pg_dump は PHP では実行されません

pg_dump は PHP では実行されません

この質問は他のさまざまな投稿でも取り上げられていますが、私には役に立たないようです。

私の問題は、ターミナルから次のスクリプトを実行すると、pg_dumpステートメントが機能することです。

$strBK = '/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --role "mizk" --no-password  --format plain --data-only --inserts --column-inserts --verbose --file "/home/khalid/tmp/esm/x1" --table "public.\"tblCustomerCategories\"" --table "public.\"tblSellers\"" "dbESM" 2>&1';
    //User has submitted form. Start making backup.
    echo "ok " . shell_exec($strBK);

しかし、php からは次のようなエラーが発生します。

 ok pg_dump: [archiver (db)] connection to database "dbESM" failed:
 fe_sendauth: no password supplied
 pg_dump: *** aborted because of error

示されているように、パスワードを要求していませんが、スクリプトは認証に関するエラーを報告します。

私の推測では、www-dataターミナル ダンプがコンピュータ ユーザーとして実行されている間、PHP は で実行されています。この問題を安全に修正するにはどうすればよいでしょうか?

答え1

次のコマンドを実行して、理論をテストできます (www-dataコマンドを実行できません)。

sudo -iu www-data /usr/bin/pg_dump ...

これはおそらくこの問題には、セキュリティへの影響が異なるさまざまな回避策が存在します。

  • ダンプを実行するスクリプトを作成します。スクリプトは、自分のユーザーが所有し、setuidが適用されます(chmod 4755 <filename>)。これを実行する人は誰でもこれを実行します。としてファイルの所有者。スクリプトが PHP でも編集可能であったり、スクリプトが何らかの形で悪用可能であったりする場合は、セキュリティに明らかな影響が生じます。

  • 仲介者を使う。PHPからファイルに書き込み、cronジョブ(適切なユーザーとして実行)から読み取ることができます。ファイルが存在する場合は、ダンプを実行してファイルを削除します。これはかなり安全ですが、明らかにcron間隔と同じ速さしかありません。代替案としては、次のようなものがあります。セロリこれは、タスクをバッチ処理したり、オプションで他のユーザーに延期したりするための、より工業的な機能です。

  • Postgres にwww-dataデータへのアクセスを許可させます。パスワードを使用してこれを行うことをお勧めしますが、それでも、許可www-dataしたデータへのハッキングアクセスが可能になります。

このpg_dumpコマンドには、いくつかの特殊な点があるかもしれません。SE には、特にこれに関して役立つスレッドがいくつかあります。

関連情報