Du SSL dans un SI avec HashiCorp Vault en CLI

L’exploitation de certificats et du chiffrement des communications est devenue indispensable pour renforcer la sécurité de votre environnement et garantir un certain niveau de qualité de service. Bien que cela puisse sembler complexe au premier abord, des outils sont disponibles pour simplifier la configuration et le maintien. Dans cet article, je vous propose de découvrir et d’utiliser HashiCorp Vault en plusieurs points :

  • initialisation de Vault, récupération des tokens ;
  • création de l’autorité racine et de son rôle de signature ;
  • création de l’autorité intermédiaire puis de sa demande de signature ;
  • signature de l’autorité intermédiaire par l’autorité racine ;
  • création d’un certificat pour Vault et configuration de Vault pour que le service soit accessible en HTTPS ;
  • import de l’autorité intermédiaire dans toutes les machines du lab ;
  • profiter et créer les certificats pour les services via l’interface web.

Une chaîne d’autorité de certification est une hiérarchie reliant une CA racine autosignée à des CAs intermédiaires et des certificats finaux. Cette structure garantit l’authenticité des certificats utilisés pour sécuriser les communications entre services.

Si vous souhaitez revoir quelques principes sur les infrastructures et autorités de certification, je vous suggère la lecture de cet article :

Qu’est-ce qu’une infrastructure à clé publique (PKI infrastructure) et comment fonctionne-t-elle ? | OktaApprenez-en plus sur l’infrastructure à clé publique (PKI infrastructure) avec Okta et découvrez comment gérer le chiffrement à clé publique.OktaUpdated: 02/23/2025 - 5:26 Time to read: 6 minutes## Environnement et contexte d’utilisation Afin d’améliorer et d’affiner mon laboratoire, j’utilise mon serveur Proxmox pour créer des machines virtuelles selon mes besoins. De plus, pour maximiser l’automatisation, j’utiliserai OpenTofu pour créer la machine virtuelle (sous Arch Linux) avec un fichier de déploiement via Cloud-Init. Bien que l’interface web de Vault soit intuitive, cet article se concentre sur les commandes en ligne pour l’initialisation, la configuration HTTPS étant abordée ultérieurement.

Pour en savoir plus sur Vault, je vous suggère l’article de Quentin : https://une-tasse-de.cafe/blog/vault/ .

Vault sera utilisé dans mon lab pour générer des certificats pour tous les services, mais aussi pour être un stockage sécurisé de secrets pour Kubernetes.

Prérequis#

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une machine Linux (Arch Linux, Ubuntu, Debian, etc.) avec accès administrateur.
  • Le paquet jq installé pour traiter les sorties JSON (sudo pacman -S jq sur Arch Linux, sudo apt-get install jq sur Ubuntu/Debian).
  • Un gestionnaire de mots de passe ou un coffre sécurisé pour stocker les clés de descellement et le jeton racine.
  • Une connexion réseau stable pour accéder au serveur Vault.

Avertissement : La perte des clés de descellement ou du jeton racine rendra Vault inaccessible. Stockez-les dans plusieurs endroits sécurisés (par exemple, coffres physiques ou numériques distincts). Ces données étant sensibles, vous devez aussi former et désigner des personnes de confiance qui seront aptes à posséder des informations d’initialisation, d’administration et de dépannage.

Installation de Vault#

Téléchargez et installez Vault manuellement depuis le site officiel ou via le gestionnaire de paquets de votre distribution :

Pour Arch Linux :

sudo pacman -S vault

Pour Ubuntu/Debian :

sudo apt update && sudo apt install --no-install-recommends -y vault

Vérifiez l’installation :

vault --version

💡Accès administrateur : Assurez-vous d’avoir les permissions nécessaires pour exécuter les commandes.

Environnement configuré : Vault doit être démarré et descellé (unsealed). Utilisez vault operator init pour initialiser Vault et obtenir les clés de descellement (unseal keys) et le jeton racine (root token). Stockez ces clés en lieu sûr.## Initialisation et descellement de Vault Avant toute chose, initialisez Vault pour générer les clés de descellement et le jeton racine. Cette étape est cruciale pour sécuriser l’accès et vous sera nécessaire à chaque redémarrage de Vault ou du serveur qui l’héberge.

Configurez VAULT_ADDR pour pointer vers votre serveur Vault, par exemple : export VAULT_ADDR=http://127.0.0.1:8200 .

vault operator init -key-shares=5 -key-threshold=3
  • Explication : Crée cinq clés de descellement, dont trois sont nécessaires pour desceller Vault. Sauvegardez les clés affichées et le Initial Root Token dans un endroit sécurisé.
  • Fichiers à récupérer : Aucun fichier n’est généré, mais notez les clés et le jeton dans un gestionnaire de mots de passe ou un coffre sécurisé.

