¿Cómo ejecutar parte de un script con privilegios reducidos?

7

Tengo el siguiente problema: en cada máquina que ejecuta Postgresql hay un usuario especial postgres . Este usuario tiene acceso administrativo al servidor de la base de datos.

Ahora quiero escribir un script Bash que ejecute un comando de base de datos con psql como postgres de usuario (psql se ejecutará como postgres de usuario , no el script). Hasta ahora, eso no sería un problema: podría ejecutar el script como usuario postgres .

Sin embargo, quiero escribir la salida de psql en un archivo en un directorio donde postgres no tiene acceso de escritura.

¿Cómo puedo hacer eso?

Sin embargo, pensé en cambiar los EUID en el script mismo:

  1. No pude encontrar una manera de cambiar el EUID en un script Bash
  2. ¿Cómo puedo cambiar el EUID cuando uso algo como
    psql -U postgres -c "<command>" > file?
Christoph Wurm
fuente
¿cómo puedo cambiar el usuario postgres contraseña en subnivel (su -c 'psql -U postgres -c "ALTER forip USUARIO CONTRASEÑA \ 'contraseña \';"' postgres)
Fndiaz

Respuestas:

5

Use una subshell: (su -c 'psql -U postgres -c "<command>"' postgres) > file

Dentro de la subshell puede soltar permisos para hacer su trabajo, pero la salida se redirige a su shell original que todavía tiene sus permisos originales.

Kowh
fuente
5

Es posible que desee utilizar este truco:

{ anycommand } | su -c 'tee file' user

tee(1) es la utilidad POSIX, por lo que puede confiar en su disponibilidad.


O con sudo:

{ anycommand } | sudo -u user 'tee file'
ulidtko
fuente
Gracias por tu idea. Sin embargo, me encuentro con dos problemas: su no tiene una opción -u, al menos en mi máquina. Ejecutarlo correctamente (su -c command user) conduce a otro problema, a saber, que su debe ejecutarse desde un terminal. Probablemente no funcionaría de todos modos ya que su abre una nueva subshell con ese comando.
@Legate ¿tienes sudo en tu sistema?
ulidtko
@ulidtko: Sí, lo hago.
1
a continuación, sólo tiene que utilizar sudo -u postgres psql -c '...' > filey editar sudoers a solicitudes de contraseña de bloqueo para este comando
gelraen
1

Puede ejecutar el script de shell con un usuario que tenga un mejor permiso de escritura (como root), y cuando envíe los datos debe escribir en una carpeta en la que el usuario de la base de datos postgres pueda escribir (como / tmp)

una vez finalizada la escritura de datos, muévala al directorio que su script de shell tiene permiso para escribir (como el usuario raíz puede escribir en cualquier lugar)

ajreal
fuente
0

Si se le ocurren formas complicadas de eludir las restricciones de seguridad, es mejor que se pregunte si su objetivo es realmente sabio. No sé nada sobre postgresql: ¿realmente necesita iniciar sesión con la cuenta de administrador para hacer lo que está tratando de hacer, o hay alguna forma de otorgar permisos de solo lectura para lo que sea para una cuenta de usuario normal?

Michael Kopinsky
fuente
Gracias por su respuesta. Sin embargo, no hay ningún problema en ejecutar el script como root, por lo tanto, no se eluden las restricciones de seguridad.
0

¿Por qué no lo haces así sudo su postgres -c "psql ..." >/path/to/file?

alex
fuente
Gracias por tu respuesta. Sin embargo, una prueba rápida con sudo su postgres -c "echo test"revela que dicho comando no imprime nada. Cambiar a root con sudo -sy luego ejecutar su postgres -c "echo test"prueba de impresión , por lo que parece sudoque de alguna manera se come la salida. No tengo ni idea de por qué, sin embargo, yo creo que sudoy su -csubniveles de uso cuya salida estándar no es arrastrado a través de mi propia concha.
Christoph Wurm
Debes perderte algo. sudo su postgres -c "echo \$USER"Impresiones postgresen mi caja.
alex
Bueno, funciona en mi computadora portátil Ubuntu, pero no en el servidor Debian donde se debe ejecutar el script.
Christoph Wurm