Files
infrastructure/setup_vault_secrets.sh
2026-01-08 19:41:23 +00:00

120 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
# Pfad zur Bootstrap-Datei
BOOTSTRAP_VARS="terraform/bootstrap.tfvars"
VAULT_CA_LOCAL="./vault-ca.crt"
# Check if bootstrap vars exist
if [ ! -f "$BOOTSTRAP_VARS" ]; then
echo "Fehler: $BOOTSTRAP_VARS nicht gefunden."
echo "Bitte stelle sicher, dass du im Root des Repos bist und die Datei existiert."
exit 1
fi
# Check for Vault CA
if [ ! -f "$VAULT_CA_LOCAL" ]; then
echo "Lade CA Zertifikat vom Vault Server..."
scp -i ~/.ssh/id_ed25519_ansible_prod ansible@10.100.30.11:/opt/vault/certs/ca.crt "$VAULT_CA_LOCAL"
fi
# Get Root Token from user
read -sp "Bitte gib das Vault Root Token ein (aus init_keys.json): " VAULT_ROOT_TOKEN
echo ""
if [ -z "$VAULT_ROOT_TOKEN" ]; then
echo "Token darf nicht leer sein."
exit 1
fi
# Setup Vault Environment
export VAULT_ADDR='https://10.100.30.11:8200'
export VAULT_TOKEN="$VAULT_ROOT_TOKEN"
export VAULT_CACERT="$VAULT_CA_LOCAL"
echo "Prüfe Vault Status..."
vault status > /dev/null
echo "Aktiviere KV v2 Engine..."
vault secrets enable -path=secret kv-v2 || echo "Engine existiert bereits (ignoriere Fehler)."
# Helper function to extract var from tfvars (simple grep/cut, assumes standard formatting)
get_var() {
grep "^$1" "$BOOTSTRAP_VARS" | cut -d'=' -f2- | tr -d ' "' | sed 's/#.*//' | xargs
}
echo "Lese Secrets aus $BOOTSTRAP_VARS..."
PM_TOKEN_ID=$(get_var "proxmox_api_token_id")
PM_TOKEN_SECRET=$(get_var "proxmox_api_token_secret")
OPN_KEY=$(get_var "opnsense_api_key")
OPN_SECRET=$(get_var "opnsense_api_secret")
OPN_URI=$(get_var "opnsense_uri")
CI_USER=$(get_var "ci_user")
CI_PASS=$(get_var "ci_password")
SSH_KEY=$(get_var "ssh_public_key")
echo "Schreibe Secrets in Vault..."
vault kv put secret/infrastructure/proxmox \
api_token_id="$PM_TOKEN_ID" \
api_token_secret="$PM_TOKEN_SECRET"
vault kv put secret/infrastructure/opnsense \
api_key="$OPN_KEY" \
api_secret="$OPN_SECRET" \
uri="$OPN_URI"
vault kv put secret/infrastructure/vm-credentials \
ci_user="$CI_USER" \
ci_password="$CI_PASS" \
ssh_public_key="$SSH_KEY"
echo "✅ Alle Secrets erfolgreich importiert!"
# --- Cleanup & Switch to Production ---
echo ""
echo "----------------------------------------------------------------"
echo "PHASE 3: CLEANUP & PRODUCTION SWITCH"
echo "----------------------------------------------------------------"
echo "Vault ist nun befüllt. Wir können nun die lokalen Secrets löschen"
echo "und Terraform auf den Production-Mode umstellen."
echo ""
read -p "Möchtest du '$BOOTSTRAP_VARS' jetzt löschen? (y/n) " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm "$BOOTSTRAP_VARS"
echo "🗑️ '$BOOTSTRAP_VARS' wurde gelöscht."
echo " Hinweis: Die Variable 'use_vault' in Terraform defaults auf 'true',"
echo " daher ist keine weitere Dateiänderung nötig."
else
echo "⚠️ Datei wurde NICHT gelöscht. Bitte denke daran, sie manuell zu entfernen,"
echo " bevor du den Code ins Git pushst!"
fi
echo ""
echo "----------------------------------------------------------------"
echo "SECURITY: CLEANUP REMOTE KEYS"
echo "----------------------------------------------------------------"
echo "Auf dem Vault-Server liegt die Datei '/opt/vault/file/init_keys.json'."
echo "Diese enthält das Root-Token und die Unseal-Keys im Klartext."
echo "Für maximale Sicherheit sollte diese Datei gelöscht werden (Achtung: Auto-Unseal geht dann nicht mehr!)"
echo "oder zumindest das Root-Token daraus entfernt werden."
echo ""
read -p "Soll das Root-Token jetzt remote aus der Datei entfernt werden (empfohlen)? (y/n) " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
# Wir nutzen jq um das root_token Feld zu löschen und überschreiben die Datei
ssh -i ~/.ssh/id_ed25519_ansible_prod ansible@10.100.30.11 "sudo jq 'del(.root_token)' /opt/vault/file/init_keys.json | sudo tee /opt/vault/file/init_keys.json.safe > /dev/null && sudo mv /opt/vault/file/init_keys.json.safe /opt/vault/file/init_keys.json && sudo chmod 600 /opt/vault/file/init_keys.json"
if [ $? -eq 0 ]; then
echo "✅ Root-Token wurde aus der Remote-Datei entfernt."
echo " Die Unseal-Keys bleiben für den Auto-Unseal erhalten."
else
echo "❌ Fehler beim Bereinigen der Remote-Datei."
fi
fi
echo ""
echo "🎉 Setup abgeschlossen! Du bist jetzt im Production Mode."