Descellez Vault avec trois des cinq clés :

vault operator unseal <key1>
vault operator unseal <key2>
vault operator unseal <key3>

Sur les cinq clés, vous devez en fournir trois, compte tenu des valeurs indiquées dans la ligne vault operator init précédemment.

Connectez-vous avec le jeton racine pour accéder à Vault en tant qu’administrateur :

vault login <root-token>

Activer le moteur de secrets PKI pour la CA racine#

Active le moteur PKI à l’emplacement rootca avec une durée de vie maximale des certificats de 10 ans (87 600 heures). Le chemin rootca sera utilisé pour les opérations liées à la CA racine :

vault secrets enable -path=rootca -description="PKI backend for Root CA" -max-lease-ttl=87600h pki

Configurer les URL et paramètres de la CA racine#

Lorsque vous gèrerez une autorité de certification (CA) racine, la configuration des URL et des paramètres est essentielle pour assurer la distribution correcte des certificats et des informations associées. Cela inclut la définition des URL pour les points de distribution des listes de révocation de certificats (CRL), les autorisations d’informations d’autorité et d’autres points d’accès essentiels. Ces URL permettent aux clients de vérifier la validité des certificats émis.

vault write rootca/config/urls \
  issuing_certificates="$VAULT_ADDR/v1/rootca/ca" \
  crl_distribution_points="$VAULT_ADDR/v1/rootca/crl" \
  ocsp_servers="$VAULT_ADDR/v1/rootca/ocsp"

Générer la CA racine#

Créez la clé et le certificat de l’autorité racine.

vault write -field=certificate rootca/root/generate/internal \
  common_name="GARAGE.HOMMET.NET Root CA" \
  issuer_name="VaultRootCAIssuer" \
  key_type="ec" \
  key_bits=256 \
  ttl=87600h \
  organization="HOMMET.NET" \
  country="FR" > rootca_cert.pem

Explication : Génère un certificat autosigné avec :

  • key_type=“ec” : Utilise une clé elliptique.
  • key_bits=256 : Taille de clé de 256 bits (courbe P-256).
  • issuer_name : Nom distinct pour l’émetteur.
  • organization, country : Métadonnées pour identifier l’organisation.
  • La clé privée reste dans Vault, et le certificat “root” est écrit dans le fichier “rootca_cert.pem”.

Activer le moteur PKI pour la CA intermédiaire#

Créez un moteur PKI distinct pour l’autorité intermédiaire.

vault secrets enable -path=interca -description="PKI backend for Intermediate CA" -max-lease-ttl=43800h pki
  • Explication : Active un moteur PKI à l’emplacement interca avec une durée de vie maximale de cinq ans (43 800 heures). Un moteur distinct est utilisé pour séparer les responsabilités des CA.

Configurer les URL et paramètres de la CA intermédiaire#

Définissez les URL et autres paramètres.

vault write interca/config/urls \
  issuing_certificates="$VAULT_ADDR/v1/interca/ca" \
  crl_distribution_points="$VAULT_ADDR/v1/interca/crl" \
  ocsp_servers="$VAULT_ADDR/v1/interca/ocsp"

Générer une CSR pour la CA intermédiaire#

Créez une demande de signature de certificat (CSR) pour la CA intermédiaire.

vault write -format=json interca/intermediate/generate/internal common_name="Intermediate CA" issuer_name="VaultIntermediateCAIssuer" ttl=43800h | jq -r .data.csr > interca.csr
  • Explication : Génère une CSR pour la CA intermédiaire avec un CN Intermediate CA et une validité de cinq ans. La sortie est extraite au format JSON et la CSR est sauvegardée dans interca.csr.
  • Fichiers à récupérer : Le fichier interca.csr est créé. Conservez-le pour l’étape suivante.

Signer la CSR avec la CA racine#

Utilisez la CA racine pour signer le CSR de la CA intermédiaire et générer son certificat.

vault write -format=json rootca/root/sign-intermediate csr=@interca.csr common_name="Intermediate CA" ttl=43800h | tee >(jq -r .data.certificate > interca.pem) >(jq -r .data.issuing_ca > interca_issuing_ca.pem)
  • Explication : Signe la CSR avec la CA racine, produisant un certificat pour la CA intermédiaire. Les fichiers interca.pem (certificat intermédiaire) et interca_issuing_ca.pem (certificat de la CA émettrice) sont générés.
  • Fichiers à récupérer : Sauvegardez interca.pem et interca_issuing_ca.pem. Le premier est le certificat intermédiaire, le second est utilisé pour la chaîne de confiance.

