# BreakPilot Secrets Management ## Uebersicht BreakPilot verwendet **HashiCorp Vault** als zentrales Secrets-Management-System. ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ SECRETS MANAGEMENT │ │ │ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ │ HashiCorp Vault │ │ │ │ Port 8200 │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │ │ │ │ │ KV v2 Engine │ │ AppRole Auth │ │ Audit Logging │ │ │ │ │ │ secret/ │ │ Token Auth │ │ Verschluesselung │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌─────────────────────┼─────────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Python Backend │ │ Go Services │ │ Frontend │ │ │ │ (hvac client) │ │ (vault-client) │ │ (via Backend) │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ ``` ## Warum Vault? | Alternative | Nachteil | |-------------|----------| | Environment Variables | Keine Audit-Logs, keine Verschluesselung, keine Rotation | | Docker Secrets | Nur fuer Docker Swarm, keine zentrale Verwaltung | | AWS Secrets Manager | Cloud Lock-in, Kosten | | Kubernetes Secrets | Keine Verschluesselung by default, nur K8s | | **HashiCorp Vault** | Open Source (BSL 1.1), Self-Hosted, Enterprise Features | ## Architektur ### Secret-Hierarchie ``` secret/breakpilot/ ├── api_keys/ │ ├── anthropic # Anthropic Claude API Key │ ├── vast # vast.ai GPU API Key │ ├── stripe # Stripe Payment Key │ ├── stripe_webhook │ └── tavily # Tavily Search API Key ├── database/ │ ├── postgres # username, password, url │ └── synapse # Matrix Synapse DB ├── auth/ │ ├── jwt # secret, refresh_secret │ └── keycloak # client_secret ├── communication/ │ ├── matrix # access_token, db_password │ └── jitsi # app_secret, jicofo, jvb passwords ├── storage/ │ └── minio # access_key, secret_key └── infra/ └── vast # api_key, instance_id, control_key ``` ### Python Integration ```python from secrets import get_secret # Einzelnes Secret abrufen api_key = get_secret("ANTHROPIC_API_KEY") # Mit Default-Wert debug = get_secret("DEBUG", default="false") # Als Pflicht-Secret db_url = get_secret("DATABASE_URL", required=True) ``` ### Fallback-Reihenfolge ``` 1. HashiCorp Vault (wenn VAULT_ADDR gesetzt) ↓ falls nicht verfuegbar 2. Environment Variables ↓ falls nicht gesetzt 3. Docker Secrets (/run/secrets/) ↓ falls nicht vorhanden 4. Default-Wert (wenn angegeben) ↓ sonst 5. SecretNotFoundError (wenn required=True) ``` ## Setup ### Entwicklung (Dev Mode) ```bash # Vault starten (Dev Mode - NICHT fuer Produktion!) docker-compose -f docker-compose.vault.yml up -d vault # Warten bis healthy docker-compose -f docker-compose.vault.yml up vault-init # Environment setzen export VAULT_ADDR=http://localhost:8200 export VAULT_TOKEN=breakpilot-dev-token ``` ### Secrets setzen ```bash # Anthropic API Key vault kv put secret/breakpilot/api_keys/anthropic value='sk-ant-api03-...' # vast.ai Credentials vault kv put secret/breakpilot/infra/vast \ api_key='xxx' \ instance_id='123' \ control_key='yyy' # Database vault kv put secret/breakpilot/database/postgres \ username='breakpilot' \ password='supersecret' \ url='postgres://breakpilot:supersecret@localhost:5432/breakpilot_db' ``` ### Secrets lesen ```bash # Liste aller Secrets vault kv list secret/breakpilot/ # Secret anzeigen vault kv get secret/breakpilot/api_keys/anthropic # Nur den Wert vault kv get -field=value secret/breakpilot/api_keys/anthropic ``` ## Produktion ### AppRole Authentication In Produktion verwenden Services AppRole statt Token-Auth: ```bash # 1. AppRole aktivieren (einmalig) vault auth enable approle # 2. Policy erstellen vault policy write breakpilot-backend - < VAULT_SECRET_ID= VAULT_SECRETS_PATH=breakpilot ``` ## Sicherheits-Checkliste ### Muss erfuellt sein - [ ] Keine echten Secrets in `.env` Dateien - [ ] `.env` in `.gitignore` - [ ] Vault im Sealed-State wenn nicht in Verwendung - [ ] TLS fuer Vault in Produktion - [ ] AppRole statt Token-Auth in Produktion - [ ] Audit-Logging aktiviert - [ ] Minimale Policies (Least Privilege) ### Sollte erfuellt sein - [ ] Automatische Secret-Rotation - [ ] Separate Vault-Instanz fuer Produktion - [ ] HSM-basiertes Auto-Unseal - [ ] Disaster Recovery Plan ## Dateien | Datei | Beschreibung | |-------|--------------| | `backend/secrets/__init__.py` | Secrets-Modul Exports | | `backend/secrets/vault_client.py` | Vault Client Implementation | | `docker-compose.vault.yml` | Vault Docker Configuration | | `vault/init-secrets.sh` | Entwicklungs-Secrets Initialisierung | | `vault/policies/` | Vault Policy Files | ## Fehlerbehebung ### Vault nicht erreichbar ```bash # Status pruefen vault status # Falls sealed vault operator unseal ``` ### Secret nicht gefunden ```bash # Pfad pruefen vault kv list secret/breakpilot/ # Cache leeren (Python) from secrets import get_secrets_manager get_secrets_manager().clear_cache() ``` ### Token abgelaufen ```bash # Neuen Token holen (AppRole) vault write auth/approle/login \ role_id=$VAULT_ROLE_ID \ secret_id=$VAULT_SECRET_ID ``` --- ## Referenzen - [HashiCorp Vault Documentation](https://developer.hashicorp.com/vault/docs) - [hvac Python Client](https://hvac.readthedocs.io/) - [Vault Best Practices](https://developer.hashicorp.com/vault/tutorials/recommended-patterns)