Hashicorp Vault PKI Secret Engine


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

Références