Importer le certificat intermédiaire#

Importez le certificat signé dans le moteur PKI de la CA intermédiaire.

vault write interca/intermediate/set-signed certificate=@interca.pem
  • Explication : Associe le certificat signé à la CA intermédiaire, permettant à interca de délivrer des certificats.

Créer un rôle de signature#

Créez un rôle pour permettre à la CA intermédiaire de générer des certificats.

vault write interca/roles/issuer-cert-server key_type=ec key_bits=256 max_ttl=8760h allowed_domains=garage.hommet.net allow_subdomains=true
  • Explication : Définit un rôle nommé issuer-cert-server qui permet de générer des certificats avec des clés à courbe elliptique de 256 bits, une validité maximale d’un an (8 760 heures) pour le domaine “garage.hommet.net”, avec la possibilité de signer d’autres sous-domaines sous “garage.hommet.net”.

Générer un certificat avec le rôle#

Testez le rôle en générant un certificat pour un serveur.

vault write -format=json interca/issue/issuer-cert-server \
  common_name="vault.dc.garage.hommet.net" \
  ttl="360d" \
  ip_sans="192.168.1.33" \
  format="pem_bundle" > vault_cert.json

jq -r '.data.private_key' vault_cert.json > vault.key
jq -r '.data.certificate' vault_cert.json > vault.crt
jq -r '.data.issuing_ca' vault_cert.json > ca-chain.crt
  • Explication : Utilise le rôle issuer-cert-server pour délivrer un certificat avec le CN vault.dc.garage.hommet.net et une validité d’un an (360 jours). La sortie inclut le certificat, la clé privée et la chaîne de certification.
  • Le fichier .JSON comporte les informations nécessaires pour le service Vault, à savoir le certificat et sa clé privée, et la chaîne de certification.

Faire confiance à la CA racine#

Pour que les certificats soient reconnus, ajoutez les certificats racine et intermédiaire à la liste des autorités de confiance de votre système.

Sous Debian ou Ubuntu :

sudo cp rootca.pem /usr/local/share/ca-certificates/
sudo cp interca.pem /usr/local/share/ca-certificates/
sudo update-ca-certificates

Pour les navigateurs, importez manuellement les fichiers rootca.pem et interca.pem dans les paramètres de certificats.

Sous Arch Linux :

cp rootca.pem /etc/ca-certificates/trust/anchors/rootca.crt
trust anchor /etc/ca-certificates/trust/anchors/rootca.crt

cp interca.pem /etc/ca-certificates/trust/anchors/intca.crt
trust anchor /etc/ca-certificates/trust/anchors/intca.crt

Audit : Activez les journaux d’audit pour suivre les accès#

sudo touch /var/log/vault_audit.log
sudo chown vault:vault /var/log/vault_audit.log
sudo chmod 640 /var/log/vault_audit.log
vault audit enable file file_path=/var/log/vault_audit.log

Politiques d’accès : Créez des politiques Vault pour restreindre l’accès aux moteurs PKI. Exemple :

vault policy write pki-access - <<EOF
path "rootca/*" { capabilities = ["read"] }
path "interca/*" { capabilities = ["read", "create", "update"] }
EOF

Conclusion#

En suivant ces étapes, vous avez configuré une PKI complète avec Vault, comprenant une CA racine, une CA intermédiaire et un rôle de signature. Les certificats générés peuvent être utilisés pour sécuriser des communications (par exemple, TLS pour un serveur web). Assurez-vous de gérer les fichiers (rootca.pem, interca.pem, server_cert.pem, server_key.pem) avec soin et de mettre en place des politiques de sécurité robustes pour protéger votre infrastructure.

Pour plus d’informations, consultez la documentation officielle de Vault .

Bonnes pratiques :

  • Sauvegardez régulièrement les fichiers rootca.pem, interca.pem, vault.crt, et vault.key dans un emplacement sécurisé.
  • Surveillez les journaux d’audit pour détecter tout accès non autorisé.
  • Envisagez la rotation périodique des certificats pour renforcer la sécurité.

Sources#

PKI - Secrets Engines: Quick Start: Root CA Setup | Vault | HashiCorp DeveloperThe PKI secrets engine for Vault generates TLS certificates.PKI - Secrets Engines: Quick Start: Root CA Setup | Vault | HashiCorp DeveloperPKI - Secrets Engines: Quick Start: Intermediate CA Setup | Vault | HashiCorp DeveloperThe PKI secrets engine for Vault generates TLS certificates.PKI - Secrets Engines: Quick Start: Intermediate CA Setup | Vault | HashiCorp Developer

Julien HOMMET
9 minutes
1781 mots
blog