Scenario: Authentification sécurisée sur une machine virtuelle

Authentification sécurisée

Pour réaliser une authentification sécurisée sur des machines virtuelles, il est nécessaire de mettre en place des mesures de sécurité pour protéger les informations d’identification des utilisateurs et les ressources du système.

Contexte Machine Virtuelle

Si nous voulons accéder à des machines virtuelles à distance. Dans notre cas, il faudra déja se connecter à un VPN pour accéder à notre réseau local. Ensuite, il pourra se connecter à une machine virtuelle, il faudra utiliser un protocole sécurisé comme SSH pour Linux ou RDP pour Windows.

Mise en place

Pour l’authentification sécurisée, nous avons décidé d’utiliser la methode PKI (Public Key Infrastructure) pour sécuriser les connexions SSH et RDP. Le PKI se situerait sur le cluster Kubernetes, il permettra de générer des certificats pour les utilisateurs et les machines. Il sera héberger sous kubernetes car c’est un service qui doit être disponible en permanence. Et la solution de PKI que nous avons choisi est Vault de HashiCorp.

Comment cette chaine fonctionnerait, il faudrait d’abord s’authentifier par exemple via un OIDC (OpenID Connect) pour se connecter à Vault. Ensuite, Vault générera un certificat pour l’utilisateur ou la machine qui veut se connecter à une machine virtuelle. Ce certificat sera utilisé pour s’authentifier à la machine virtuelle. Et sur la machine de destination, il faudra configurer le service SSH ou RDP pour accepter les connexions avec des certificats venant de vault.

Configuration

Création d’un certificat

Il faut d’abord créer un certificat d’autorité de certification (CA) pour Vault. Ce certificat sera utilisé pour signer les certificats des utilisateurs et des machines.

vault secrets enable -path=ssh-user-ca ssh
vault write ssh-user-ca/config/ca generate_signing_key=true

Il sera possible de retrouver le certificat

vault read -field=public_key ssh-user-ca/config/ca

Création d’un rôle pour signer

Qu’est-ce qu’un rôle ? Un rôle est une configuration qui permet de définir les politiques d’accès et les paramètres.

Pour écrire un role dans vault, il suffit de faire la commande suivante:

vault write ssh-user-ca/roles/ssh-admin - <<"EOH"
{
  "algorithm_signer": "rsa-sha2-256",
  "allow_user_certificates": true,
  "allowed_users": "admin",
  "default_extensions": {
    "permit-pty": ""
  },
  "key_type": "ca",
  "max_ttl": "12h",
  "ttl": "12h"
}
EOH

Ce role permettra de signer les certificats des utilisateurs qui ont le droit d’administrer les machines virtuelles.

Il va falloir signer le certificat de l’utilisateur avec le role créé.

vault write -field=signed_key ssh-user-ca/sign/ssh-test
public_key=@$HOME/.ssh/id_rsa.pub valid_principals="admin" >admin.cert

Ensuite il faut rajouter le certificats dans la machine de destination pour pouvoir se connecter. Il va falloir rajouter cette ligne dans la configuration de sshd_config

TrustedUserCAKeys /etc/ssh/ssh_ca.pub

puis importer le certificat dans le fichier /etc/ssh/ssh_ca.pub

vault read -field=public_key ssh-user-ca/config/ca >/etc/ssh/ssh_ca.pub

Et redémarrer le service sshd

systemctl restart sshd

Procédure pour se connecter à une machine virtuelle

Si nous voulons nous connecter à une machine virtuelle, il faudra d’abord se connecter au VPN. Ensuite, il faudra s’authentifier via OIDC pour se connecter à Vault. Ensuite, il faudra générer un certificat pour se connecter à la machine virtuelle. Enfin, il faudra se connecter à la machine virtuelle avec le certificat généré.

Voici comment faire la demande à vault pour générer un certificat

vault write -field=signed_key ssh-user-ca/sign/ssh-admin > admin.cert

Puis se connecter à la machine virtuelle

ssh -i admin.cert admin@machine-virtuelle
Note

Nous avons pas pu réaliser à 100% ce scénario, car nous n’avons pas eu le temps de relier notre OIDC (Zitadel ) à notre active directory et de relier tout cela à Vault. Ce scénario est donc une proposition de ce qui aurait dû être réellement réalisé en entreprise.

Connexion à un service

Comment sécuriser l’authentification à un service comme une base de données ou un service web ? Notre solution serait d’utiliser un bastion. Un bastion est un serveur qui permet de sécuriser l’accès à des ressources internes. Il permet de contrôler les accès et de limiter les risques de sécurité. Pour se connecter à un service, l’utilisateur devra d’abord se connecter au bastion, puis il pourra accéder au service.

Note

La solution de bastion que nous aurions voulu mettre en place auraient été Teleport de Gravitational. C’est une solution open source qui permet de sécuriser l’accès à des ressources internes. Malheureusement, nous n’avons pas eu le temps de mettre en place cette solution.