Modul 13 — Bezpečnost (DevSecOps)
62. Správa tajemství (secrets management — Vault a alternativy)
Proč hesla, API klíče a certifikáty nepatří do kódu ani do proměnných prostředí natvrdo, a jak je bezpečně ukládat a distribuovat pomocí HashiCorp Vault a podobných nástrojů.
Úvod a kontext
Každá netriviální aplikace potřebuje "tajemství" (secrets) — hesla
k databázi, API klíče třetích stran, privátní klíče pro TLS, tokeny
pro přístup do cloudu. Nejčastější chyba začátečníků je uložit tato
tajemství přímo do zdrojového kódu nebo do konfiguračních souborů,
které skončí v Gitu. Jakmile je tajemství jednou v historii Gitu, je
prakticky nevymazatelné a kdokoliv s přístupem k repozitáři (i bývalý
zaměstnanec, i útočník, který repozitář ukradl) ho má. Secrets
management je disciplína, jak tajemství ukládat, distribuovat
a rotovat bezpečně, odděleně od kódu.
Teorie
Proč proměnné prostředí nestačí samy o sobě
Běžný první krok je přesunout tajemství z kódu do proměnných
prostředí (DATABASE_PASSWORD=xyz). To je lepší než hardcoding, ale
má limity: proměnné prostředí se dají snadno vypsat (docker inspect,
/proc/<pid>/environ), nejsou verzované ani auditované (kdo a kdy
tajemství četl), a typicky se nerotují automaticky. Pro jednoduché
projekty to může stačit, ale pro produkční systém s víc službami je
potřeba robustnější řešení — centralizovaný secrets manager.
Co dělá secrets manager
Nástroj jako HashiCorp Vault, AWS Secrets Manager nebo Azure Key
Vault poskytuje:
- Centralizované šifrované úložiště — tajemství jsou uložená
šifrovaně na jednom místě, ne rozesetá po desítkách konfiguračních
souborů a proměnných prostředí. - Řízení přístupu (access control) — přesně definujete, která
aplikace nebo který uživatel smí přečíst které tajemství, podle
principu nejmenších oprávnění. - Audit log — každé čtení tajemství je zaznamenané: kdo, kdy,
jaké tajemství. Při podezření na únik víte přesně, co prověřit.
Souvisí s pozdější lekcí o compliance a auditu. - Dynamická tajemství — pokročilejší funkce: místo statického
hesla k databázi vygeneruje Vault dočasný účet s omezenou
platností (např. na hodinu) při každém požadavku. Pokud dočasné
heslo unikne, samo vyprší. - Rotace — automatická nebo snadná pravidelná výměna tajemství,
aniž by bylo nutné měnit kód nebo restartovat všechny služby ručně.
Architektura HashiCorp Vault
Vault běží jako server se šifrovaným úložištěm (tzv. storage backend
— může to být třeba Consul nebo integrované úložiště). Ve výchozím
stavu je zapečetěný (sealed) — data jsou zašifrovaná a nepřístupná,
dokud administrátor neprovede unseal (poskytne dostatek klíčových
fragmentů z tzv. Shamirova sdílení tajemství). Klienti (aplikace,
CI pipeline, lidé) se autentizují jednou z několika metod (token,
AppRole, integrace s Kubernetes ServiceAccount, LDAP) a na základě
politik (policies) dostanou přístup jen k těm cestám v úložišti,
které skutečně potřebují.
Alternativy a kdy je zvolit
- AWS Secrets Manager / Parameter Store — pokud jste už plně
v AWS ekosystému, integrace je jednodušší než nasazovat vlastní
Vault, ale jste vázáni na AWS. - Kubernetes Secrets — vestavěné do Kubernetes, ale ve výchozím
stavu jsou jen base64 zakódované (ne šifrované) vetcd— pro
produkci se často kombinují s Vaultem nebo šifrovánímetcdv klidu. - SOPS (Secrets OPerationS) — jednodušší nástroj pro šifrování
tajemství přímo v souborech uložených v Gitu (šifrovaný obsah je
bezpečné commitnout), vhodné pro menší týmy bez potřeby centrálního
serveru.
Vault je vhodná volba, pokud potřebujete centrální řešení napříč
více cloudy/on-premise, dynamická tajemství nebo pokročilé audit
požadavky; pro jednodušší jednocloudové projekty může stačit
nativní nástroj daného poskytovatele.
Praktický příklad
Základní práce s Vaultem přes CLI — uložení a přečtení statického
tajemství (KV verze 2 engine):
# Zapsání tajemství do cesty secret/aplikace/databaze
vault kv put secret/aplikace/databaze \
username=app_user \
password='S1lneHeslo!'
# Přečtení tajemství
vault kv get secret/aplikace/databaze
# Přečtení jen konkrétního pole, vhodné do skriptu
vault kv get -field=password secret/aplikace/databaze
Politika (policy), která povolí jen čtení tajemství aplikace, ne
zápis ani přístup jinam — ukázka principu nejmenších oprávnění:
# soubor: aplikace-policy.hcl
path "secret/data/aplikace/*" {
capabilities = ["read"]
}
vault policy write aplikace-only aplikace-policy.hcl
Injekce tajemství z Vaultu do Kubernetes Podu pomocí anotací Vault
Agent Injectoru — kontejner dostane tajemství jako soubor bez toho,
aby ho aplikace musela sama volat přes API:
apiVersion: v1
kind: Pod
metadata:
name: objednavky-app
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "objednavky-app"
vault.hashicorp.com/agent-inject-secret-db-creds: "secret/data/aplikace/databaze"
spec:
serviceAccountName: objednavky-app
containers:
- name: app
image: registry.interni/objednavky:1.4.0
Vault Agent sidecar kontejner se autentizuje pomocí Kubernetes
ServiceAccount tokenu, stáhne tajemství podle role objednavky-app
a uloží ho do souboru uvnitř Podu (typicky
/vault/secrets/db-creds) — aplikace tak nikdy neuvidí Vault token
přímo a tajemství se nikdy neobjeví v manifestu ani v proměnné
prostředí viditelné přes docker inspect.
Shrnutí
Tajemství nepatří do kódu ani natvrdo do proměnných prostředí —
patří do centralizovaného, šifrovaného a auditovaného úložiště.
Secrets manager jako Vault poskytuje řízení přístupu podle principu
nejmenších oprávnění, audit log a volitelně dynamická, časově
omezená tajemství místo statických hesel. Alternativy jako AWS
Secrets Manager nebo SOPS jsou vhodné pro jednodušší nebo
jednocloudové scénáře; Vault vyniká v komplexnějších, multi-cloud
nebo vysoce regulovaných prostředích.
Kontrolní otázky
- Proč je i uložení hesla do proměnné prostředí nedostatečné pro
produkční systém, přestože je to lepší než hardcoding do kódu? - Co znamená "dynamická tajemství" a jakou konkrétní bezpečnostní
výhodu přinášejí oproti statickému heslu? - Jak Vault Agent Injector v Kubernetes zajistí, že aplikace nikdy
neuvidí přímo Vault token ani API volání? - Mini cvičení: napište Vault policy, která povolí aplikaci pouze
čtení tajemství na cestěsecret/data/platby/*, ne zápis ani
přístup k jiným cestám.
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.