¿Cómo puedo crear usuarios de solo lectura para copias de seguridad en PostgreSQL?


15

¿Es cierto que es IMPOSIBLE crear un usuario de respaldo de solo lectura en PostgreSQL?

Me han informado en un canal IRC que simplemente no puede tener un usuario de respaldo solo sin privilegios de propiedad. Me resulta muy extraño, así que quiero asegurarme de que no me estoy perdiendo algo.

A continuación se muestra lo que probé pero no me da los resultados que estoy buscando. Cuando lo hago pg_dumpen una mesa determinada obtengo Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Cualquier ayuda sería muy apreciada!


Respuestas:


9

No, es fácil (ahora de todos modos).

  1. Conceder el permiso de conexión a un nuevo usuario

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Conceder los permisos en todos los objetos de la base de datos actual . Esto es específico del esquema, y ​​tendrá que ejecutar una copia para cada esquema que desee que use su usuario,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    De los documentos , ALL TABLESincluye todo lo que quieras.

    También hay una opción para otorgar privilegios en todos los objetos del mismo tipo dentro de uno o más esquemas. Actualmente, esta funcionalidad solo se admite para tablas, secuencias y funciones (pero tenga en cuenta que se considera que TODAS LAS TABLAS incluyen vistas y tablas externas.

  3. Luego, ALTER DEFAULT PRIVLEGESotorgar privilegios futuros SELECT para objetos que aún no se han creado.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;

Me di cuenta de que cuando se ejecuta ALTER DEFAULT PRIVILEGES ... myReadonlyUser, se añaden 2 líneas adicionales al vertedero: ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Parece que esto significará que root no podrá hacer nada en nuevas tablas. ¿Es esto cierto?
dthor

Además, si sus tablas usan bigintsu usuario de solo lectura, probablemente también necesitaráGRANT SELECT ON ALL SEQUENCES
dthor

6

La manera simple y agradable es crear un superusuario con permiso de solo lectura.

  • Inicie sesión psqlcomo postgres u otro superusuario.
  • Cree la nueva función de superusuario y configúrela como de solo lectura:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Reemplace <PASS>por la contraseña elegida.
    • Puede reemplazar backadmpor el nombre de usuario elegido. (Lo puse backadmpara Backup Administrator).
    • NO olvide las comillas simples para la contraseña.

Ahora puede usar esta función para hacer una copia de seguridad.


66
Ewww. ¿Un superusuario para respaldar? Pidió específicamente solo lectura. Ese usuario es uno SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEo está ALTER USER backadm set default_transaction_read_only = off;lejos de tener acceso sin restricciones a la base de datos.
Evan Carroll

Este usuario aún podrá soltar tablas / esquemas / bases de datos independientemente de que las transacciones sean de solo lectura.
Igor Mukhin

4

Tenga en cuenta que el blog al que se hace referencia en la respuesta dada por @Gyre no funcionará para crear un usuario de "aplicación" de solo lectura (es decir, para crear un rol de solo lectura para que una aplicación web se conecte a la base de datos), y podría abrir un serio vulnerabilidad de seguridad, ya que es fácilmente evitable, como se explica en esta respuesta de la lista postgresql . Como referencia, el cliente anula la configuración de la sesión:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Consulte la presentación 'Administración de derechos en postgresql' vinculada en la wiki de postgres para obtener un método más detallado, similar al publicado en la pregunta.


Esto no es realmente una respuesta, es una crítica a las otras respuestas por ser inseguro que he copiado como comentario. He respondido esta pregunta correctamente ahora.
Evan Carroll

3

Después de probar con la solución de Evan Caroll, me encontré con este error:

ERROR: permiso denegado para la relación 'tabla'

falta otro permiso:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

Agregar este permiso me permitió hacer una copia de seguridad con mi usuario de solo lectura.


2

He hecho una investigación adecuada y parece haber una solución para esto. Me he encontrado con esta publicación de blog que explica perfectamente lo que hay que hacer. Espero que esto ayude a las personas que buscan la misma respuesta que yo. Obviamente, la restauración de las copias de seguridad realizadas de esta manera es una pregunta diferente.


En lugar de simplemente vincularse a la publicación del blog, debe agregar algunos detalles a su respuesta en caso de que la publicación del blog sufra de rotura de enlaces (ver en.wikipedia.org/wiki/Link_rot )
Max Vernon

La idea básica del blog es ALTER USER set default_transaction_read_only = on;, que no impide que el usuario la cambie.
azulado

Ewww. ¿Un superusuario para respaldar? Pidió específicamente solo lectura. Ese usuario es un SET SET CHARACTERISTICS AS TRANSACTION READ WRITE o ALTER USER backadm set default_transaction_read_only = off; lejos de tener acceso sin restricciones a la base de datos.
Evan Carroll
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.