HashiCorp Vault#
manent legge i segreti dal motore KV di Vault, versione 1 o 2, tramite l'API HTTP: chiavi SSH, credenziali cloud, token delle chat, password degli ITSM, la chiave HMAC dell'audit. Descrittori, configurazioni di ambiente e manent.yml contengono solo riferimenti come vault:secret/data/shop/prod#ssh_key; il worker li risolve al momento dell'uso e non salva mai il valore.
Cosa serve
Un server Vault (Community, Enterprise o HCP) · i permessi per creare una policy e un ruolo di autenticazione · il motore KV montato, secret/ (v2) negli esempi
1. Organizza i percorsi#
Una struttura per applicazione e ambiente fa lavorare insieme la policy di Vault e la descriptor_policy di manent:
secret/manent/… # credenziali di manent stesso: slack, servicenow, nexus, audit
secret/<applicazione>/<ambiente> # un segreto per ambiente, un campo per credenziale
vault kv put secret/shop/prod ssh_key=@deploy_key db_password='…'
vault kv put secret/manent/slack bot_token='xoxb-…' signing_secret='…'
2. Una policy in sola lettura per manent#
# KV v2: il percorso dell'API comprende data/
path "secret/data/shop/*" { capabilities = ["read"] }
path "secret/data/manent/*" { capabilities = ["read"] }
Concedi read solo su ciò che manent deve leggere. Con molte applicazioni usa un glob come secret/data/+/prod o una policy per team; a manent non servono mai list, create o update.
3. Scegli come si autentica manent#
vault auth enable kubernetes
vault write auth/kubernetes/config kubernetes_host=https://kubernetes.default.svc
vault write auth/kubernetes/role/manent \
bound_service_account_names=manent,manent-api bound_service_account_namespaces=manent \
token_policies=manent token_ttl=1h
secrets:
vault:
enabled: true
address: https://vault.example.com:8200
auth: kubernetes
kubernetes:
role: manent
# jwt_file: /var/run/secrets/kubernetes.io/serviceaccount/token # default
# mount: kubernetes # default
Il chart Helm crea due service account: manent per i worker e manent-api per l'API, che non raggiunge mai i target e quindi non riceve le identità cloud e i RoleBinding destinati ai worker. Entrambe leggono segreti da Vault, quindi il ruolo è legato a tutte e due.
vault auth enable approle
vault write auth/approle/role/manent token_policies=manent token_ttl=1h secret_id_ttl=720h
vault read -field=role_id auth/approle/role/manent/role-id
vault write -f -field=secret_id auth/approle/role/manent/secret-id > /etc/manent/vault-secret-id
chmod 600 /etc/manent/vault-secret-id; chown manent /etc/manent/vault-secret-id
Con approle e kubernetes manent esegue il login, tiene il token in memoria e lo rinnova all'80% del lease; se Vault lo rifiuta (revoca), rifà il login una volta. Altre opzioni: namespace (Vault Enterprise e HCP), ca_file per una CA privata, timeout (default 10s).
4. Usa i riferimenti#
secrets:
- name: deploy-key
ref: "vault:secret/data/shop/prod#ssh_key" # KV v2: data/ nel percorso
# - name: legacy
# ref: "vault:kv/shop/prod#password" # KV v1: senza data/
params:
ssh_key_secret: deploy-key
La stessa sintassi vale in manent.yml (bot_token_ref, password_ref, secret_ref, hmac_key_ref…). manent riconosce una risposta KV v2 e legge il campo da data.data; il campo deve essere una stringa (una chiave SSH o un certificato vanno bene come stringa su più righe).
Limita ciò che i descrittori possono riferire, così un'applicazione non può chiedere i segreti di un'altra:
5. Verifica#
Lo step secrets risolve ogni segreto dichiarato e ne riporta il numero (count), mai i valori. Un campo mancante, un percorso negato o un login fallito fanno fallire lo step con lo stato e il messaggio di Vault, per esempio un 403 con permission denied.
Rotazione#
I valori vengono letti a ogni uso, quindi ruotare un segreto in Vault ha effetto dalla lettura successiva, anche dentro un deploy in corso, senza riavvii né modifiche ai riferimenti. Per ruotare il secret_id di AppRole scrivine uno nuovo in secret_id_file: viene letto al login successivo.
Riferimento: Segreti e sorgenti degli artefatti.