Autenticación en Hashicorp Vault utilizando OIDC {Keycloak}

Gustavo Ortega
Ingenia, Architectural Journeys
5 min readMar 31, 2021

--

Explorando los diferentes mecanismos de autenticación que podemos configurar en Hashicorp Vault, me pareció interesante compartirles los pasos necesarios para poder hacerlo utilizando OpenID Connect, con Keycloak como Identity and Access Managment.

Para nuestro ejemplo, vamos a utilizar dos contenedores:

Keycloak v12.0.4

docker run -d --name keycloak -p 8080:8080 -d -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak:12.0.4

Hashicorp Vault

docker run --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=passwd-lab' -d -p8200:8200 -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' vault

Configurando IAM — Keycloak

Ya tenemos corriendo nuestra instancia de Keycloak, la cual accederemos a través del puerto 8080. Las credenciales de administración podemos setearlas como variables al momento de creación del container. En nuestro caso: admin/admin.

Una vez dentro de la consola web, vamos a proceder con la creación del realm, donde generaremos todas las configuraciones necesarias para la integración. En este caso:

  • Creación de un client
  • Creación de dos roles (admin y operator) dentro del client
  • Creación de dos usuarios (superuser1 y normaluser)
  • Creación de un mapper (el cual nos permite agregar custom claims al token. Esto lo utilizaremos básicamente para agregar dentro del token, el rol asignado al usuario, lo que finalmente permitirá que vault nos asigne la política correspondiente. Al finalizar el articulo, podrás observar el jwt para una mejor comprensión).

Manos a la obra!

Para la creación del realm y configuraciones, vamos a “Add realm”, “Select file” y finalmente seleccionamos el archivo “realm.json” (disponible en el repo de github)

IMPORTANTE: Protege y no divulgues el secret del client creado. Si en tu lab cambias el valor configurado, recorda actualizarlo al momento de configurar en vault.

Deberás setear la contraseña a los dos usuarios que generé en el ejemplo. Un par de imágenes más abajo podes encontrar una pantalla de ejemplo.

Configurando Hashicorp Vault

Ahora llegó el momento de preparar nuestro entorno en vault. Para ello, primero vamos a autenticarnos con el token que seteamos como variable al momento de crear el contenedor, en nuestro caso “passwd-lab”.

Una vez dentro, daremos de alta el nuevo método de autenticación, para lo cual vamos a la opción “Access”, y luego “Enable new method”.

Seleccionamos el método “OIDC” (OpenID Connect).

En la configuración del mismo, los valores importantes a configurar son:

  • “OIDC discovery URL”, la cual obtendremos desde el IAM. Para encontrar la tuya, dentro del realm, en “Realm Settings”, elegí OpenId Endpoint Configuration dentro de “Endpoints”. El valor a copiar es el correspondiente a “issuer”.
  • “Default role”, configuraremos el correspondiente al rol con menos permisos. En nuestro caso “operator”

En las opciones de “OIDC Options”:

  • “OIDC client ID”, lo seteamos en el IAM (en nuestro caso “vault”)
  • “OIDC client secret”, lo seteamos en el IAM (este es el valor que te recomiendo cambiar y proteger).

Una vez terminada la configuración del método, ahora nos toca generar 2 policies:

Una para los administradores y otra para los operadores.

Para ello, vamos a la opción “Policies”, “Create ACL policy” y elegimos un nombre. “administrator” y “operator” en nuestro ejemplo.

Para su creación, podes elegir la opción “Upload file” y seleccionar los archivos .hcl que tenes disponibles en el repo github.

Finalmente, necesitamos asociar esas policies a los roles de los usuarios que se autentiquen. ¿Cómo lo hacemos? Para eso crearemos dos roles, los cuales nos permiten hacer esta asociación.

Podemos aprovechar la shell web disponible en la consola, y allí pegaremos las siguientes dos líneas:

vault write auth/oidc/role/admin bound_audiences="vault" allowed_redirect_uris="http://lab.gustavoortega.com.ar:8200/ui/vault/auth/oidc/oidc/callback" user_claim="sub" groups_claim="groups" policies="administrator"vault write auth/oidc/role/operator bound_audiences="vault" allowed_redirect_uris="http://lab.gustavoortega.com.ar:8200/ui/vault/auth/oidc/oidc/callback" user_claim="sub" groups_claim="groups" policies="operator"

Hemos terminado!

Probando nuestra integración

Finalmente volvemos a loguearnos en Vault, pero esta vez indicaremos que queremos utilizar como método “OIDC”. Al hacer click, se abrirá una ventana que nos solicitará autenticarnos, la cual corresponde a Keycloak.

Al hacerlo con el usuario “normaluser”, veremos que nuestros permisos sobre vault son limitados! Esto debido a que no especificamos ningún rol y, por defecto, configuramos que utilice “operator”.

Al cerrar sesión y volver a ingresar, esta vez como admin, nuestros permisos son completamente diferentes! Para ellos, te autenticas con el usuario superuser1, el cual tiene el rol asociado en Keycloak.

Cómo dato final, te cuento que podes jugar un poco con capturas de paquetes, aprovechando que nuestro lab utiliza conexiones no cifradas.

En esas capturas, obtuve el access token, el cual comparto con vos a continuación, para que veas como el mapper definido en keycloak, agregó el claim “groups” al token, el cual permite a vault saber que policy nos corresponde:

Repo Github:

https://github.com/gustavoortega/vault-oidc.git

--

--