Vault Acme
1. Présentation
ACME (Automatic Certificate Management Environment) est un protocole standardisé qui automatise l'émission, le renouvellement et la révocation de certificats TLS/SSL. Développé par l'ISRG (Internet Security Research Group) pour Let's Encrypt, ACME permet d'obtenir des certificats gratuits et reconnus par tous les navigateurs web modernes.
Le protocole ACME fonctionne par validation de domaine via différentes méthodes :
- HTTP-01 : validation par fichier web accessible
- DNS-01 : validation par enregistrement DNS TXT
- TLS-ALPN-01 : validation par certificat temporaire
Notre implémentation utilise la méthode DNS-01 avec Cloudflare pour générer des certificats wildcard (*.domaine.com) et les stocker automatiquement dans Vault pour une distribution sécurisée dans l'infrastructure.
2. Avantages
- Certificats gratuits et automatiquement renouvelés
- Support des certificats wildcard
- Validation sans interruption de service
- Intégration native avec Vault
- Conformité aux standards de sécurité
3. Intégration Vault avec ACME
Vault peut être intégré avec ACME de plusieurs manières selon les besoins d'architecture :
3.1 Script externe avec stockage Vault
Notre implémentation actuelle utilise acme.sh en externe qui génère les certificats puis les stocke dans Vault via l'API KV v2. Cette approche offre :
- Flexibilité dans le choix du client ACME
- Contrôle granulaire du processus de génération
- Possibilité de personnaliser la logique métier
- Intégration avec des systèmes de monitoring externes
3.2 Vault PKI Secrets Engine avec ACME
Vault Enterprise propose un PKI Secrets Engine avec support ACME natif :
- Configuration directe d'un endpoint ACME dans Vault
- Gestion automatique du cycle de vie des certificats
- Intégration native avec les politiques Vault
- API RESTful pour la gestion des certificats
3.3 Vault Agent avec templates
Utilisation de Vault Agent pour automatiser la récupération et le déploiement :
- Templates automatiques pour les fichiers de certificats
- Rotation transparente des certificats
- Intégration avec les services système (systemd, etc.)
- Gestion des permissions et propriétaires de fichiers
3.4 Vault CSI Provider (Kubernetes)
Pour les environnements conteneurisés :
- Montage automatique des certificats comme volumes
- Synchronisation avec les Secrets Kubernetes
- Rotation automatique sans redémarrage des pods
- Intégration avec cert-manager pour l'orchestration
3.5 Webhook et automation
Mécanisme de webhook pour déclencher des actions :
- Notification automatique lors du renouvellement
- Déclenchement de redéploiements d'applications
- Intégration avec des systèmes de CI/CD
- Audit et logging centralisés
3. Vault avec ACME.sh
Ppur avoir testé des possibilités avec acme et vault, je me suis penché sur l'usage de acme.sh qui est une bibliothèque qui permet de générer des certificats avec des serveurs de certificats tel que Let's Encrypt. Pour mes besoins j'ai eu à développeur un script en Python permettant d'executer acmes.sh et d'enregistrer mes certificats dans Vault puis automatiser le renouvellement des certificats via crontab.
3.1. IAC - Ansible
Playbook pour créer un role pour générer un certificat et un utilisateur Vault
- name: Configure Vault PKI
hosts: ['vault-1']
become: true
user: supervisor
roles:
- role: vault/api
vars:
action: create.role
register: "vault_roles"
name: "certs_generator"
- role: vault/api
vars:
action: create.user
register: "vault_users"
name: "acme"
Playbook pour Installer le script générateur et d'automatisation des certificats - crontab
cronplan:
acme.sh:
minute: "0"
hour: "7"
# Playbook
- name: Install ACME
hosts: ['vault-1']
user: supervisor
roles:
- role: pki/acme
vars:
domain: "boxtocloud.app"
Playbook pour distribuer les certificats dans les autres machines
Les certificats en question seront utilisés par d'autres machines qui vont les cloner à chaque renouvellement via un script de clonage qui se met à l'écoute de changement en interrogeant Vault périodiquement.
# inventories/protobox/group_vars/traffic-plane/crontab.yml
cronplan:
clonekv:
minute: "0"
hour: "8"
- name: Automate boxtocloud.app clonage
hosts: ['traffic-plane']
user: supervisor
roles:
- role: vault/scripts
vars:
svc: "boxtocloud.app"
script: "clonekv"