Skip to main content

Déploiement du Vault

Déploiement HashiCorp Vault avec Podman Rootless

Architecture

  • Système : AlmaLinux (RHEL-based)
  • Container Engine : Podman (rootless)
  • Stockage : Raft (backend intégré HA)
  • Sécurité : SELinux activé
  • Reverse Proxy : Nginx avec Let's Encrypt

Déploiement - Guide Complet

1. Préparation des volumes

# Créer les volumes nommés (recommandé pour Podman rootless)
podman volume create vault_config
podman volume create vault_data

2. Créer le fichier de configuration Vault

# Créer vault.hcl
cat > $(podman volume mount vault_config)/vault.hcl << 'EOF'
disable_cache = true
disable_mlock = true
ui = true
max_lease_ttl = "2h"
default_lease_ttl = "20m"

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = true
}

storage "raft" {
  path    = "/vault/file"
  node_id = "vault-1"
}

api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
EOF

3. Démarrer le conteneur Vault

podman run -d \
  --name vault \
  -p 8200:8200 \
  -p 8201:8201 \
  --cap-add=IPC_LOCK \
  -v vault_config:/vault/config \
  -v vault_data:/vault/file \
  docker.io/hashicorp/vault server

Gnagnagna pourquoi tu n'utilises pas un fichier de docker-compose ? Y'a un seul conteneur et 180 characters ... pourquoi utiliser un fichier docker-compose pour ça vraiment...

4. Vérifier le démarrage

# Vérifier les logs
podman logs vault

# Vérifier le statut
podman ps

5. Initialiser Vault (webui ou dans le container)

# Initialiser avec 1 clé (configuration single-admin)
vault operator init -key-shares=1 -key-threshold=1

# ⚠️ IMPORTANT : Sauvegarder immédiatement dans un password manager :
# - Unseal Key (ex: abcd1234efgh5678...)
# - Initial Root Token (ex: s.xyz789abc123...)

6. Configuration de l'authentification AppRole

# Login avec le root token
vault login <ROOT_TOKEN>

# Activer AppRole
vault auth enable approle

# Créer la policy admin
vault policy write admin - << 'EOF'
path "*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
EOF

# Créer le rôle AppRole avec la policy admin
vault write auth/approle/role/admin \
  token_policies="admin" \
  token_ttl=1h \
  token_max_ttl=4h

7. Récupérer les credentials AppRole

# Récupérer le RoleID (permanent)
ROLE_ID=$(vault read -field=role_id auth/approle/role/admin/role-id)
echo "RoleID: $ROLE_ID"

# Générer un SecretID (temporaire, à regénérer)
SECRET_ID=$(vault write -f -field=secret_id auth/approle/role/admin/secret-id)
echo "SecretID: $SECRET_ID"

# Sauvegarder le RoleID
echo "$ROLE_ID" > ~/.vault-role-id

8. Login avec AppRole

# Login et récupération du token
vault write auth/approle/login \
  role_id="$ROLE_ID" \
  secret_id="$SECRET_ID"

# Ou directement exporter le token
export VAULT_TOKEN=$(vault write -field=token auth/approle/login \
  role_id="$ROLE_ID" \
  secret_id="$SECRET_ID")

9. Configuration Nginx (Reverse Proxy avec SSL)

# Créer le fichier de configuration Nginx
sudo nano /etc/nginx/conf.d/vault.conf
server {
    listen 80;
    server_name vault.sanjy.fr;
    
    # Redirection HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name vault.sanjy.fr;

    # Certificats SSL Let's Encrypt
    ssl_certificate /etc/letsencrypt/live/sanjy.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sanjy.fr/privkey.pem;

    # Configuration SSL moderne
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Headers de sécurité
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;

    # Proxy vers Vault
    location / {
        proxy_pass 127.0.0.1:8200;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket support (pour l'UI)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
# Tester la configuration Nginx
sudo nginx -t

# Recharger Nginx
sudo systemctl reload nginx

10. Expansion du certificat Let's Encrypt

# Ajouter le sous-domaine vault au certificat existant
sudo certbot certonly --nginx \
  -d sanjy.fr \
  -d www.sanjy.fr \
  -d vault.sanjy.fr \
  --expand

11. Gestion SELinux pour les certificats (si besoin)

# Restaurer le contexte SELinux correct
sudo restorecon -Rv /etc/letsencrypt

# Rendre la configuration permanente
sudo semanage fcontext -a -t httpd_sys_content_t "/etc/letsencrypt(/.*)?"
sudo restorecon -Rv /etc/letsencrypt

13. Service Systemd (optionnel - pour auto-start)

# Générer le fichier systemd
podman generate systemd --new --name vault > ~/.config/systemd/user/vault.service

# Activer au démarrage
systemctl --user enable vault.service
systemctl --user start vault.service

# Activer le linger (conteneur démarre même si user pas connecté)
sudo loginctl enable-linger $USER


Ressources