Reglas de Seguridad
Las reglas de seguridad de PostgreSQL aplican privilegio mínimo, aislamiento de inquilinos y acceso humano auditable. Las aplicaciones no deben heredar poderes de DBA por defecto.
Receta
-- Modelo de rol mínimo para producción
CREATE ROLE app_owner NOLOGIN;
CREATE ROLE app_api LOGIN PASSWORD 'vault' CONNECTION LIMIT 100;
CREATE ROLE app_migrator LOGIN PASSWORD 'vault';
GRANT app_readers TO app_api; -- o app_writers por servicio
-- NO SUPERUSER, NO BYPASSRLS en app_api
ALTER TABLE app.orders ENABLE ROW LEVEL SECURITY;
ALTER TABLE app.orders FORCE ROW LEVEL SECURITY;Cuándo usar esto: Revisión de seguridad, mapeo de controles SOC2, lista de verificación de incorporación para nuevos servicios.
Ejemplo de Trabajo
# Extracto de pg_hba.conf
hostssl myapp app_api 10.10.1.0/24 scram-sha-256
hostssl myapp app_ro 10.10.2.0/24 scram-sha-256
host all all 0.0.0.0/0 rejectCREATE POLICY orders_tenant ON app.orders FOR ALL TO app_api
USING (tenant_id = current_setting('app.tenant_id')::bigint)
WITH CHECK (tenant_id = current_setting('app.tenant_id')::bigint);
REVOKE ALL ON SCHEMA public FROM PUBLIC;
GRANT USAGE ON SCHEMA app TO app_api;Resumen de reglas de seguridad:
| # | Regla |
|---|---|
| 1 | No superusuario en cadenas de conexión de aplicaciones |
| 2 | SCRAM-SHA-256 + TLS para roles remotos |
| 3 | RLS FORCE en tablas compartidas de inquilinos |
| 4 | Migrator != rol de ejecución |
| 5 | Roles de "break-glass" auditados y con TTL |
Análisis Profundo
Reglas de Conexión de Aplicaciones
- La cadena de conexión usa
app_apio un rol más específico por microservicio. - PgBouncer no sustituye la separación de privilegios; sigue usando el rol de privilegio mínimo.
search_pathfijado a esquemas conocidos; previene el secuestro de objetos enpublic.
Reglas de Acceso Humano
- Analistas:
app_roen réplica,statement_timeoutconfigurado. - DBAs: jump host + inicio de sesión individual, sin contraseña compartida de
postgres. - El recuento de
BYPASSRLSse documenta trimestralmente.
Protección de Datos
-- Nivel de columna para PII
GRANT SELECT (id, email) ON app.users TO app_ro;
REVOKE SELECT (ssn_hash) ON app.users FROM app_ro;- Cifrar copias de seguridad y restringir entornos de restauración.
pg_dumpcomo superusuario omite RLS; clasificar los archivos de volcado.
Extensión y Cadena de Suministro
- Lista de permitidos de extensiones en ADR.
- No
CREATE EXTENSIONdesde el rol de aplicación. - Fijar versiones de extensiones en SQL de migración.
Trampas Comunes
- Usuario maestro de RDS en la aplicación - La consola de la nube lo facilita. Solución: Crear roles de aplicación desde el primer día; bloquear el maestro para "break-glass".
- RLS sin FORCE - Las migraciones del propietario ven todos los inquilinos en errores de psql. Solución: FORCE en tablas de inquilinos.
- Confianza en pg_hba para VPC - La "red privada" no es autenticación. Solución: SCRAM o certificado siempre.
- CREATE en esquema público para todos - El valor predeterminado heredado permite a cualquier usuario crear objetos. Solución: Revocar en clústeres endurecidos.
- Funciones SECURITY DEFINER como puerta trasera - Escalan a derechos de propietario. Solución: Auditar funciones definer; propietario mínimo.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Certificados de cliente mTLS | Identidad de service mesh | Analistas humanos en portátiles |
| Credenciales dinámicas de Vault | Contraseñas de BD de corta duración | Aplicación CRUD interna simple |
| Base de datos por inquilino | Requisito de aislamiento estricto | Miles de inquilinos |
Preguntas Frecuentes
¿RLS es suficiente sin comprobaciones de la aplicación?
Defensa en profundidad: RLS detecta errores de la aplicación; la aplicación aún valida el inquilino para la experiencia del usuario y la auditoría.
¿Cifrar conexiones dentro de la VPC?
Sí: las amenazas internas y los marcos de cumplimiento esperan TLS incluso en la comunicación este-oeste.
¿Usuario postgres en el portátil?
Solo desarrollo local con autenticación peer de socket local; nunca credenciales de producción en la estación de trabajo.
Relacionado
- Mejores Prácticas de Permisos - patrones de concesión
- Bypass RLS y Superusuario - auditar rutas de bypass
- pg_hba.conf y Autenticación - autenticación de red
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+.