PostgreSQL 10: Usuario Solo-Lectura(Read-Only).

El otro dia me solicito una programadora si se podia crear un usuario en PostgreSQL que solo pudiera ejecutar “SELECT” tipo Solo-Lectura.

Como sabran cada manejador de BD tiene su manera de controlar los accesos a las bases de datos, era una solicitud algo peculiar pero como dicen por ahi…todo tiene un porque y ella tenia sus motivos.

Ahora esto que voy hacer lo hare sobre un PostgreSQL version 10 corriendo bajo Ubuntu 18, sin embargo tambien aplica a la misma version corriendo bajo Ubuntu 20.04, todas las versiones que yo uso son las LTS version servidor.

Los permisos van a ir sobre una base de datos en especifico no sobre todas las bases de datos, recuerden solo abrir lo que se necesita.

Este es el usuario que vamos a crear y su clave de acceso:

Nombre: usuario1

Clave de acceso: T#m$2G7v

Base de Datos: purchase

Figura 1. Listado de bases de Datos.

Aqui van los comandos los cuales se ejecutaran ya dentro de la consola de administración de PostgreSQL como lo muestra la figura 1.

1; Creamos el usuario.

postgres=# CREATE USER usuario1;
CREATE ROLE

2; Le asignamos clave a el usuario ya que nos vamos a conectar remotamente con pgAdmin.

postgres=# ALTER USER usuario1 with PASSWORD 'T#m$2G7v';
 ALTER ROLE

3; Le damos acceso a el SCHEMA public.

postgres=# GRANT USAGE ON SCHEMA public TO usuario1;
 GRANT

4; Le asignamos el acceso de conexión a la base de datos deseada.

postgres=# GRANT CONNECT ON DATABASE "purchase" TO usuario1;
 GRANT

5; Nos conectamos a la base de datos deseada.

postgres=# \c purchase;
 You are now connected to database "purchase" as user "postgres".

6; Revisamos que privilegios tiene este usuario.

purchase=# select * from information_schema.role_table_grants where grantee='usuario1';
  grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy
 ---------+---------+---------------+--------------+------------+----------------+-------------
 (0 rows)

Como podemos observar, no tiene ningun privilegio sobre la base de datos.

7; Asignacion del privilegio “SELECT” para la base de datos en cuestión.

purchase=# GRANT SELECT on ALL TABLES IN SCHEMA public TO usuario1;
 GRANT

8; Repetimos el paso 6 para ver si ya tiene privilegios asignados de nuevo.

Figura 2.

Como pueden ver ya muestra el privilegio “SELECT” para todas las tablas de la base de datos ‘purchase’, no muestra todo por que son mas de 400+, solo una parte.

9; Salimos de la consola de PSQL y nos regresamos a consola de root.

\q
exit

Ahora debemos llevar a cabo el cambio en la configuración de PostgreSQL para que el usuario ‘usuario1’ pueda conectarse remotamente con su contraseña, para estos debemos editar el archivo ‘pg_hba.conf’ de PostgreSQL.

Los programadores trabajan tanto dentro de la red como por VPN:

LAN 192.168.2.0/24

VPN 10.0.99.0/24

10; Agregando Permisos de acceso a usuario1 en PostgreSQL.

Ahora si abrimos el archivo ‘pg_hba.conf’ con nuestro editor favorito y agregamos nuestros accesos a el ‘usuario1’ y la base de datos ‘purchase’ atraves de las 2 redes mencionadas.

vim /etc/postgresql/10/main/pg_hba.conf
Figura 3.

Las ultimas 2 lineas se agregaron.

Reiniciamos el servicio para que tome los cambios.

systemctl restart postgresql

11; Acceso remoto atraves de pgAdmin.

11.1 Creamos servidor.

Figura 4.

11.2 Agregamos los parametros de la conexión y datos del usuario deseado.

Figura 5.

Si todo en orden, no les deba arrojar ningun error, de lo contrario revisar mensaje a ver si no se equivocaron en la clave, datos del servidor, error de tecla, nombre de la base de datos, etc. En mi caso nada erroneo y me regresa a la pantalla inicial de pgAdmin.

Figura 6.

No se asusten cuando expandan la lista, si intentan acceder a otras bases de datos les arrojara algo similiar a esta pantalla.

Figura 7.

11.3 Expandimos nuestra base de datos hasta dar con las tablas.

Figura 8.

Nos marca 437 tablas.

12; Prueba de query ‘SELECT’ en tabla ‘account_account’.

En el menu nos vamos a tools -> Query Tool.

Figura 9.

Ejecutamos un query ‘SELECT *..”.

Figura 10.

Perfecto el “SELECT” funciono, tenemos resultados.

Ahora tratemos de crear un UPDATE, no debe funcionar…

Figura 11.

Perfecto, no dejo ejecutar UPDATE ya que el usuario no tiene ese privilegio sobre esta base de datos y mucho menos acceso a las demas bases de datos.

Que nos dice los logs de postgresql?

Figura 12.

13; Fin.

Resumen.

Lo solicitado por la programadora quedo resuelto, probamos el ABC y no permitio agregar, modificar ni actualizar ninguna tabla de la base de datos.

Podemos decir nuestro usuario Solo-Lectura esta funcionando.

Si alguien por ahi tenia este pendiente espero les funcione y sigamos aprendiendo PostgreSQL, nos vemos pronto!!!

3 thoughts on “PostgreSQL 10: Usuario Solo-Lectura(Read-Only).

  1. Hola, seguí tus pasos y funcionó todo perfecto hasta que probé un create y un drop y funcionó. Entonces pensé, bueno, le quito todos los privilegios y le asigno solo el de SELECT pero ejecuté un REVOKE ALL PRIVILEGIES para ese usuario y nada. ¿Cómo se puede revocar esos permisos?

    Like

  2. No hace falta hacer un restart de la base de datos. Solo un reload. En ambientes productivos un restart es sacar a todos afuera de la base ademas del costo que esto genera.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s