Contexto de Seguridad en Rutinas: SECURITY DEFINER vs. INVOKER
Al crear funciones y procedimientos almacenados en un SGBD empresarial, surge una decisión crítica de arquitectura y seguridad: ¿Con qué privilegios debe ejecutarse el código interno de la función?
Existen dos modelos fundamentales de contexto de ejecución: SECURITY INVOKER y SECURITY DEFINER.
1. Comparativa Conceptual #
1┌─────────────────────────────────────────────────────────────────────────────┐ 2│ 1. SECURITY INVOKER (Por defecto) │ 2. SECURITY DEFINER (Modo Elevado) │ 3├──────────────────────────────────────┼──────────────────────────────────────┤ 4│ Se ejecuta con los permisos del │ Se ejecuta con los permisos del │ 5│ USUARIO QUE LLAMA a la función. │ CREADOR / PROPIETARIO de la función. │ 6│ │ │ 7│ Si el usuario no tiene acceso a las │ Permite realizar operaciones sobre │ 8│ tablas internas, la función falla. │ tablas protegidas de forma controlada│ 9└──────────────────────────────────────┴──────────────────────────────────────┘
Caso de Uso Estrella de SECURITY DEFINER: #
Imagina una tabla altamente confidencial de salarios_empleados a la que los empleados normales no tienen acceso directo (REVOKE SELECT ON salarios_empleados FROM empleado_rol;).
- Creamos una función
obtener_mi_salario()conSECURITY DEFINERcreada por el DBA. - La función filtra estrictamente
WHERE id_usuario = current_user_id(). - El empleado puede ejecutar la función y ver únicamente su propio salario, sin tener acceso a consultar la tabla completa.
2. Ejemplos de Implementación Multi-Motor #
3. Riesgos de Seguridad y Buenas Prácticas #
CAUTION
Peligro de Escalada de Privilegios (Privilege Escalation): Las funcionesSECURITY DEFINERse ejecutan con privilegios elevados (a menudo de superusuario o DBA). Para evitar vulnerabilidades:
- Fijar siempre el
search_path: Si un atacante crea una tabla maliciosa en su propio esquema y la función no fija elsearch_path, la función podría ejecutar código malicioso con permisos de administrador.- Evitar concatenación de texto en consultas dinámicas: Usa siempre sentencias preparadas con parámetros (
EXECUTE format(...) USING valor) para impedir ataques de inyección SQL dentro del procedimiento.
Resumen del tema
Conceptos clave #
SECURITY INVOKER: ejecuta la rutina con los permisos del usuario que la invoca (menor privilegio por defecto).SECURITY DEFINER: ejecuta la rutina con los privilegios de su creador, permitiendo exponer lógica segura sobre tablas restringidas.search_pathseguro: fijación obligatoria de esquemas en PostgreSQL para evitar secuestro de funciones por esquemas temporales.- Consultas dinámicas parametrizadas: regla indispensable para evitar inyecciones SQL en procedimientos con privilegios elevados.
Qué debes recordar #
Usa SECURITY DEFINER para permitir a usuarios sin privilegios directos realizar acciones controladas sobre datos sensibles, asegurando siempre el search_path y parametrizando las consultas.