Skip to Content

HashiCorp Vault OTP: accés SSH d'un sol ús amb One-Time Password

7 de juliol de 2026 per
Ilimit Comunicacions S.L., Oscar Mas

Introducció a HashiCorp Vault OTP

Soc Òscar Mas i continuant amb les funcionalitats que ens pot donar HashiCorp Vault, ens trobem en una que no és molt coneguda, però quan sapigueu de la seva existència i funcionalitat, estic segur que us enamorarà. Aquesta funcionalitat es diu OTP (One-Time Password).

Què és HashiCorp Vault OTP?

Per entendre el sistema d'OTP (One-Time Password), ens hem de posar en situació. Imagineu que un extern, ha d'accedir per fer-ne una de determinada feina a un servidor de la nostra infraestructura, i un cop acabada la feina, no volem que pugui accedir mai més a aquest servidor. Això es podria fer copiant  la seva clau SSH pública al servidor i un cop acabada la feina, eliminar aquesta clau pública que hem guardat al servidor. Però això implica un risc molt alt: ens hem de recordar de treure la seva clau pública del servidor i encara que em jureu que la traureu, estic segur que si fem aquesta operació una sèrie de cops, al final us oblidareu de treure la clau SSH i es quedarà en aquell servidor de per vida. En aquest punt és on entra: OTP (One-Time Password).

Laboratori de HashiCorp Vault OTP

La funcionalitat d'OTP (One-Time Password), és molt senzilla: donar accés a un servidor només un cop. Perquè ho podeu veure millor, farem un laboratori, en el qual necessitarem dos equips:

  • vault (172.26.0.30): servidor de Vault
  • client-otp-vault (172.26.0.240): equip que farem servir de client

Confiruació de Vault

Activació del motor SSH OTP

El primer que farem, és entrar al contenidor de HashiCorp Vault, autenticar-se i activar el motor de secrets de SSH OTP:

root@vault:~# docker exec -it vault ash
/ # export VAULT_ADDR=http://127.0.0.1:8200
/ # vault login s.KaU83zJXYPXaZZCfFkgT8eJX
/ # vault secrets enable -path=otp_ssh -description="Motor SSH para contraseñas de un solo uso (OTP)" ssh

/ # vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_56ed61f9    per-token private secret storage
identity/     identity     identity_53938dc5     identity store
otp_ssh/      ssh          ssh_68e013df          Motor SSH para contraseñas de un solo uso (OTP)
sys/          system       system_6e42f7a1       system endpoints used for control, policy and debugging

Creació del rol OTP

Seguidament crearem una política de seguretat, en la qual definirem que qualsevol credencial generada serà d'un sol ús (otp), per a la xarxa interna de l'empresa (172.26.0.0/24) i que si l'usuari no especifica res, intentarà connectar-se com a username (default_user).

/ # vault write otp_ssh/roles/otp_key_role \
key_type=otp \
default_user=username \
cidr_list=172.26.0.0/24 \
allowed_users="*"

Generació de la contrasenya d'un sol ús

Ara el que necessitem és que l'usuari oscar.mas pugui accedir al servidor que té la IP: 172.26.0.240. El que farem és indicar-li a Vault aquestes dades i Vault ens tornarà la contrasenya (aacedcc6-5281-8eb1-869f-f0a5b66c4bab), recordeu d'anotar-la, ja que més endavant quan vulguem accedir al servidor i ens demani una contrasenya, li hem de posar aquesta.

/ # vault write otp_ssh/creds/otp_key_role ip=172.26.0.240 username=oscar.mas
Key                Value
---                -----
lease_id           otp_ssh/creds/otp_key_role/B5YaFNncHYiM4ujo15oAAddg
lease_duration     768h
lease_renewable    false
ip                 172.26.0.240
key                aacedcc6-5281-8eb1-869f-f0a5b66c4bab
key_type           otp
port               22
username           oscar.mas

Configuració del Client

En aquest punt, hem d'anar al nostre servidor que farà de client (client-otp-vault) i indicar-li que quan algú vulgui accedir per SSH, consulti al servidor de Vault. Això ho podem fer gràcies a: vault-ssh-helper. Si volem saber l'última versió de vault-ssh-helper, ho podeu fer en aquesta web: https://releases.hashicorp.com/vault-ssh-helper/

root@client-otp-vault:~# cd /tmp
root@client-otp-vault:/tmp# wget https://releases.hashicorp.com/vault-ssh-helper/0.2.4/vault-ssh-helper_0.2.4_linux_amd64.zip
root@client-otp-vault:/tmp# apt-get update && apt-get install -y unzip
root@client-otp-vault:/tmp# unzip vault-ssh-helper_0.2.4_linux_amd64.zip
root@client-otp-vault:/tmp# mv vault-ssh-helper /usr/local/bin/
root@client-otp-vault:/tmp# chmod +x /usr/local/bin/vault-ssh-helper

Configuració del servidor SSH

Ara hem de  modificar la configuració del dimoni de SSH del servidor destí per permetre que PAM faci la seva feina

root@client-otp-vault:~# vim /etc/ssh/sshd_config
# Habilita la autenticación por teclado interactivo (necesaria para PAM)
KbdInteractiveAuthentication yes
# Asegura que SSH use el sistema PAM del sistema operativo
UsePAM yes
# Deshabilita el login directo por contraseña estándar (opcional, por seguridad)
PasswordAuthentication no
root@client-otp-vault:~# systemctl restart ssh

Aquí és on se li diu al sistema que qualsevol persona que vulgui connectar-se, ha de consultar a Vault:

root@client-otp-vault:~# vim /etc/pam.d/vault-otp
# /etc/pam.d/vault-otp
auth [success=done default=ignore] pam_exec.so quiet expose_authtok /usr/local/bin/vault-ssh-helper -config=/etc/vault-ssh-helper.d/config.hcl -dev
root@client-otp-vault:~# vim /etc/pam.d/sshd
@include vault-otp
root@client-otp-vault:~# mkdir -p /etc/vault-ssh-helper.d
root@client-otp-vault:~# vim /etc/vault-ssh-helper.d/config.hcl
vault_addr = "http://172.26.0.30"
ssh_mount_point = "otp_ssh"
tls_skip_verify = true
allowed_roles = "*"

Amb tota aquesta configuració, quan l'usuari oscar.mas intenti fer un SSH al servidor, SSH passarà el control a PAM, PAM cridarà a vault-ssh-helper, i aquest comprovarà instantàniament si la contrasenya utilitzada és la OTP.

Verificació del funcionament

Però com sempre, hem de validar que tot funciona correctament:

root@client-otp-vault:/tmp# vault-ssh-helper -verify-only -config=/etc/vault-ssh-helper.d/config.hcl -dev
2026-06-20T12:13:55.886+0200 [WARN]  Dev mode is enabled!
2026-06-20T12:13:55.887+0200 [INFO]  using SSH mount point: otp_ssh
2026-06-20T12:13:55.887+0200 [INFO]  using namespace:
2026-06-20T12:13:55.893+0200 [INFO]  vault-ssh-helper verification successful!

Que no se'ns oblidi crear l'usuari al sistema

root@client-otp-vault:~# useradd -m -s /bin/bash oscar.mas

Ara l'únic que queda és iniciar sessió per SSH amb l'usuari indicat:

$ ssh oscar.mas@172.26.0.240

Recordeu que la contrasenya que hem de posar és la que ens ha donat Vault: aacedcc6-5281-8eb1-869f-f0a5b66c4bab i que aquesta contrasenya és d'un sol ús. Sí un cop feta servir, la contrasenya deixarà de funcionar. Això vol dir que si necessita fer un altre inici de sessió per qualsevol motiu, s'ha de tornar a generar un altre OTP:

/ # vault write otp_ssh/creds/otp_key_role ip=172.26.0.240 username=oscar.mas

Per validar que l'usuari ha pogut accedir al servidor i tot ha anat bé, podem veure els logs del SSH:

root@client-otp-vault:~# journalctl -u ssh -f
Jun 20 12:27:01 client-otp-vault sshd-session[1105]: Accepted keyboard-interactive/pam for oscar.mas from 172.26.0.218 port 57506 ssh2
Jun 20 12:27:01 client-otp-vault sshd-session[1105]: pam_unix(sshd:session): session opened for user oscar.mas(uid=1001) by oscar.mas(uid=0)

Conclusió 

HashiCorp Vault OTP és una funcionalitat molt útil quan necessitem concedir accessos temporals a servidors sense haver de gestionar claus SSH permanents. Mitjançant contrasenyes d'un sol ús i la integració amb PAM i "vault-ssh-helper", podem reduir considerablement el risc de deixar accessos oberts un cop finalitzades les tasques de manteniment.

Espero que us hagi agradat aquesta funcionalitat de Hashicorp Vault.