Extensiones Confiables vs. No Confiables
Las extensiones marcadas como confiables pueden ser instaladas por usuarios no superusuarios con los permisos adecuados. Las extensiones no confiables ejecutan código C con privilegios de superusuario durante la instalación y exigen una revisión de seguridad antes de cualquier CREATE EXTENSION en producción.
Receta
-- Comprobar el indicador de confianza (PostgreSQL 13+)
SELECT name,
default_version,
CASE WHEN trusted THEN 'trusted' ELSE 'untrusted' END AS trust_level
FROM pg_available_extensions
WHERE name IN ('vector', 'postgis', 'plpython3u', 'pgcrypto')
ORDER BY name;
-- Otorgar instalación a un rol (solo extensiones confiables)
GRANT CREATE ON DATABASE appdb TO deploy_role;
GRANT USAGE ON SCHEMA extensions TO deploy_role;
-- En PostgreSQL 15+: también otorgar en el objeto de extensión
GRANT vector TO deploy_role; -- nombre de la extensión como objetoCuándo usar esto: Al incorporar una nueva extensión, auditar quién puede instalar qué, o al fortalecer un clúster administrado multi-inquilino.
Ejemplo de Trabajo
-- Paquete de consulta de lista de verificación de seguridad
-- 1) Todas las extensiones instaladas
SELECT e.extname,
e.extversion,
a.trusted,
pg_get_userbyid(e.extowner) AS owner,
n.nspname AS schema
FROM pg_extension e
JOIN pg_available_extensions a ON a.name = e.extname
JOIN pg_namespace n ON n.oid = e.extnamespace
ORDER BY e.extname;
-- 2) Roles que pueden crear extensiones (superuser o createrole)
SELECT rolname,
rolsuper,
rolcreaterole,
rolcreatedb
FROM pg_roles
WHERE rolsuper OR rolcreatedb
ORDER BY rolname;
-- 3) Intento de instalación de extensión no confiable (debería fallar para el rol de la aplicación)
SET ROLE app_role;
CREATE EXTENSION plpython3u; -- esperar ERROR: permission denied
RESET ROLE;Lo que esto demuestra:
- La columna
trustedenpg_available_extensionsrige la política de instalación. - El inventario se une con el propietario y el esquema para auditoría.
- Las extensiones no confiables permanecen solo para superusuarios en entornos fortalecidos.
- Las pruebas de roles validan el mínimo privilegio antes de la puesta en marcha.
Análisis Profundo
Extensiones Confiables
Las extensiones confiables son revisadas por la comunidad PostgreSQL (o el proveedor) como seguras para la instalación por no superusuarios. Aún agregan capacidades (nuevos tipos, funciones) pero están limitadas en comparación con módulos C arbitrarios.
Extensiones confiables comunes en PostgreSQL 18:
| Extensión | Superficie de riesgo | Aprobación típica |
|---|---|---|
vector | Nuevo tipo + índices | Estándar para aplicaciones RAG |
pgcrypto | Funciones criptográficas | Aprobado con aislamiento de esquema |
uuid-ossp | Generadores de UUID | Legado; preferir gen_random_uuid() |
citext | Texto insensible a mayúsculas/minúsculas | Bajo riesgo |
Extensiones No Confiables
Las extensiones no confiables pueden exponer rutas de acceso al sistema de archivos, red o ejecución de código arbitrario. Trate cada una como una decisión de cadena de suministro.
| Extensión | Por qué no confiable | Enfoque de revisión |
|---|---|---|
plpython3u | Python sin aislamiento | Inyección de código, paquetes pip |
plperlu | Perl sin restricciones | Acceso a shell |
file_fdw | Lectura de archivos del lado del servidor | Recorrido de rutas, secretos en disco |
dblink | Ejecución remota de SQL | Exposición de credenciales, movimiento lateral |
Patrones de Fortalecimiento
-- Revocar CREATE público en la base de datos
REVOKE CREATE ON DATABASE appdb FROM PUBLIC;
-- Lista blanca: solo extensiones específicas reciben GRANT
-- (ejecutar como superusuario después de la revisión de seguridad)
GRANT postgis TO dba_deploy_role;
GRANT vector TO dba_deploy_role;
-- NO otorgar plpython3uEn PostgreSQL administrado en la nube, la lista blanca del proveedor es la primera puerta de entrada. Su ADR es la segunda.
Trampas Comunes
- Asumir que la nube = seguro - Los hosts administrados ofrecen
plpython3uen algunos niveles. Solución: Deshabilitar mediante el grupo de parámetros o nunca otorgar derechos de instalación. - El indicador
trustedcambia entre versiones - Una extensión puede volverse confiable en una versión más reciente de PG. Solución: Releerpg_available_extensionsdespués de actualizaciones importantes. - Extensión en el esquema
public- Incluso las extensiones confiables amplían la superficie de ataque si las funciones son invocables porPUBLIC. Solución:REVOKE ALL ON FUNCTION ... FROM PUBLIC;y otorgar explícitamente a los roles de la aplicación. - Canales de implementación SUPERUSER - CI utiliza credenciales de superusuario "solo para extensiones". Solución:
deploy_rolededicado con permisos mínimos; superusuario solo para casos de emergencia. - Instalaciones de TI en la sombra - El desarrollador ejecuta
CREATE EXTENSIONen un clon de staging que refleja los privilegios de producción. Solución: Trabajo periódico de auditoríapg_extensioncon alertas. - Dependencias
CASCADE- Extensión no confiable extraída como dependencia. Solución: Revisar la cadenapg_dependantes de aprobar la extensión principal.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| El código de la aplicación reemplaza la extensión | El riesgo de PL/lenguaje no confiable es demasiado alto | Necesita rendimiento nativo de índices en SQL |
Esquema separado + EXECUTE restringido | Extensión aprobada pero las funciones deben ser controladas | Cada función necesita envoltorios personalizados |
| Política de no extensiones | Cumplimiento máximo de bloqueo | No puede enviar características de pgvector o PostGIS |
| ETL en contenedores fuera de Postgres | file_fdw o Python en DB tentador | Fuertes requisitos transaccionales con los datos |
Preguntas Frecuentes
¿Quién decide qué es confiable o no confiable?
Los autores de extensiones establecen el indicador en el archivo de control; los revisores principales de PostgreSQL validan las extensiones incluidas. Las extensiones de terceros pueden no ser confiables por defecto.¿Puedo marcar mi extensión como confiable?
Solo si cumple con los criterios de la comunidad y se envía con PostgreSQL o pasa la revisión. Las extensiones internas permanecen no confiables.¿Confiable significa sin vulnerabilidades?
No. Significa que el privilegio de instalación se puede delegar. Aún así, parchea versiones y monitorea CVEs.¿Qué pasa con PostGIS?
El nivel de confianza varía según el empaquetado. Trate lo geoespacial como crítico para la producción y fije las versiones independientemente del indicador de confianza.¿Cómo detecto nuevas extensiones?
Compare instantáneas de `pg_extension` diariamente o use disparadores de eventos en `ddl_command_end` para `CREATE EXTENSION`.¿Son las extensiones en slots de replicación arriesgadas?
La replicación lógica puede reproducir DDL incluyendo `CREATE EXTENSION`. Restrinja el DDL en los roles publicadores.pg_tle (Trusted Language Extensions)?
Mecanismo liderado por AWS para extensiones controladas dentro de la base de datos. Separado del indicador `trusted` principal; conozca su plataforma.¿Deben los usuarios de la aplicación ver los esquemas de extensiones?
Otorgue `USAGE` solo en las funciones necesarias. Oculte los esquemas de administración del `search_path`.¿Qué registros habilitar?
`log_statement = 'ddl'` o `pgaudit` para DDL de extensiones en entornos regulados.¿Política de desarrollo vs. producción?
La misma lista blanca. Las extensiones solo de desarrollo se filtran en copias de seguridad de producción y scripts de migración.Relacionado
- Conceptos Básicos de Extensiones - instalación y versionado
- Política de Lista Blanca de Extensiones - plantilla ADR de gobernanza
- Conceptos Básicos de Seguridad - modelo de amenazas
- Conceptos Básicos de Roles - patrones de mínimo privilegio
- Mejores Prácticas para Extensiones - lista de verificación operativa
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, y Patroni 3.x.