pg_dump não vai rodar pelo PHP

0

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

Meu problema é que eu corro o seguinte script do terminal, a instrução pg_dump 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 relata o erro de autenticação.

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

    
por itsols 14.10.2014 / 14:50

1 resposta

0

Você pode testar sua teoria ( www-data não pode executar o comando) executando:

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

Esse provável é o problema e há diversas soluções diferentes com ramificações de segurança diferentes.

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

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

  • Bata o Postgres em permitir que www-data acesse os dados. Sugiro fazer isso por meio de uma senha, mas isso ainda permitirá um acesso www-data hackeado a qualquer coisa que você der a ele.

O comando pg_dump também pode ter algumas peculiaridades. Existem alguns tópicos em torno do SE que podem ajudá-lo especificamente:

por Oli 14.10.2014 / 15:11