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_dump
Anweisung 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-data
wä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-data
der 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-data
den Zugriff auf die Daten zu gestatten. Ich würde vorschlagen, dies über ein Passwort zu tun, aber dies ermöglicht einem Hacker trotzdemwww-data
den Zugriff auf alles, was Sie ihm geben.
Der pg_dump
Befehl kann auch einige Besonderheiten aufweisen. Es gibt einige Threads bei SE, die speziell dabei helfen könnten: