Aller au contenu principal

Openbao - OTP (One Time Password) SSH

1. Installation de Vault-SSH-Helper sur ses serveurs SSH​

  • https://github.com/hashicorp/vault-ssh-helper
  • Il est nécessaire d'installer vault-ssh-helper sur tous les serveurs SSH sur lesquels on veut se connecter avec un OTP : celui-ci va se connecter à OpenBao pour vérifier l'OTP fourni par l'utilisateur

1.1. Télécharger vault-ssh-helper​

$ wget https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_linux_amd64.zip

1.2. Installer vault-ssh-helper​

$ sudo unzip vault-ssh-helper_0.2.1_linux_amd64.zip -d /usr/local/bin
$ sudo chmod 0755 /usr/local/bin/vault-ssh-helper
$ sudo chown root:root /usr/local/bin/vault-ssh-helper

1.3. Configurer les permissions SELinux​

$ sudo chcon -t sshd_exec_t /usr/local/bin/vault-ssh-helper       
  • Autoriser sshd à se connecter au serveur OpenBao sur le port TCP/5200 (trivnet par défaut)
    • Créer le fichier vault-ssh-helper_policy.te
module vault-ssh-helper_policy 1.0;

require {
type ssh_port_t;
type sshd_t;
type trivnet1_port_t;
type var_log_t;
class file { create open };
class tcp_socket name_connect;
class capability2 block_suspend;
}

#============= sshd_t ==============
allow sshd_t self:capability2 block_suspend;
allow sshd_t ssh_port_t:tcp_socket name_connect;
allow sshd_t trivnet1_port_t:tcp_socket name_connect;
allow sshd_t var_log_t:file create;
allow sshd_t var_log_t:file open;
  • Compiler et installer le module SElinux
$ checkmodule -M -m -o vault-ssh-helperpolicy.mod vault-ssh-helper_policy.te
$ semodule_package -o vault-ssh-helper_policy.pp -m vault-ssh-helper_policy.mod
$ sudo semodule -i vault-ssh-helper_policy.pp

1.4. Configurer vault-ssh-helper​

  • Créer le répertoire /etc/vault-ssh-helper.d
$ sudo mkdir /etc/vault-ssh-helper.d
  • Créer le fichier /etc/vault-ssh-helper.d/config.hcl
vault_addr = "https://openbao1.home.lab:8200"
ssh_mount_point = "ssh"
tls_skip_verify = false
allowed_roles = "*"
allowed_cidr_list = "192.168.50.0/24"
  • Crée le répertoire /var/log/vault pour stocker les logs
$ sudo mkdir /var/log/vault

1.5. Configurer PAM​

  • Modifier le fichier /etc/pam.d/sshd (modifier la ligne auth optional selon sa distribution : ubuntu ou redhat)
#%PAM-1.0
#auth substack password-auth
#auth include postlogin
# vault-ssh-helper
auth requisite pam_exec.so quiet expose_authtok log=/var/log/vault-ssh.log /usr/local/bin/vault-ssh-helper -config=/etc/vault-ssh-helper.d/config.hcl
# ubuntu : uncomment this line
#auth optional pam_unix.so not_set_pass use_first_pass nodelay
# redhat : no_set_pass does not exist
# https://github.com/hashicorp/vault-ssh-helper/issues/67#issuecomment-1973364874
auth optinal pam_unix.so use_first_pass nodelay
account required pam_sepermit.so
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session optional pam_motd.so
session include password-auth
session include postlogin

1.6. Configurer le serveur OpenSSH​

  • Ajouter les lignes suivantes au fichier /etc/ssh/sshd_config.d/ssh-vault-helper.conf
# vault-ssh-helper
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication no

1.7. Redémarrer le serveur OpenSSH​

$ sudo restart sshd

2. Activation du Secret Engine SSH sur le serveur openbao​

$ bao secrets enable ssh
Success! Enabled the ssh secrets engine at: ssh/

3. Création d'un rôle, pour l'utilisateur demo​

$ bao write ssh/roles/otp_key_role \
key_type=otp \
default_user=demo \
cidr_list=192.168.50.0/24
Success! Data written to: ssh/roles/otp_key_role

4. Utilisation d'un OTP​

4.1. Créer un OTP​

  • Par exemple, générer un OTP pour le serveur 192.168.50.30 et l'utilisateur demo
$ bao write ssh/creds/otp_key_role ip=192.168.50.30
Key Value
--- -----
lease_id ssh/creds/otp_key_role/NstGLmWaIPsNhMfIhEVt81i4
lease_duration 768h
lease_renewable false
ip 192.168.50.30
key <OTP>
key_type otp
port 22
username demo

4.2. Se connecter en SSH avec OTP​

$ ssh demo@192.168.50.30
Password: <Entrer l'OTP>

4.3. Automatiser la création de l'OTP et la connexion SSH​

  • Installer le package sshpass
$ sudo yum install sshpass
  • Utiliser la commande suivante
$ bao ssh -role otp_key_role -mode otp -strict-host-key-checking=yes demo@192.168.50.30
failed to revoke key: Error making API request.

URL: PUT https://openbao1.home.lab:8200/v1/sys/leases/revoke
Code: 403. Errors:

* 1 error occurred:
* permission denied

5. Création d'une policy ssh_otp_policy​

5.1. Créer le fichier ssh_otp_policy.hcl​

# To list SSH secrets paths
path "ssh/*" {
capabilities = [ "list" ]
}
# To use the configured SSH secrets engine otp_key_role role
path "ssh/creds/otp_key_role" {
capabilities = ["create", "read", "update"]
}
# To revoke OTP lease
path "sys/leases/revoke" {
capabilities = ["update"]
}

5.2. Ajouter la policy ssh_otp_policy dans OpenBao​

$ bao policy write ssh_otp_policy ./ssh_otp_policy.hcl

5.3. Appliquer la policy ssh_otp_policy à l'utilisateur LDAP : tz​

$ bao write auth/ldap/users/tz policies=ssh_otp_policy

5.4. Tester la demande d'OTP pour l'utilisateur tz​

  • S'authentifier sur OpenBao et vérifier que la policy ssh_otp_policy est appliquée
$ bao login -method ldap username=tz
Password (will be hidden):
Success! You are now authenticated. The token information displayed below is
already stored in the token helper. You do NOT need to run "bao login" again.
Future OpenBao requests will automatically use this token.

Key Value
--- -----
token s.YYYYYYYYYYYYYYYYYYYYYY
token_accessor XXXXXXXXXXXXXXXXXXXXXXXX
token_duration 768h
token_renewable true
token_policies ["default" "ssh_otp_policy"]
identity_policies []
policies ["default" "ssh_otp_policy"]
token_meta_username tz
  • Se connecter en SSH avec un OTP
$ bao ssh -role otp_key_role -mode otp -strict-host-key-checking=yes demo@192.168.50.30

6. Ressources​