En este post, vamos a ver como utilizar Keycloak como IDP para AWS autenticando los usuarios mediante el protocolo SAML. Esto es muy interesante para no tener que gestionar usuarios locales de AWS, si no que todos ellos pertenezcan a un servicio de gestión de usuarios externos, por ejemplo Google, Active directory, LDAP… Del modo que cuando se de de baja el usuario, pierda el acceso al resto de plataformas.
La implementación es bastante sencilla. Solo necesitaremos un Keycloak y una cuenta de AWS con acceso de Administrador.
Keycloak
Crear un Cliente nuevo
Crear un cliente nuevo para la conexión contra AWS en el Realm AWS
que habremos creado previamente.
Antes que nada, hay que descargar el XML de AWS desde aquí.
Una vez creado el cliente, hay que configurarlo
Hay que editar los siguientes parámetros:
Base URL: /auth/realms/<REALM>/protocol/saml/clients/amazon-aws
IDP Initiated SSO URL Name: amazon-aws
Una vez hecho esto, hay que darle a Save
y deshabilitar el parámetro Full Scoped Allowed
en la pestaña de Scope
del cliente
Descargar metadata de SAML
Ahora, vamos a descargar el metadata del endopoint de SAML para posteriormente añadirla en AWS.
Lo que nos de, tenemos que guardarlo en un fichero que se llame AWS-Keycloak.xml
AWS
Crear el identity provider
Para esto, tenemos que ir AWS a la sección de IAM
y a Identity providers
- Seleccionar el provider de tipo
SAML
- Darle un nombre
- Seleccionar el XML que previamente nos hemos descargado de Keycloak
Una vez creado, si accedemos a el nos dará la siguiente información
Aquí es importante el ARN
del provider que lo necesitaremos luego.
Roles
Ahora, vamos a generar el role que utilizaremos para conectarnos a AWS. En este caso, será un role de solo lectura. Esto también está en la sección de IAM
Y como hemos hecho antes con el identity provider
, nos tenemos que quedar con el ARN
Keycloak
Roles
Ahora, vamos a añadir en el Client que hemos creado, un role nuevo. Aquí se pueden añadir tantos como se quieran (siempre que se hayan creado en AWS). A la hora de autenticarnos, nos pedirá que role queremos seleccionar.
El nombre del role tiene que ser de la siguiente forma: ARN_DEL_ROLE,ARN_DEL_IDENTITY_PROVIDER
Mappers
Para este cliente, hay que crear 3 Mappers diferentes
Mapper 1
- Name:
Session Role
- Mapper Type:
Role list
- Role attribute name:
https://aws.amazon.com/SAML/Attributes/Role
- Friendly Name:
Session Role
- SAML Attribute NameFormat:
Basic
Mapper 2
- Name:
Session Name
- Mapper Type:
User Property
- Property:
username
- Friendly Name:
Session Name
- SAML Attribute Name:
https://aws.amazon.com/SAML/Attributes/RoleSessionName
- SAML Attribute NameFormat:
Basic
Mapper 3
- Name:
Session Duration
- Mapper Type:
Hardcoded attribute
- Friendly Name:
Session Duration
- SAML Attribute Name:
https://aws.amazon.com/SAML/Attributes/SessionDuration
- SAML Attribute NameFormat:
Basic
- Attribute value:
3600
Groups
Vamos a crear un grupo nuevo para que todos los usuarios que se añadan a este, tengan los permisos del role que hemos creado.
Y mappeamos el role que hemos creado antes.
Usuarios
Vamos a generar un usuario de pruebas para ver que todo funciona correctamente
Una vez creado el usuario, hay que ir a la pestaña de Groups
y añadir el grupo que hemos creado
Y por último, añadirle una contraseña
Test
Para probar que todo funciona correctamente, tenemos que abrir la siguiente URL que nos llevará al login de Keycloak y este nos redirigirá a la consola de AWS
https://<KEYCLOAK_URL>/auth/realms/<REALM>/protocol/saml/clients/amazon-aws
Example:https://keycloak.example.com/auth/realms/AWS/protocol/saml/clients/amazon-aws
Y nos autenticará con el usuario de Keycloak:
En el caso de que se hayan añadido mas de un role, al iniciar sesión con el usuario, nos dirá cual seleccionar:
Y en el caso de que tengamos roles con diferentes cuentas, nos saldrá algo así:
Bibliografía
Also published on Medium.