147 lines
5.0 KiB
Bash
Executable File
147 lines
5.0 KiB
Bash
Executable File
#!/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 "⚠️ Warnung: $BOOTSTRAP_VARS nicht gefunden."
|
||
read -p "Soll eine neue leere Bootstrap-Datei erstellt werden? (y/n) " -n 1 -r
|
||
echo ""
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
cat > "$BOOTSTRAP_VARS" << EOF
|
||
# terraform/bootstrap.tfvars
|
||
use_vault = false
|
||
|
||
# Proxmox Credentials
|
||
proxmox_api_url = "https://10.100.0.2:8006/api2/json"
|
||
proxmox_api_token_id = "root@pam!terraform"
|
||
proxmox_api_token_secret = "CHANGE_ME"
|
||
|
||
# OPNsense Credentials
|
||
opnsense_uri = "https://10.100.0.1:4443"
|
||
opnsense_api_key = "CHANGE_ME"
|
||
opnsense_api_secret = "CHANGE_ME"
|
||
|
||
# VM User Config
|
||
ci_user = "ansible"
|
||
ci_password = "InitialPassword123!"
|
||
ssh_public_key = "ssh-ed25519 CHANGE_ME"
|
||
EOF
|
||
echo "✅ Datei erstellt. Bitte editiere '$BOOTSTRAP_VARS' und trage deine Secrets ein."
|
||
echo "Führe das Skript danach erneut aus."
|
||
exit 0
|
||
else
|
||
echo "Abbruch."
|
||
exit 1
|
||
fi
|
||
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."
|