Tema 8

8. Fundamentos de autorización: permisos, políticas y toma de decisiones

Autenticar a un sujeto responde quién es. Autorizar responde qué puede hacer. Esa diferencia parece simple, pero detrás de ella hay uno de los problemas más delicados del diseño de sistemas: traducir reglas de negocio, riesgo y contexto en decisiones claras, consistentes y auditables sobre el acceso a recursos.

Objetivo Comprender qué es autorizar y cómo se decide
Enfoque Conceptual con impacto directo en implementación
Resultado Modelar permisos y políticas con mayor claridad

8.1 Introducción

Muchas aplicaciones hacen bien el login, pero fallan justo después: una vez autenticado el usuario, el sistema no define con suficiente precisión qué operaciones puede ejecutar, sobre qué objetos, bajo qué condiciones y con qué límites. Ahí aparece el problema de autorización.

En sistemas simples, la autorización puede parecer una lista corta de roles o flags. En entornos reales, en cambio, suele reflejar reglas de negocio, jerarquías, relaciones, segregación de funciones, contexto operativo y niveles de riesgo.

Este tema presenta la base conceptual para entender esa capa. Antes de estudiar modelos específicos como RBAC o ABAC, conviene entender qué compone una decisión de autorización y por qué implementarla mal produce tanto vulnerabilidades como caos operativo.

8.2 Qué es autorización

La autorización es el proceso mediante el cual un sistema decide si una identidad autenticada puede realizar una acción determinada sobre un recurso concreto, en un contexto dado.

Esta definición contiene varias piezas importantes:

  • Identidad autenticada: el sujeto ya fue reconocido y validado.
  • Acción: operación solicitada, como leer, editar, aprobar, borrar o administrar.
  • Recurso: objeto sobre el que recae la acción.
  • Contexto: condiciones adicionales como tenant, horario, ubicación, dispositivo o estado del recurso.

La autorización no se limita a decir “sí” o “no”. También puede restringir alcance, forzar controles extra o devolver decisiones condicionadas.

8.3 Diferencia entre permiso y política

En conversaciones técnicas suele mezclarse permiso con política, pero no son exactamente lo mismo.

Concepto Qué representa Ejemplo
Permiso Capacidad concreta asignada o derivada Puede editar usuarios
Política Regla o conjunto de reglas que gobiernan la decisión Solo puede editar usuarios de su propio tenant y no superadministradores

En términos simples, el permiso suele ser una unidad más directa; la política es la lógica que determina cuándo, cómo y bajo qué condiciones ese permiso aplica.

8.4 Sujetos, recursos, acciones y contexto

Una decisión de autorización madura casi siempre puede descomponerse en cuatro partes:

  • Sujeto: la identidad que solicita acceso.
  • Recurso: el objeto o entidad protegida.
  • Acción: lo que se quiere hacer sobre el recurso.
  • Contexto: condiciones adicionales del entorno.

Este esquema evita pensar la autorización de manera vaga. En lugar de preguntar “¿este usuario es admin?”, conviene preguntar “¿este sujeto puede ejecutar esta acción sobre este recurso bajo estas condiciones?”. Esa formulación obliga a diseñar mejor.

8.5 Ejemplos simples y ejemplos reales

Un ejemplo simple de autorización sería: “solo administradores pueden borrar usuarios”. Pero en sistemas reales la regla suele ser más rica. Por ejemplo:

  • Un supervisor puede aprobar gastos hasta cierto monto.
  • Un médico puede ver historias clínicas de pacientes asignados a su área.
  • Un operador puede reiniciar un servicio, pero no cambiar configuración global.
  • Un cliente puede ver sus propias facturas, pero no las de otro tenant.

Estos casos muestran por qué la autorización no puede reducirse siempre a un rol aislado. A menudo intervienen relaciones, atributos y límites contextuales.

8.6 Decisiones de autorización y lógica de negocio

