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

Как показано, я не спрашиваю пароль, но скрипт сообщает об ошибке аутентификации.

Я предполагаю, что PHP работает под www-data в то время как дамп терминала работает как пользователь компьютера. Итак, как мне решить эту проблему безопасным способом?

1 ответ

Решение

Вы можете проверить свою теорию (www-data не могу запустить команду), запустив:

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

Это, вероятно, является проблемой, и существует ряд различных обходных путей с различными последствиями безопасности.

  • Создайте скрипт, который запускает ваш дамп, принадлежащий вашему пользователю, с применением setuid (chmod 4755 <filename>). Кто бы ни запускал это, он запустит его как владельца файла. Существуют очевидные последствия для безопасности, если ваш скрипт также редактируется с помощью PHP, или ваш скрипт каким-то образом эксплуатируется.

  • Используйте посредника. Вы можете писать в файл из PHP и читать его из задания cron (работающего от имени нужного пользователя). Если файл существует, он запускает ваш дамп и удаляет файл. Это довольно безопасно, но, очевидно, только мгновенно, как ваш интервал cron. Альтернативы включают в себя такие вещи, как Celery, который является немного более индустриальным для пакетирования или отложенных задач, опционально для других пользователей.

  • Бить Постгрес в разрешении www-data получить доступ к данным. Я бы предложил сделать это с помощью пароля, но это все еще позволит взломать www-data доступ ко всему, что вы даете.

pg_dump Команда также может иметь некоторые особенности. В SE есть несколько тем, которые могут помочь с этим конкретно:

Другие вопросы по тегам