Soc Òscar Mas i en l'article anterior vam veure què és HashiCorp Vault, els seus avantatges i com pot ajudar a protegir informació sensible dins d'entorns DevOps i cloud. En aquesta segona part farem una instal·lació pràctica de Vault amb Docker i veurem una miqueta el funcionament de Vault: la configuració inicial del servei, els primers passos per començar a emmagatzemar i gestionar secrets de manera segura.
Tota la instal·lació de Vault s'ha fet en el mateix equip basat en debian, però realmetn el sistema operatiu no es important, ja que tot es basa en contendors docker.
Configuració inicial de HashiCorp Vault
El primer que necessitem és passar-li a Vault la configuració perquè guardi les dades de manera persistent en el sistema de fitxers local (/vault/file). Indicarli que el servei escolti pel port 8200 sense TLS (recorda que aixó es un lab) i habilitar la interfície gràfica d'usuari (UI). La directiva disable_mlock permet que el procés s'executi sense privilegis elevats de memòria, ideal per a entorns de proves o contenidors.
root@vault:~# apt-get update && apt-get install -y jq
root@vault:~# mkdir -p /etc/vault-server/{config,file}
root@vault:~# cat <<EOF >> /etc/vault-server/config/vault.json
{
"disable_mlock": true,
"backend": {
"file": {
"path": "/vault/file"
}
},
"listener": {
"tcp":{
"address": "0.0.0.0:8200",
"tls_disable": 1
}
},
"ui": true
}
EOF
Configuració de Nginx com a proxy invers
Un cop creat el fitxer de configuració de Vault, realitzarem la configuració d'un servei d'Nginx per posarlo davant com a proxy invers, per centralitzar l'accés a Vault a través del port estàndard HTTP (80), facilitant la connectivitat sense haver d'especificar el port 8200 manualment.
root@vault:~# mkdir -p /etc/nginx/conf.d/
root@vault:~# vim /etc/nginx/conf.d/default.conf
upstream vault {
server vault:8200 max_fails=3;
}
server {
listen *:80;
server_name _;
location /healthz {
stub_status;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://vault;
}
}
Desplegament dels contenidors amb Docker Compose
Un cop fetes les configuracions del Nginx i de Vault, ara només ens queda crear els contenidors perque agafin aquesta configuració:
root@vault:~# cat <<EOF >> /etc/docker-compose/docker-compose.yaml
services:
nginx:
container_name: 'nginx'
hostname: 'nginx'
image: 'nginx:1.25.3-alpine'
depends_on:
- 'vault'
ports:
- '80:80'
volumes:
- '/etc/localtime:/etc/localtime:ro'
- '/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf'
vault:
container_name: vault
hostname: vault
image: hashicorp/vault:1.17.5
restart: always
environment:
VAULT_ADDR: http://localhost:8200
ports:
- "8200:8200"
cap_add:
- 'IPC_LOCK'
volumes:
- /etc/vault-server/config/vault.json:/etc/vault-server/config/vault.json
- /etc/vault-server/file:/vault/file
- /etc/localtime:/etc/localtime:ro
command: "vault server -config=/etc/vault-server/config/vault.json"
EOF
Aixecarem els contenidors i verificarem que tot estigui correcte:
root@vault:~# docker-compose -f /etc/docker-compose/docker-compose.yaml up -d root@vault:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8581e800825 nginx:1.25.3-alpine "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx fcc757fc5331 hashicorp/vault:1.17.5 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:8200->8200/tcp, :::8200->8200/tcp vault
Inicialització de Vault i generació de claus Unseal
Un cop estigui tot aixecat, inicialitzarem el servidor de Vault, amb aixó el que aconseguirem es:
- Genera les claus (Unseal Keys) necessàries per obrir Vault. Recordeu que quan el contenidor de Vault s'engega, està xifrat i bloquejat (estat sealed). No hi pot entrar ningú i no es pot llegir cap secret. Per poder utilitzar-lo, s'ha de "desbloquejar" (estat unseal).
- Proporciona el Root Token. Un cop Vault està obert (estat unseal) , necessites una manera d'entrar-hi per començar a treballar. Aquest Root Token, et dona l'accés a Vault.
root@vault:~# docker exec -it vault vault operator init Unseal Key 1: +Y8HDolAfpm/hwrZ72flgrAfj8aH1QwvlP2vf/2UyjaS Unseal Key 2: 5id1ig/8u+bgN1HnPJQW8TQvyAT+o5vinTQ2/yUrvilA Unseal Key 3: dAMRqHsU491x4bizhrIarYkmeEyqDy42uYGWHPBdlFyZ Unseal Key 4: 0PI8LW7DzkUzxhoeOoYPEcSbbcSdTTufzt2iGMbF5Rdc Unseal Key 5: i6PknfSwlOFukzmNMKKKoSGDjgLp70qhnBt3efJEh0Fs Initial Root Token: hvs.xBV3t49lOCmaDrXrLQqN4AE6
Accés a Vault per GUI i CLI
A partir d'aquest punt, un cop tenim Vault inicialitzat i desbloquejat, disposem de dues vies principals per accedir-hi i gestionar els nostres secrets:
- Via interfície gràfica (GUI): Ideal per a una gestió visual i intuïtiva. S'hi accedeix directament des del navegador web, on podrem introduir el nostre Root Token per xafardejar i gestionar-ho tot còmodament.
Via línia de comandes (CLI): la cual existeixen dues alternatives:
- Des del nostre propi equip: Instal·lant el client local de Vault i connectant-nos-hi remotament configurant la variable d'entorn VAULT_ADDR.
- Des del propi contenidor de Docker: Executant les comandes directament des de dins de la màquina amb docker exec, sense necessitat d'instal·lar res al nostre ordinador.
Per poder executar comandes directament des de dins del contenidor de Vault, primer hem d'obrir-hi una terminal dintre del contenidor.
root@vault:~# docker exec -it vault sh
Heu de tenir en compta que a partir d'aquí totes les comandes es llencán dintre del contenidor.
Desbloquejar Vault amb les Unseal Keys
Per defecte, Vault s'ha inicialitzat amb un llindar de seguretat de 3 de 5: t'ha donat 5 claus, però només en necessites 3 de qualsevol d'elles per poder-lo obrir. Dins de la consola del contenidor, executa la comanda de desbloqueig tres cops i posarem qualsevol de les claus, sense repetir cap:
/ # vault operator unseal
/ # vault operator unseal
/ # vault operator unseal
Un cop posades les tres claus, validarem que Vault està desbloquejat (estat unseal)
/ # vault status | grep Sealed Sealed false
Ara que Vault està desbloquejat (estat unseal), necessites identificar-te com a administrador per poder començar a crear secrets. Per fer-ho, farem servir el Root Token que t'ha generat abans el sistema:
/ # vault login hvs.xBV3t49lOCmaDrXrLQqN4AE6
Si el token és correcte, rebràs un missatge de Success!. A partir d'aquest moment, ja tens el control absolut de Vault des de la línia de comandes del contenidor.
Crear i consultar secrets a Vault
Per defecte, Vault ve completament buit. La següent comanda activa un "motor de secrets" de tipus KV2 (explicat en el post anterior), que és per guardar parelles de dades (com per exemple usuaris i contrasenyes).
/ # vault secrets enable -description="Secrets" -version=2 -path=ansible kv
Una vegada tenim activat el "motor de secrets", ja podem començar a desar les nostres dades de forma segura:
/ # vault kv put ansible/myapp/config username='secret-username' password='secret-password'
Per consultar les dades que acabem de guardar, utilitzarem la comanda get. A més, hi afegirem el paràmetre -format=json, que ens retornarà la sortida en un format ideal:
/ # vault kv get -format=json ansible/myapp/config
...
"password": "secret-password",
"username": "secret-username"
...
Conclusió
Amb aquesta instal·lació ja disposem d'un entorn funcional de HashiCorp Vault preparat per començar a gestionar secrets de forma centralitzada i segura. Tot i tractar-se d'un entorn de laboratori, els conceptes d'inicialització, unseal, autenticació i emmagatzematge de secrets són els mateixos que trobarem en desplegaments de producció.
Espero que aquest article us hagi servit d'ajuda i si més no, us hagi estat útil per avançar en el mon de Vault.