La autorización está profundamente conectada con la lógica de negocio. No es solo una capa técnica separada del dominio. De hecho, muchas reglas de negocio críticas se expresan como restricciones de acceso.

Por ejemplo, “solo finanzas puede aprobar pagos mayores a cierto umbral” es una regla del negocio, pero al mismo tiempo es una regla de autorización. Lo mismo ocurre con segregación de funciones, permisos por tenant o restricciones por etapa del proceso.

El problema aparece cuando estas reglas se dispersan caóticamente por controladores, pantallas, consultas y servicios sin un modelo claro. Entonces la autorización se vuelve inconsistente y difícil de auditar.

8.7 Puntos de decisión y puntos de aplicación

En arquitectura de autorización suele distinguirse entre:

  • Punto de aplicación: el lugar donde se intercepta la solicitud y se hace cumplir la decisión.
  • Punto de decisión: el componente que evalúa reglas y determina permitir o denegar.

En muchos sistemas pequeños ambas funciones viven juntas. En arquitecturas más maduras o distribuidas, pueden separarse: una API gateway, un middleware o un servicio consulta políticas definidas en otro componente especializado.

Esta separación puede mejorar consistencia, pero también exige buen diseño para no perder contexto ni introducir latencia o ambigüedad.

8.8 Autorización previa y filtrado posterior

Otro punto importante es cuándo se aplica la decisión. Algunas veces el sistema decide antes de ejecutar cualquier operación. Otras, primero obtiene un conjunto de datos y luego filtra lo visible.

Ambos enfoques existen, pero deben usarse con cuidado. Si el filtrado posterior se implementa mal, pueden aparecer fugas por errores de consulta, respuestas parciales, caches o endpoints alternativos. En general, cuanto antes se incorpore la restricción al flujo real del recurso, más confiable será el control.

8.9 Autorización a nivel de función y a nivel de objeto

No toda autorización opera en el mismo nivel. Hay al menos dos planos muy comunes:

  • Nivel de función: define si el sujeto puede acceder a una capacidad general, como “crear usuarios”.
  • Nivel de objeto: define si puede actuar sobre una instancia concreta, como “editar este usuario específico”.

Muchas vulnerabilidades aparecen cuando una aplicación protege bien la función general, pero falla en el nivel de objeto. Por ejemplo, un usuario autenticado puede acceder al endpoint correcto, pero manipulando un ID termina viendo datos ajenos. Esto conecta con problemas como IDOR y acceso horizontal indebido.

8.10 Permisos explícitos y permisos derivados

Algunas capacidades se asignan de forma explícita. Otras se derivan de rol, grupo, relación o atributos del sujeto. También pueden surgir de estados temporales o de políticas contextuales.

Por ejemplo:

  • Permiso explícito: “Juan puede administrar el repositorio X”.
  • Permiso derivado: “todo usuario del área legal puede acceder a contratos de su unidad”.
  • Permiso contextual: “solo durante horario hábil y desde red corporativa”.

Entender esta diferencia es importante para modelar cambios. Los permisos explícitos son precisos pero difíciles de escalar. Los derivados son más mantenibles, pero requieren mayor claridad en reglas y fuentes de datos.

8.11 Denegar por defecto

Uno de los principios más importantes en autorización es el de deny by default. Si el sistema no puede establecer con claridad que una acción está permitida, debería denegarla.

Este principio reduce el riesgo de accesos inesperados por omisión, rutas nuevas no protegidas o reglas incompletas. En cambio, los diseños permisivos por defecto suelen romperse con facilidad cuando el sistema crece o cambia.

En autorización, la ausencia de una regla clara no debería interpretarse como permiso implícito.

8.12 Permisos amplios, permisos mínimos y granularidad

Un diseño demasiado amplio vuelve inseguro el sistema. Uno excesivamente granular puede volverlo inmanejable. El desafío está en encontrar una granularidad útil: suficientemente precisa para controlar riesgos, pero no tan fragmentada que nadie pueda entender ni operar el modelo.

