pg_dump läuft nicht über PHP

pg_dump läuft nicht über PHP

Diese Frage wurde in verschiedenen anderen Beiträgen behandelt, aber sie scheinen mir nicht weiterzuhelfen.

Mein Problem besteht darin, dass ich das folgende Skript vom Terminal aus ausführe. Die pg_dumpAnweisung funktioniert:

$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);

Aber von PHP erhalte ich den folgenden Fehler:

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

Wie gezeigt, frage ich nicht nach dem Passwort, aber das Skript meldet einen Authentifizierungsfehler.

Ich gehe davon aus, dass PHP ausgeführt wird, www-datawährend der Terminal-Dump als Computerbenutzer ausgeführt wird. Wie behebe ich dieses Problem also auf sichere Weise?

Antwort1

Sie können Ihre Theorie testen ( www-datader Befehl kann nicht ausgeführt werden), indem Sie Folgendes ausführen:

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

Dies wahrscheinlichIstdas Problem und es gibt eine Reihe verschiedener Workarounds mit unterschiedlichen Auswirkungen auf die Sicherheit.

  • Erstellen Sie ein Skript, das Ihren Dump ausführt. Es gehört Ihrem Benutzer und muss mit setuid angewendet werden ( chmod 4755 <filename>). Wer es ausführt, führt es aus.alsder Eigentümer der Datei. Es gibt offensichtliche Sicherheitsauswirkungen, wenn Ihr Skript auch mit PHP bearbeitet werden kann oder Ihr Skript irgendwie ausgenutzt werden kann.

  • Verwenden Sie einen Mittelsmann. Sie könnten von PHP aus in eine Datei schreiben und sie von einem Cron-Job aus lesen (der als der richtige Benutzer ausgeführt wird). Wenn die Datei existiert, führt es Ihren Dump aus und löscht die Datei. Dies ist ziemlich sicher, aber es ist offensichtlich nur so schnell wie Ihr Cron-Intervall. Alternativen umfassen Dinge wieSellerieDies ist etwas industrieller für die Stapelverarbeitung oder Verschiebung von Aufgaben, optional an andere Benutzer.

  • Überreden Sie Postgres, www-dataden Zugriff auf die Daten zu gestatten. Ich würde vorschlagen, dies über ein Passwort zu tun, aber dies ermöglicht einem Hacker trotzdem www-dataden Zugriff auf alles, was Sie ihm geben.

Der pg_dumpBefehl kann auch einige Besonderheiten aufweisen. Es gibt einige Threads bei SE, die speziell dabei helfen könnten:

verwandte Informationen