pg_dump não rodará através de PHP

pg_dump não rodará através de PHP

Esta questão foi abordada em vários outros posts, mas eles não parecem me ajudar.

Meu problema é que executo o seguinte script no terminal, a pg_dumpinstrução funciona:

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

Mas do php, recebo o seguinte erro:

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

Como é mostrado, não estou pedindo a senha, mas o script reporta o erro de autenticação.

Minha suposição é que o PHP é executado www-dataenquanto o dump do terminal é executado como usuário do computador. Então, como posso corrigir esse problema de maneira segura?

Responder1

Você pode testar sua teoria ( www-datanão é possível executar o comando) executando:

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

Isso provavelmenteéo problema e há diversas soluções alternativas com diferentes ramificações de segurança.

  • Crie um script que execute seu dump, de propriedade do seu usuário, com setuid aplicado ( chmod 4755 <filename>). Quem quer que execute isso irá executá-locomoo proprietário do arquivo. Existem ramificações de segurança óbvias se o seu script também for editável pelo PHP ou se o seu script for de alguma forma explorável.

  • Use um intermediário. Você poderia escrever em um arquivo do PHP e lê-lo em um cron-job (executando como o usuário certo). Se o arquivo existir, ele executa o dump e exclui o arquivo. Isso é bastante seguro, mas obviamente é tão instantâneo quanto o intervalo do cron. As alternativas incluem coisas comoSalsãoque é um pouco mais industrial para agrupar ou adiar tarefas, opcionalmente para outros usuários.

  • Bata o Postgres para permitir www-datao acesso aos dados. Eu sugeriria fazer isso por meio de uma senha, mas isso ainda permitirá um www-dataacesso hackeado a qualquer coisa que você fornecer.

O pg_dumpcomando também pode ter algumas peculiaridades. Existem alguns tópicos em torno do SE que podem ajudar especificamente:

informação relacionada