La granularidad razonable depende del dominio. En algunos casos basta con lectura, escritura y administración. En otros hacen falta distinciones como aprobar, publicar, delegar, ver parcialmente o exportar.

8.13 Autorización en APIs

En APIs la autorización suele exponerse de forma más explícita porque cada endpoint representa operaciones concretas. Sin embargo, eso no simplifica automáticamente el problema. De hecho, muchas APIs fallan porque confunden token válido con acción permitida.

Una API madura debería verificar:

  • La identidad representada por el token.
  • El alcance general del token.
  • La acción solicitada sobre el recurso concreto.
  • El tenant, ownership o contexto del objeto pedido.

Si alguno de estos pasos falta, la API puede habilitar accesos laterales, verticales o entre clientes distintos.

8.14 Autorización en interfaces de usuario

La interfaz también participa, pero no debe ser el único punto de control. Ocultar botones o menús según el rol puede mejorar experiencia y reducir errores, pero no constituye una decisión de seguridad suficiente.

El backend o el recurso real debe validar siempre. Si una acción se protege solo en frontend, un usuario con conocimientos mínimos puede invocar directamente el endpoint o manipular la solicitud.

8.15 Trazabilidad de decisiones de autorización

Las decisiones de autorización no deberían quedar invisibles. Cuando una operación es crítica, conviene registrar qué identidad actuó, sobre qué recurso, qué política se aplicó y si la decisión fue permitir o denegar.

Esta trazabilidad es valiosa para:

  • Investigar incidentes.
  • Entender rechazos inesperados.
  • Auditar reglas sensibles.
  • Explicar resultados en procesos regulados.

No siempre es necesario loguear cada detalle de forma exhaustiva, pero sí debe existir suficiente contexto en operaciones de alto impacto.

8.16 Errores frecuentes al implementar autorización

  • Confiar en el frontend como único control.
  • Validar acceso a una función pero no al objeto concreto.
  • Asumir que un token válido ya autoriza cualquier acción.
  • Dispersar reglas de acceso en múltiples capas sin modelo coherente.
  • Permitir por defecto cuando falta una regla clara.
  • No registrar decisiones críticas o denegaciones relevantes.
  • Combinar reglas de negocio y permisos sin capacidad de auditarlas.

8.17 Preparación para los modelos de control de acceso

Todo lo visto hasta aquí prepara el terreno para los modelos concretos que estudiaremos en el tema siguiente. RBAC, ABAC, DAC, MAC y otras variantes no son más que formas distintas de estructurar y automatizar las decisiones que ya describimos: quién puede hacer qué, sobre qué, bajo qué condiciones.

Si se entiende bien la base, luego resulta mucho más fácil evaluar qué modelo encaja mejor con cada sistema.

8.18 Qué debes recordar de este tema

  • Autorizar es decidir si una identidad autenticada puede ejecutar una acción sobre un recurso en un contexto dado.
  • Permiso y política no son exactamente lo mismo.
  • Una buena decisión de acceso considera sujeto, recurso, acción y contexto.
  • La autorización debe validarse en el backend o en el recurso real, no solo en la interfaz.
  • Denegar por defecto es un principio central.
  • Los errores más comunes aparecen cuando se mezcla autorización con lógica dispersa y controles incompletos sobre objetos concretos.

8.19 Conclusión

La autorización es el punto donde la identidad se convierte en capacidad operativa real. Si esta capa está mal diseñada, un sistema autenticado puede seguir siendo inseguro. Si está bien resuelta, las reglas de acceso se vuelven más claras, auditables y consistentes con el negocio.

En el próximo tema analizaremos los principales modelos de control de acceso: DAC, MAC, RBAC, ABAC y ReBAC, comparando sus fortalezas, límites y escenarios de uso.