Vault: Habilitar la autenticación mediante Keycloak

En este post, vamos a hacer que nos podamos autenticar en Vault con los usuarios o métodos establecidos en Keycloak. Esto se hará habilitando el método de autenticación OIDC. Todo lo que hagamos, lo haremos con la CLI de Vault.

El stack de Vault, lo levantaremos con Docker-compose, como backend de Vault usaremos Consul y como reverse proxy, Traefik (as always)

Let’s go!

La configuración de esto, es bastante sencilla. Dejo aquí el docker-compose.yaml de Vault para levantar el stack. No tiene mucha complicación, hay que setear la variable VAULT_URL con el dominio que queramos, antes de levantar el stack en el fichero .env

Una vez levantado, vamos a proceder a iniciarlo y hacer el unseal. Lo primero que hay que hacer, es exportar la siguiente variable

export VAULT_ADDR=https://vault.example.com

Y a continuación, iniciarlo

vault operator init

Esto nos dará 5 claves para hacer el unseal y el token de root. Todo esto hay que guardarlo. Es muy importante para poder operar Vault.

Unseal Key 1: FPXGDsBPnUhwPrq8WpeNPAX7oWxTnXRjiSnsEBEOOEfP
Unseal Key 2: jZUqZsMcURF7xG0QV/WFele4plJ/Ut27N4x3FONqDK/C
Unseal Key 3: V1G+SyBOWjqNZfKwjfyUUUObwENkOAXleEFgGr2knqhx
Unseal Key 4: tZTsGx15X8Jd/3kStvYtqI+GLB8QRKn2fP5NMocdCx5W
Unseal Key 5: NUc5lduN2EyMflj2uS7a467gHBvuag5zZn/GSGZUrwB5

Initial Root Token: s.YXH8o5yf7ZzsZiTe2xYLI61k

Ahora, vamos a hacer el unseal. Para esto, necesitamos 3 de las 5 keys que nos ha proporcionado antes Vault. Y es repetir el mismo comando 3 veces, metiendo una key diferente cada vez.

vault operator unseal
Unseal Key (will be hidden): 
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    1/3
Unseal Nonce       2b92c8b1-805f-a9e5-2c7f-74f320d59160
Version            1.4.1
HA Enabled         true

Hasta que salga:

Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    5
Threshold       3
Version         1.4.1
Cluster Name    vault-cluster-087e9f54
Cluster ID      eacc7fbf-cffd-2adc-fbdb-62d19db14b51
HA Enabled      true
HA Cluster      https://127.0.0.1:8201
HA Mode         active

Cuando esté unsealed, nos autenticamos como root con el token que nos ha proporcionado antes.

vault login
Key                  Value
---                  -----
token                s.YXH8o5yf7ZzsZiTe2xYLI61k
token_accessor       EGfzFV802Ew1xhq4AlJcgV6U
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

Policies

Vamos a crear una policy que tenga permisos para leer todos los secretos del path /secrets

vault policy write manager -<<EOF
path "/secret/*" {
    capabilities = ["create", "read", "update", "delete", "list"]
}
EOF

Para verificar las policies existentes:

vault policy list
default
manager
root

Auth Methods

Una vez creada la policy, vamos a habilitar el auth method de Keycloak

vault auth enable \
        -path=keycloak \
        -listing-visibility="unauth" \
        oidc

Ahora tenemos que configurar las credenciales y la URL de Keycloak contra la que nos vamos a conectar. Por otro lado, hay que generar el cliente y el secreto que vamos a utilizar en Keycloak. En este post se puede ver como hacerlo.

vault write auth/keycloak/config \
        oidc_discovery_url="https://keycloak.example.com/auth/realms/<REALM_NAME>" \
        oidc_client_id="vault" \
        oidc_client_secret="XXXXX-XXXXXX-XXXXX" \
        default_role="manager" \
        type="oidc"

Y crear el role en el auth con los callbacks correspondientes y la policy que creamos anteriormente

Nota: Hay que asegurarse de que los redirects que estén definidos en el role, estén permitidos en Keycloak.

vault write auth/keycloak/role/manager \
        bound_audiences="vault" \
        allowed_redirect_uris="https://vault.example.com/ui/vault/auth/keycloak/oidc/callback,https://vault.example.com/keycloak/callback,http://localhost:8250/oidc/callback" \
        user_claim="sub" \
        policies="manager" \
        ttl=1h \
        role_type="oidc" \
        oidc_scopes="openid"

Login

Una vez hecho esto, ya debería de aparecernos en la UI el método de autenticación de Keycloak

No hay que añadir nada en el Role, cogerá el que hemos definido automáticamente. Y una vez que se le de a Sign in with OIDC Provider, nos abrirá una ventana con la autenticación de Keycloak

Y ya estaríamos autenticados en Vault con los permisos correspondientes.

Si queremos conectarnos por CLI sería de la siguiente forma:

vault login -method=oidc -path=keycloak

Esto, nos abrirá una ventana en el navegador para autenticarnos y si es satisfactorio,nos permitirá acceder vía CLI

Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                  Value
---                  -----
token                s.4qL60D4wN08dHL6S4Hq5Xmen
token_accessor       uQ6OnKzS27IFwBuuz4xqY78v
token_duration       1h
token_renewable      true
token_policies       ["default" "manager"]
identity_policies    []
policies             ["default" "manager"]
token_meta_role      manager

Also published on Medium.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *