# HashiCorp Vault

> Integra Ironchip con HashiCorp Vault mediante OIDC: crea la aplicación en Ironchip, habilita el método de autenticación oidc y define las políticas y los roles.

URL: https://docs.ironchip.com/identidad/integraciones/puestos/vault/

Esta guía configura HashiCorp Vault para que los usuarios inicien sesión con Ironchip mediante [OIDC](https://docs.ironchip.com/identidad/protocolos/oidc/). Incluye la aplicación en Ironchip, el método de autenticación en Vault y las políticas y roles de usuario y de administrador.

## Requisitos

- Acceso a la consola de administración de Ironchip.
- Un usuario con permisos para realizar la configuración en Vault.

## Configuración en Ironchip

En la sección **Applications** puedes ver todos los servicios protegidos que se han añadido a Ironchip y sus características.

1. Haz clic en **New application**. Se abre una ventana nueva.
2. Elige **Custom application**.
3. Rellena los parámetros de la nueva aplicación:

   - **Nombre de la aplicación**.
   - **Tipo de integración**: OIDC - OAuth 2.0.
   - **URIs de redirección**:

     - `http://<host-de-tu-servicio>:8250/oidc/callback`
     - `http://<host-de-tu-servicio>:8200/ui/vault/auth/oidc/oidc/callback`

   [Imagen: Formulario de la aplicación personalizada OIDC con las URIs de redirección]

4. Haz clic en **Add service**. El servicio aparece en la sección correspondiente.

:::caution[Guarda los datos de la aplicación]
Guarda los campos que Ironchip devuelve al crear el servicio (el client ID y el client secret): solo aparecen esta vez.
:::

## Configuración en Vault

### Habilitar el método de autenticación OIDC

1. En la pestaña de acceso (**Access**), crea un nuevo método de autenticación **oidc**.

   [Imagen: Pestaña Access de Vault con la opción de crear un método de autenticación]

2. Introduce la ruta `oidc`, habilita **List method when unauthenticated** y haz clic en el botón para habilitar el método.

   [Imagen: Habilitación del método oidc con la ruta oidc]

3. En la configuración de OIDC, rellena estos parámetros:

   - **OIDC discovery url**: `https://idp.ironchip.com/oidc`
   - **Default role**: `demo`
   - **OIDC response mode**: `query`

   [Imagen: Parámetros de discovery url, default role y response mode]

4. Rellena también estos dos campos con los datos que devolvió Ironchip al crear la aplicación:

   - **OIDC client ID**: el ID de cliente.
   - **OIDC client secret**: el secreto del cliente.

   [Imagen: Campos OIDC client ID y OIDC client secret]

5. Haz clic en guardar. El nuevo método de autenticación oidc queda creado.

### Crear las políticas

En la pestaña de políticas, si no hay ninguna política `default` definida, créala con este contenido. Es la política de los usuarios ordinarios, que no tendrán acceso a la pestaña de políticas.

```hcl title="Política default"
# Allow tokens to look up their own properties
path "auth/token/lookup-self" {
    capabilities = ["read"]
}

# Allow tokens to renew themselves
path "auth/token/renew-self" {
    capabilities = ["update"]
}

# Allow tokens to revoke themselves
path "auth/token/revoke-self" {
    capabilities = ["update"]
}

# Allow a token to look up its own capabilities on a path
path "sys/capabilities-self" {
    capabilities = ["update"]
}

# Allow a token to look up its own entity by id or name
path "identity/entity/id/{{identity.entity.id}}" {
  capabilities = ["read"]
}
path "identity/entity/name/{{identity.entity.name}}" {
  capabilities = ["read"]
}

# Allow a token to look up its resultant ACL from all policies. This is useful
# for UIs. It is an internal path because the format may change at any time
# based on how the internal ACL features and capabilities change.
path "sys/internal/ui/resultant-acl" {
    capabilities = ["read"]
}

# Allow a token to renew a lease via lease_id in the request body; old path for
# old clients, new path for newer
path "sys/renew" {
    capabilities = ["update"]
}
path "sys/leases/renew" {
    capabilities = ["update"]
}

# Allow looking up lease properties. This requires knowing the lease ID ahead
# of time and does not divulge any sensitive information.
path "sys/leases/lookup" {
    capabilities = ["update"]
}

# Allow a token to manage its own cubbyhole
path "cubbyhole/*" {
    capabilities = ["create", "read", "update", "delete", "list"]
}

# Allow a token to wrap arbitrary values in a response-wrapping token
path "sys/wrapping/wrap" {
    capabilities = ["update"]
}

# Allow a token to look up the creation time and TTL of a given
# response-wrapping token
path "sys/wrapping/lookup" {
    capabilities = ["update"]
}

# Allow a token to unwrap a response-wrapping token. This is a convenience to
# avoid client token swapping since this is also part of the response wrapping
# policy.
path "sys/wrapping/unwrap" {
    capabilities = ["update"]
}

# Allow general purpose tools
path "sys/tools/hash" {
    capabilities = ["update"]
}
path "sys/tools/hash/*" {
    capabilities = ["update"]
}

# Allow checking the status of a Control Group request if the user has the
# accessor
path "sys/control-group/request" {
    capabilities = ["update"]
}

# Allow a token to make requests to the Authorization Endpoint for OIDC providers.
path "identity/oidc/provider/+/authorize" {
	capabilities = ["read", "update"]
}
```

[Imagen: Pestaña de políticas de Vault con la política default]

Si quieres configurar un usuario administrador, crea una política `admin` con este contenido:

```hcl title="Política admin"
path "sys/health"
{
  capabilities = ["read", "sudo"]
}

path "sys/policies/acl"
{
  capabilities = ["list"]
}

path "sys/policies/acl/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

path "auth/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

path "sys/auth/*"
{
  capabilities = ["create", "update", "delete", "sudo"]
}

path "sys/auth"
{
  capabilities = ["read"]
}

path "secret/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

path "sys/mounts/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

path "sys/mounts"
{
  capabilities = ["read"]
}
```

### Crear los roles

Con las políticas definidas, crea un rol para cada una. Se hace desde el terminal que ofrece la aplicación Vault. Sustituye `CLIENT_ID` por el client ID de la aplicación de Ironchip.

Para el usuario común, crea el rol `demo`:

```bash
vault write auth/oidc/role/demo \
        bound_audiences="CLIENT_ID" \
        allowed_redirect_uris="http://<host-de-tu-servicio>:8200/ui/vault/auth/oidc/oidc/callback" \
        allowed_redirect_uris="http://<host-de-tu-servicio>:8250/oidc/callback" \
        user_claim="sub" \
        policies="default" \
        verbose_oidc_logging="true"
```

Para el administrador, crea el rol `admin`:

```bash
vault write auth/oidc/role/admin \
        bound_audiences="CLIENT_ID" \
        allowed_redirect_uris="http://<host-de-tu-servicio>:8200/ui/vault/auth/oidc/oidc/callback" \
        allowed_redirect_uris="http://<host-de-tu-servicio>:8250/oidc/callback" \
        user_claim="sub" \
        policies="admin" \
        verbose_oidc_logging="true"
```

:::note
El rol que se establece por defecto en la configuración de OIDC no hace falta introducirlo al iniciar sesión. Para entrar como administrador sí tendrás que introducir el rol `admin`.
:::

## Comprobación

Antes de probar, comprueba que el usuario está añadido a la aplicación de Ironchip.

1. Abre la página de inicio de sesión de Vault y selecciona el método **OIDC**.
2. Si eres un usuario común, deja el **Role** vacío: Vault usa el rol por defecto `demo`. Para entrar como administrador, escribe `admin`.
3. Haz clic en **Sign in with OIDC Provider**. Vault te redirige a Ironchip.
4. Autoriza el acceso con Ironchip. Vuelves a Vault con la sesión iniciada y las políticas del rol.
