pg_dump no se ejecutará a través de PHP

pg_dump no se ejecutará a través de PHP

Esta pregunta se ha abordado en varias otras publicaciones, pero no parecen ayudarme.

Mi problema es que ejecuto el siguiente script desde la terminal, la pg_dumpdeclaración 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);

Pero desde php me sale el siguiente error:

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

Como se muestra, no solicito la contraseña, pero el script informa el error sobre la autenticación.

Mi suposición es que PHP se ejecuta www-datamientras el volcado del terminal se ejecuta como usuario de la computadora. Entonces, ¿cómo soluciono este problema de forma segura?

Respuesta1

Puede probar su teoría ( www-datano puede ejecutar el comando) ejecutando:

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

esto probablementeesEl problema y existen varias soluciones diferentes con diferentes ramificaciones de seguridad.

  • Cree un script que ejecute su volcado, propiedad de su usuario, con setuid aplicado ( chmod 4755 <filename>). Quien ejecute esto lo ejecutarácomoel propietario del archivo. Hay ramificaciones de seguridad obvias si su script también es editable por PHP, o si su script es de alguna manera explotable.

  • Utilice un intermediario. Puede escribir en un archivo desde PHP y leerlo desde un trabajo cron (ejecutándose como el usuario correcto). Si el archivo existe, ejecuta su volcado y elimina el archivo. Esto es bastante seguro, pero obviamente es tan instantáneo como su intervalo cron. Las alternativas incluyen cosas comoApioque es un poco más industrial para agrupar o diferir tareas, opcionalmente a otros usuarios.

  • Vence a Postgres para permitir www-datael acceso a los datos. Sugeriría hacer esto a través de una contraseña, pero esto aún permitirá un www-dataacceso pirateado a cualquier cosa que le proporcione.

El pg_dumpmando también puede tener algunas peculiaridades. Hay algunos hilos sobre SE que podrían ayudar específicamente:

información relacionada