Estado | VIGENTE | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Partes interesadas | ||||||||||||||||||||||||||||||||||
TAGS | AUTENTICACION SEGURIDAD | |||||||||||||||||||||||||||||||||
Tomada el |
| |||||||||||||||||||||||||||||||||
Documentación Asociada |
| |||||||||||||||||||||||||||||||||
Solución Afectada | TODAS | |||||||||||||||||||||||||||||||||
Asunto a Decidir | Describe brevemente la decisión arquitectónica tomada. Se requiere decidir el mecanismo de autenticación y/o autorización para la comunicación entre sistemas del SAS teniendo en cuenta los requisitos minimos de seguridad exigibles en el SAS a un sistema de registro de actividad con validez legal. |
---|
Identificación de la decisión | Describe brevemente la decisión arquitectónica tomada. Consideramos que la alternativa 3 es la que presenta un mejor balance coste beneficio, y que nos mantiene un modelo claro y sencillo, con capacidades de administración de los clientes autorizados a verter auditoria, manteniéndose además dentro de los estándares, y con un impacto en costes muy reducido tanto evidentes en MVP como ocultos cuando se inicie el proceso de integración en las aplicaciones terceras. Keycloak ya proporciona una solución para el problema planteado esta solución se apoya en un estándar como OAuth2.0. Al usar la misma herramienta y los mismos recursos que para el resto de autentificaciones evitamos introducir un sistema adicional, duplicidades, el aumento de la complejidad y solapamientos con los sobrecostes que conlleva. mantenemos el sistema simple Al seguir la estrategia con Keycloack no es necesario tener diferentes estrategias de seguridad. por ejemplo un servicio invocado por un usuario y por una máquina no necesita una autentificación OAUTH y apy-key, le basta con OAUTH. Keycloak es altamente configurable y adaptable permitiéndonos adaptar la seguridad al nivel exacto que se requiera para cada cliente; es mas completo y flexible. Una vez establecida la configuración deseada se puede generar un JSON con dicha configuración e importarlo para los nuevos clientes, convirtiendo la creación de nuevos clientes en algo trivial. Al mantenernos en la opción de keycloak obtenemos una solución cercana a API-KEY en sencillez, con facilidad para operarlo e integrarlo en DEVOPS. |
---|
Contexto | Con la proliferación de la arquitectura de referencia y los desarrollos basados en microservicios unida a la estrategia de autenticación y autorización centralizada (SSO) de la organización. Por lo tanto, se solicita una propuesta de mecanismo de autenticación y autorización que sea adecuado para asegurar la comunicación entre sistemas. |
---|
Se analiza el uso de API Keys y de Client Secret como mecanismo de autenticación y autorización para la comunicación entre sistemas del SAS. Esta propuesta se divide en tres alternativas:
Alternativa 1:
Api key para todos los sistemas igual. Guardar el valor en k8s y obtenerlo desde una variable de entorno. Es sólo autenticación, no incluye autorización (es decir, cualquier sistema puede logar cualquier evento)
Alternativa 2:
Incluir una autorización por cada sistema productor. En este caso habría que disponer de una persistencia que almacenara API-KEY, sistema y eventos autorizados a logar. Esta alternativa es más elegante aunque más costosa, y permite un grano más fino de autenticación y autorización.
Alternativa 3:
Otra alternativa al Ali-key es el uso de Keycloak con Client Id y secret. Este mecanismo permite la autentificación y autorización entre máquinas.
Las API Keys permiten autenticar y autorizar a un sistema tercero a acceder al recurso del sistema responsable del mismo. Para ello, cada sistema tercero debe obtener una API Key y una API Secret Key.
Dentro de las ventajas por parte de se plantea que este sistema es de bajo coste pero no se está contando con la duplicidad que implica la multiplicidad en los sistemas de autenticación, así pues la evaluación de coste que se hace al respecto es la siguiente:
Así pues el coste sería:
Realmente esta alternativa es una expansión de la alternativa 1. en esta alternativa plantea lo siguiente "Incluir una autorización por cada sistema productor. En este caso habría que disponer de una persistencia que almacenara API-KEY, sistema y eventos autorizados a logar. Esta alternativa es más elegante aunque más costosa, y permite un grano más fino de autenticación y autorización."
Dentro de las ventajas por parte de se plantea que este sistema es de bajo coste pero no se está contando con la duplicidad que implica la multiplicidad en los sistemas de autenticación, así pues la evaluación de coste que se hace al respecto es la siguiente:
Así pues el coste sería:
Planteamos una pequeña POC de ejemplo
Planteamos un realm "api". Sobre este realm creamos un cliente "api-n" de tipo OpenID Connect tal y como se muestra en la captura siguiente.
SAS
Dentro de las configuraciones de las capacidades de este cliente activamos "Client authentication" si deseamos una autorización de grano fino activamos la autorización. a continuación marcamos los flujos de autentificación que deseamos tener activos dentro de los parámetros OAuth2.0.
Una vez que hemos creado nuestro cliente acudimos a la pestaña Credentials, generamos un secret aleatorio e indicamos que la autentificación será mediante "Client Id and Secret". para una POC no entraremos en más detalles.
Cuando hacemos una petición postman para obtener el token podemos ver que la autentificación es correcta.
Podemos ver que el contenido del token es correcto y está activo, por lo tanto la autentificación ha sido correcta.
El impacto en el microservicio que debe validar el token hay que considerar los siguientes cambios:
mp.jwt.token.header=Authorization mp.jwt.token.cookie=Bearer
<feature>microProfile-3.3</feature> <mpJwt id="defaultmpjwt" jwksUri="https://keycloak.ejemplo.org/auth/realms/sistema-n/protocol/openid-connect/certs" issuer="https://keycloak.ejemplo.org/auth/realms/sistema-n" userNameAttribute="azp"> <audiences>ALL_AUDIENCES</audiences> </mpJwt>
El método que debe validar el token se debe anotar con: @RolesAllowed("LISTA-ROLES-AUTORIZADOS")
Describe brevemente la decisión arquitectónica tomada.
Consideramos que la alternativa 3 es la que presenta un mejor balance coste beneficio, y que nos mantiene un modelo claro y sencillo, con capacidades de administración de los clientes autorizados a verter auditoria, manteniéndose además dentro de los estándares, y con un impacto en costes muy reducido tanto evidentes en MVP como ocultos cuando se inicie el proceso de integración en las aplicaciones terceras.
Keycloak ya proporciona una solución para el problema planteado esta solución se apoya en un estándar como OAuth2.0. Al usar la misma herramienta y los mismos recursos que para el resto de autentificaciones evitamos introducir un sistema adicional, duplicidades, el aumento de la complejidad y solapamientos con los sobrecostes que conlleva. mantenemos el sistema simple
El uso de un clientId con un secret asociado es en gran medida equivalente a la solución de un API-KEY dónde usamos un ID del cliente y una secret para obtener un token autentificado seguro con los roles y autorizaciones que le corresponda. Desde el punto de vista de la máquina invocante varia ligeramente el flujo ya que invoca a la URL proporcionada con el clientId y el password y obtiene el token generado por keycloak, a partir de este punto el funcionamiento/flujo es el estándar para cualquier autentificación por Oauth2.0
Al seguir la estrategia con Keycloack no es necesario tener diferentes estrategias de seguridad. por ejemplo un servicio invocado por un usuario y por una máquina no necesita una autentificación OAUTH y apy-key, le basta con OAUTH.
Keycloak es altamente configurable y adaptable permitiéndonos adaptar la seguridad al nivel exacto que se requiera para cada cliente; es mas completo y flexible. Una vez establecida la configuración deseada se puede generar un JSON con dicha configuración e importarlo para los nuevos clientes, convirtiendo la creación de nuevos clientes en algo trivial.
Al mantenernos en la opción de keycloak obtenemos una solución cercana a API-KEY en sencillez, con facilidad para operarlo e integrarlo en DEVOPS.
Describe brevemente la decisión arquitectónica tomada.
Creamos un cliente de tipo OpenID Connect en el realm deseado tal y como se muestra en la captura siguiente.
Dentro de las configuraciones de las capacidades de este cliente activamos "Client authentication" si deseamos una autorización de grano fino activamos la autorización. a continuación marcamos los flujos de autentificación que deseamos tener activos dentro de los parámetros OAuth2.0.
Una vez que hemos creado nuestro cliente acudimos a la pestaña Credentials, generamos un secret aleatorio e indicamos que la autentificación será mediante "Client Id and Secret". para una POC no entraremos en más detalles.
En los mapeos del token se requiere añadir upn y groups con los roles, ningún otro mapeo en especial.
Desde la consola de keycloak se puede revocar una sesión concreta de un cliente dado.
Deshabilitar el cliente o incluso eliminándolo causa que un clientId ya no pueda autentificar, lo equivale a una revocación aunque las sesiones activas continuarían vivas y una vez cerradas no se pueden crear nuevas para ese cliente.