Hashicorp Vault PKI Secret Engine
- Installer un client vault avec asdf
- Curl et le TLS sous Fedora
- PKI Secret Engine
- Créer une policy à associer au user gestionnaire
- Import d’un Root CA déjà existante
- Création d’un Intermediate CA
- Création d’un role et génération de certificat serveur
- Lister les certificats créés, afficher des détails ou le télécharger
- Révoquer un certificat
- Maintenance des issuers et des certificats
- Vérifier le CRL après la révocation
- Références
Installer un client vault avec asdf
asdf permet d’installer des outils tiers sur une version précise à l’aide d’un système de plugins.
exemple d’outils tiers : awscli, k0s, kubectl, terraform, trivy, vault, yq
exemple avec vault
asdf plugin list # list les plugin installés
asdf update # mise à jour de asdf
asdf plugin update --all # mise à jour de tous les plugins
asdf plugin-add vault
asdf list all vault
asdf install vault 1.16.3 # install une version spécifique
asdf global vault 1.16.3 # cette version sera dispo partout
#asdf local vault 1.16.3 # => version dispo que dans le répertoire courant
asdf current # list les versions actuelles
asdf plugin-update vault # mise à jour du plugin vault
Curl et le TLS sous Fedora
Afin de pouvoir faire des curl vers des machines interne dont le TLS a été signé par votre PKI, il faut déployer votre Root CA sur votre desktop afin que celui-ci puisse le truster.
sudo cp /mnt/secure/certificats/tls/ca.crt /etc/pki/ca-trust/source/anchors/dangconsulting-root-ca.crt
sudo update-ca-trust
PKI Secret Engine
Le PKI Secret Engine de Vault permet de gérer une PKI interne.
Il permet de :
- créer ou importer un Root CA
- créer un Intermediate CA
- appeler un role sur ce Intermediate CA afin de générer un certificat serveur
Mais avant tout, il faut disposer de certains droits afin de pouvoir gérer la pki, donc nous allons créer une policy à associer au user gestionnaire.
Créer une policy à associer au user gestionnaire
vault policy write pki - <<EOF
# Enable secrets engine
path "sys/mounts/*" {
capabilities = [ "create", "read", "update", "delete", "list" ]
}
# List enabled secrets engine
path "sys/mounts" {
capabilities = [ "read", "list" ]
}
# Work with pki secrets engine
path "pki*" {
capabilities = [ "create", "read", "update", "delete", "list", "sudo", "patch" ]
}
EOF
vault policy read pki
Import d’un Root CA déjà existante
vault secrets enable -path=pki_root pki
vault secrets tune -max-lease-ttl=87600h pki_root
vault write pki_root/config/urls issuing_certificates="https://vault.home/v1/pki_root/ca" crl_distribution_points="https://vault.home/v1/pki_root/crl"
vault write pki_root/config/crl auto_rebuild=false
vault write -format=json pki_root/config/ca pem_bundle="$(cat /mnt/secure/certificats/tls/ca.crt /mnt/secure/certificats/tls/ca.key)"
vault list pki_root/issuers/
Création d’un Intermediate CA
vault secrets enable -path=pki_intermediate pki
vault secrets tune -max-lease-ttl=43800h pki_intermediate
vault write pki_intermediate/config/urls issuing_certificates="https://vault.home/v1/pki_intermediate/ca" crl_distribution_points="https://vault.home/v1/pki_intermediate/crl"
vault write pki_intermediate/config/crl auto_rebuild=true
# create csr
vault write -format=json pki_intermediate/intermediate/generate/internal \
common_name="Intermediate CA" \
| jq -r '.data.csr' > pki_intermediate.csr
# create crt and sign it with root ca
vault write -format=json pki_root/root/sign-intermediate \
csr=@pki_intermediate.csr \
format=pem_bundle ttl="43800h" \
| jq -r '.data.certificate' > intermediate.cert.pem
# import the intermediate certificate
vault write pki_intermediate/intermediate/set-signed certificate=@intermediate.cert.pem
rm -f pki_intermediate.csr intermediate.cert.pem
vault list pki_intermediate/issuers/
Création d’un role et génération de certificat serveur
# create role (add no_store=true if you don't want to store all the issued certificates)
vault write pki_intermediate/roles/home allowed_domains=home allow_subdomains=true max_ttl=720h no_store=true
# generate a server certificate by calling the role
# output will contain : ca_chain, certificate, issuing_ca, private_key, private_key_type, serial_number
vault write pki_intermediate/issue/home common_name=toto.home ttl="5m" # available only during 5min
Lister les certificats créés, afficher des détails ou le télécharger
# return a list of serial_number
vault list pki_intermediate/certs
# get details on the certificate
vault read pki_intermediate/cert/<serial_number>
# download a certificate
vault read -field=certificate pki_intermediate/cert/<serial_number> > toto.home.crt
Révoquer un certificat
vault write pki_intermediate/revoke serial_number=<serial_number>
Maintenance des issuers et des certificats
# manually delete expired certificates, with low safety_buffer to make it happen quickly
vault write pki_intermediate/tidy tidy_cert_store=true tidy_revoked_certs=true safety_buffer="1m"
# activate the automatic tidy of expired certificates or issuers
vault write pki_intermediate/config/auto-tidy enabled=true tidy_expired_issuers=true tidy_revoked_cert_issuer_associations=true tidy_cert_store=true tidy_revoked_certs=true safety_buffer=10m
# status of tidy
vault read pki_intermediate/tidy-status
Vérifier le CRL après la révocation
# download the chain ca (intermediate + root concatened)
# curl https://vault.home/v1/pki_root/ca_chain > root.crt # to have only the root
curl https://vault.home/v1/pki_intermediate/ca_chain > chain-ca.pem
# download server certificate
vault list pki_intermediate/certs
vault read -field=certificate pki_intermediate/cert/<serial_number> > toto.home.crt
# manually update CRL
vault read pki_intermediate/crl/rotate
# check CRL
curl https://vault.home/v1/pki_intermediate/crl -o crl.der
openssl crl -in crl.der -text
openssl crl -inform DER -in crl.der -outform PEM -out crl.pem
openssl verify -crl_check_all -CRLfile crl.pem -CAfile chain-ca.pem toto.home.crt # => certificate revoked