Mejores Prácticas de Permisos
Patrones de mínimo privilegio para roles de PostgreSQL, concesiones y RLS en aplicaciones de producción.
Cómo Usar Esta Lista
- Implementa A, B y C antes del primer despliegue en producción.
- Trata D y E como elementos de lista de verificación de auditoría de seguridad trimestralmente.
- Empareja con revisiones de migraciones: las concesiones son cambios de esquema.
A - Diseño de Roles
- La aplicación se conecta como un rol de inicio de sesión que no es propietario.
app_apinunca posee tablas. - Las migraciones usan un rol
app_migratorseparado. Los derechos DDL no viven en el pool de tiempo de ejecución. - Los roles de grupo (NOLOGIN) modelan niveles de permiso.
app_readers,app_writers, evita inicios de sesión por desarrollador en producción. - Cero uso de superusuario por parte de la aplicación. Solo para casos de emergencia con MFA y registro.
- Revoca derechos peligrosos a PUBLIC en clústeres endurecidos. Especialmente
CREATEen el esquemapublic.
B - Concesiones y Valores Predeterminados
- Concede
USAGEdel esquema antes de los privilegios de tabla. El error de permiso más común. - Concede secuencias con tablas para rutas
INSERT.USAGE, SELECTen secuencias. - Configura
ALTER DEFAULT PRIVILEGESpara el propietario de la migración. Las nuevas tablas se conceden automáticamente a los roles de la aplicación. - Concesiones a nivel de columna para campos sensibles. SSN, tokens, PII no en
SELECTde analista. - Documenta excepciones en comentarios SQL de migración. Los revisores futuros necesitan el porqué.
C - Seguridad a Nivel de Fila (RLS)
- Habilita RLS en todas las tablas con ámbito de inquilino en el esquema compartido. No solo en la tabla de entidad principal.
- Usa
FORCE ROW LEVEL SECURITYen tablas multinquilino. Cierra la elusión del propietario de la tabla. - Establece el GUC del inquilino con
SET LOCALpor transacción. Contexto de inquilino seguro para el pool. - Refleja
USINGyWITH CHECKpara políticas de escritura. Previene inserciones entre inquilinos. - Indexa las columnas referenciadas en las expresiones de política.
tenant_ida la izquierda en los compuestos.
D - Elusión y Auditoría
- Inventaría roles con
BYPASSRLSo superusuario. Revisión trimestral de acceso. - Minimiza los roles de emergencia con contraseñas TTL. Registra en SIEM.
- No guardes superusuario en herramientas GUI. Los perfiles de pgAdmin/DBeaver usan
app_ro. - Prueba RLS con fixtures automatizados por inquilino. CI detecta regresiones de políticas.
- Las exportaciones de
pg_dumprespetan la clasificación de datos. Los volcados de superusuario eluden RLS.
E - Operaciones
-
REASSIGN OWNEDal desmantelar roles. Sin propiedad de objetos huérfanos. - Límites de conexión por rol de aplicación. Contiene el radio de explosión de la mala configuración del pool.
-
statement_timeoutyidle_in_transaction_session_timeoutpor rol. Protege contra bloqueos humanos y de errores. -
search_pathestablecido en roles de aplicación.app, publicno solo$user, public. - SCRAM-SHA-256 para roles de contraseña. Rota en eventos de baja de personal.
Preguntas Frecuentes
¿Rol propietario para migraciones?
app_owner NOLOGIN; el migrador SET ROLE app_owner o lo hereda. El tiempo de ejecución nunca se conecta como propietario.
¿RLS sin concesiones?
Ambos son necesarios: las concesiones permiten el acceso a la tabla; RLS filtra las filas dentro de ese acceso.
Relacionado
- Conceptos Básicos de Roles - roles de inicio de sesión vs. roles de grupo
- Privilegios Predeterminados - concesiones de objetos futuras
- Reglas de Seguridad - lista de políticas
Versiones de la Pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.