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_dump
instruçã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-data
enquanto 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-data
nã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-data
o acesso aos dados. Eu sugeriria fazer isso por meio de uma senha, mas isso ainda permitirá umwww-data
acesso hackeado a qualquer coisa que você fornecer.
O pg_dump
comando também pode ter algumas peculiaridades. Existem alguns tópicos em torno do SE que podem ajudar especificamente: