136 lines
3.9 KiB
Bash
136 lines
3.9 KiB
Bash
#!/bin/bash
|
||
|
||
# =============================================================================
|
||
# Script de configuration Vault pour Cloudflare Tunnel
|
||
# =============================================================================
|
||
|
||
set -e
|
||
|
||
VAULT_ADDR="${VAULT_ADDR:-https://vault.tips-of-mine.com}"
|
||
VAULT_PATH="secret/cloudflare"
|
||
|
||
echo "🔐 Configuration Vault pour Cloudflare Tunnel"
|
||
echo "=============================================="
|
||
echo ""
|
||
echo "Vault Address: $VAULT_ADDR"
|
||
echo "Secret Path: $VAULT_PATH"
|
||
echo ""
|
||
|
||
# Vérifier que Vault CLI est installé
|
||
if ! command -v vault &> /dev/null; then
|
||
echo "❌ Erreur: vault CLI n'est pas installé"
|
||
echo " Installation: https://www.vaultproject.io/downloads"
|
||
exit 1
|
||
fi
|
||
|
||
# Vérifier la connexion à Vault
|
||
echo "🔍 Vérification de la connexion à Vault..."
|
||
if ! vault status &> /dev/null; then
|
||
echo "❌ Impossible de se connecter à Vault"
|
||
echo " Assurez-vous que VAULT_ADDR et VAULT_TOKEN sont définis"
|
||
exit 1
|
||
fi
|
||
|
||
echo "✅ Connecté à Vault"
|
||
echo ""
|
||
|
||
# Fonction pour demander une valeur
|
||
ask_value() {
|
||
local var_name=$1
|
||
local prompt=$2
|
||
local is_secret=${3:-false}
|
||
|
||
if [ "$is_secret" = true ]; then
|
||
read -s -p "$prompt: " value
|
||
echo ""
|
||
else
|
||
read -p "$prompt: " value
|
||
fi
|
||
|
||
echo "$value"
|
||
}
|
||
|
||
# Mode interactif ou non
|
||
if [ "$1" = "--interactive" ] || [ "$1" = "-i" ]; then
|
||
echo "📝 Mode interactif - Entrez vos informations Cloudflare"
|
||
echo ""
|
||
|
||
API_TOKEN=$(ask_value "API_TOKEN" "Cloudflare API Token" true)
|
||
ZONE_ID=$(ask_value "ZONE_ID" "Zone ID")
|
||
ACCOUNT_ID=$(ask_value "ACCOUNT_ID" "Account ID")
|
||
EMAIL=$(ask_value "EMAIL" "Email")
|
||
|
||
echo ""
|
||
echo "💾 Sauvegarde des secrets dans Vault..."
|
||
|
||
vault kv put "$VAULT_PATH" \
|
||
api_token="$API_TOKEN" \
|
||
zone_id="$ZONE_ID" \
|
||
account_id="$ACCOUNT_ID" \
|
||
email="$EMAIL"
|
||
|
||
echo "✅ Secrets sauvegardés avec succès!"
|
||
|
||
else
|
||
echo "ℹ️ Usage:"
|
||
echo " $0 --interactive # Mode interactif"
|
||
echo " $0 --verify # Vérifier les secrets"
|
||
echo " $0 --create-policy # Créer la policy Terraform"
|
||
echo ""
|
||
|
||
if [ "$1" = "--verify" ] || [ "$1" = "-v" ]; then
|
||
echo "🔍 Vérification des secrets..."
|
||
echo ""
|
||
|
||
if vault kv get "$VAULT_PATH" &> /dev/null; then
|
||
echo "✅ Les secrets existent dans Vault"
|
||
echo ""
|
||
echo "Clés présentes:"
|
||
vault kv get -format=json "$VAULT_PATH" | jq -r '.data.data | keys[]' | sed 's/^/ - /'
|
||
else
|
||
echo "❌ Aucun secret trouvé au chemin $VAULT_PATH"
|
||
echo " Exécutez: $0 --interactive"
|
||
fi
|
||
|
||
elif [ "$1" = "--create-policy" ] || [ "$1" = "-p" ]; then
|
||
echo "📋 Création de la policy Terraform..."
|
||
|
||
vault policy write terraform-cloudflare - <<EOF
|
||
# Policy pour Terraform - Accès lecture aux secrets Cloudflare
|
||
path "secret/data/cloudflare" {
|
||
capabilities = ["read"]
|
||
}
|
||
|
||
path "secret/metadata/cloudflare" {
|
||
capabilities = ["read"]
|
||
}
|
||
EOF
|
||
|
||
echo "✅ Policy 'terraform-cloudflare' créée"
|
||
echo ""
|
||
echo "🎫 Création d'un token pour Terraform..."
|
||
|
||
TOKEN_OUTPUT=$(vault token create \
|
||
-policy=terraform-cloudflare \
|
||
-ttl=8h \
|
||
-format=json)
|
||
|
||
TOKEN=$(echo "$TOKEN_OUTPUT" | jq -r '.auth.client_token')
|
||
|
||
echo "✅ Token créé avec succès!"
|
||
echo ""
|
||
echo "🔑 Token Vault (à utiliser dans la CI/CD):"
|
||
echo " $TOKEN"
|
||
echo ""
|
||
echo "⚠️ Sauvegardez ce token de manière sécurisée!"
|
||
echo " Il expire dans 8 heures"
|
||
echo ""
|
||
echo "💡 Pour l'utiliser dans Terraform:"
|
||
echo " export VAULT_TOKEN='$TOKEN'"
|
||
echo " export TF_VAR_vault_token='$TOKEN'"
|
||
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo "🎉 Configuration terminée!" |