id: 2749608
title: "Cómo crear un usuario de solo lectura en PostgreSQL (con acceso a estadísticas)"
published: true
tags: ["postgres", "security", "database", "devops"]
series: Lo Arreglé y No Sé Cómo
description: "Guía práctica para configurar un usuario con permisos limitados en PostgreSQL, permitiéndole consultar datos y estadísticas sin comprometer la seguridad."
canonical_url: "https://dev.to/ivajofranc/como-crear-un-usuario-de-solo-lectura-en-postgresql-con-acceso-a-estadisticas-3kkf"
cover_image: "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd117i3lx8tkd8wxnqqy9.png"
Cómo crear un usuario de solo lectura en PostgreSQL (con acceso a estadísticas)
🇬🇧 Also read this post in English
📝 Informe de Pruebas: Acceso de Usuario Solo Lectura en PostgreSQL
📋 Contexto de la Prueba
Se ha creado un usuario con permisos de solo lectura sobre la base de datos test en PostgreSQL. El objetivo era:
- Permitir al usuario consultar todas las tablas (excepto las sensibles).
- Evitar que el usuario tenga permisos administrativos.
- Permitir al usuario monitorizar procesos activos (equivalente a SHOW PROCESSLISTen MySQL).
El usuario de prueba fue: test_ro_user.
⚙️ Sentencias de Creación de Usuario y Permisos
-- Crear el usuario de solo lectura con restricciones explícitas
CREATE USER test_ro_user
    LOGIN
    PASSWORD 'LecTur@_2025!'
    NOSUPERUSER
    NOCREATEDB
    NOCREATEROLE
    NOINHERIT;
-- Conceder acceso a la base de datos
GRANT CONNECT ON DATABASE test TO test_ro_user;
-- Conceder uso del esquema público
GRANT USAGE ON SCHEMA public TO test_ro_user;
-- Conceder acceso de solo lectura a todas las tablas actuales
GRANT SELECT ON ALL TABLES IN SCHEMA public TO test_ro_user;
-- Conceder acceso automático de solo lectura a futuras tablas
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO test_ro_user;
-- Revocar acceso explícitamente a la tabla "configuracion"
REVOKE ALL ON TABLE public.configuracion FROM test_ro_user;
-- Permitir acceso completo a las vistas de estadísticas del sistema
GRANT pg_read_all_stats TO test_ro_user;
⚙️ Acciones Realizadas
1. Creación del Usuario con Restricciones
Se ejecutó el script anterior.
Resultado: ✅ Correcto
- El usuario fue creado con las restricciones deseadas.
- No tiene acceso de escritura a ninguna tabla.
- La tabla configuracionno es accesible por este usuario (consultas sobre esta tabla son denegadas).
  
  
  2. Consulta a pg_stat_activity (Estado de procesos)
Consultas ejecutadas:
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_activity WHERE state != 'idle';
Resultado: ⚠️ Parcialmente Correcto
- El usuario pudo acceder a la vista pg_stat_activity.
- En la columna queryaparecía<insufficient privilege>en la mayoría de registros.
3. Consulta a Estadísticas de Tablas del Usuario
Consulta ejecutada:
SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables;
Resultado: ✅ Correcto
- El usuario obtuvo correctamente las estadísticas de uso de todas las tablas accesibles.
- La tabla configuracionno se mostró (como esperado).
  
  
  4. Corrección de Visibilidad en pg_stat_activity
Se otorgó el rol:
GRANT pg_read_all_stats TO test_ro_user;
Resultado: ✅ Correcto
- El usuario pudo ver el contenido completo de la columna queryenpg_stat_activity.
- No se concedieron permisos adicionales más allá de la visibilidad de estadísticas.
🟢 Estado Final
| Prueba | Resultado | 
|---|---|
| Creación de usuario con solo lectura | ✅ Correcto | 
| Acceso a tablas (excepto las restringidas) | ✅ Correcto | 
| Visibilidad en pg_stat_activityinicial | ⚠️ Parcial | 
| Corrección visibilidad con pg_read_all_stats | ✅ Correcto | 
| Acceso a estadísticas de uso de tablas | ✅ Correcto | 
📝 Recomendaciones Finales
- Mantener el usuario sin permisos de escritura ni roles administrativos.
- Documentar el uso de pg_read_all_statspara perfiles de solo lectura avanzados.
- Replicar la configuración si se crean nuevos esquemas.
- Considerar auditorías si se desea monitorizar qué procesos visualiza este usuario.
 
 
              
 
    
Top comments (0)