この質問は他のさまざまな投稿でも取り上げられていますが、私には役に立たないようです。
私の問題は、ターミナルから次のスクリプトを実行すると、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 には、特にこれに関して役立つスレッドがいくつかあります。