Každá moderní aplikace pracuje s tajemstvími — databázové přihlašovací údaje, API klíče, TLS certifikáty, šifrovací klíče, tokeny třetích stran. A přesto se stále setkáváme s firmami, které mají hesla natvrdo v kódu, .env soubory commitované do Gitu nebo sdílené přes Slack. V roce 2026 je tohle nejrychlejší cesta k bezpečnostnímu incidentu.
Secrets management není jen o tom „kam dát heslo”. Je to komplexní disciplína zahrnující bezpečné ukládání, distribuci, rotaci, audit a revokaci tajemství v celém životním cyklu aplikace. V tomto článku si projdeme, proč je to důležité, jaké nástroje použít a jak to celé implementovat v praxi.
Proč je secrets management kritický¶
Únik tajemství = otevřené dveře¶
Podle studie GitGuardian se v roce 2025 objevilo přes 12 milionů nových tajemství v public repozitářích na GitHubu. API klíče AWS, databázová hesla, privátní klíče — vše volně přístupné komukoli. A to jsou jen veřejné repozitáře. V privátních je situace často stejná.
Důsledky úniku tajemství: - Finanční ztráty — útočníci s AWS klíčem mohou za hodiny naminovat desítky tisíc dolarů na kryptoměnách - Data breach — databázové credentials vedou přímo k zákaznickým datům - Compliance porušení — GDPR, NIS2, DORA vyžadují ochranu přístupových údajů - Reputační škoda — veřejný únik tajemství signalizuje zralost bezpečnostní kultury
Kde firmy chybují¶
Typické anti-patterny, které vidíme u klientů:
- Hardcoded secrets v kódu —
DB_PASSWORD = "admin123"přímo ve zdrojáku .envsoubory v Gitu — i v privátním repu je to riziko (insider threat, compromised account)- Sdílená hesla přes chat — Slack, Teams, email — vše je logovatelné a prohledatelné
- Jedno heslo pro vše — stejné credentials pro dev, staging i produkci
- Žádná rotace — hesla nastavená před 3 lety, nikdy nezměněná
- Žádný audit — nikdo neví, kdo a kdy tajemství použil
Architektura secrets managementu¶
Než se pustíme do nástrojů, pojďme si definovat, co kvalitní secrets management systém musí umět:
Základní principy¶
Centralizované úložiště — tajemství žijí na jednom místě, ne rozházená po konfiguracích, CI/CD proměnných a poznámkách v Confluence.
Encryption at rest i in transit — tajemství jsou šifrovaná vždy, nejen při přenosu.
Přístup na principu least privilege — každá služba, uživatel nebo pipeline má přístup pouze k tajemstvím, která skutečně potřebuje.
Automatická rotace — klíče a hesla se pravidelně mění bez manuálního zásahu.
Audit trail — každý přístup k tajemství je logovaný — kdo, kdy, odkud.
Revokace — možnost okamžitě zneplatnit kompromitované tajemství.
Dynamic secrets — místo statických hesel generovat dočasné přihlašovací údaje s omezenou platností.
Vrstvy secrets managementu¶
┌─────────────────────────────────────────┐
│ Aplikace / Služby │
├─────────────────────────────────────────┤
│ Secret Injection Layer │
│ (sidecar, init container, SDK) │
├─────────────────────────────────────────┤
│ Secret Store Interface │
│ (CSI driver, External Secrets, API) │
├─────────────────────────────────────────┤
│ Secret Backend │
│ (Vault, AWS SM, Azure KV, GCP SM) │
├─────────────────────────────────────────┤
│ Encryption & Key Management │
│ (auto-unseal, KMS, HSM) │
└─────────────────────────────────────────┘
HashiCorp Vault — de facto standard¶
HashiCorp Vault je nejrozšířenější open-source řešení pro secrets management. A má k tomu dobré důvody.
Co Vault umí¶
Secret Engines — pluginové backendy pro různé typy tajemství:
- kv (key-value) — klasické ukládání tajemství
- database — dynamická generace databázových credentials
- pki — vlastní Certificate Authority pro TLS certifikáty
- aws / azure / gcp — dynamické cloud credentials
- transit — encryption as a service (šifrování bez odhalení klíče)
- ssh — signed SSH certifikáty místo statických klíčů
Auth Methods — jak se aplikace a uživatelé autentizují vůči Vaultu: - Kubernetes Service Account - OIDC / JWT - AppRole (pro CI/CD) - Cloud IAM (AWS, Azure, GCP) - LDAP / Active Directory - TLS certifikáty
Policies — granulární řízení přístupu:
# Politika pro platební službu
path "secret/data/payments/*" {
capabilities = ["read"]
}
path "database/creds/payments-readonly" {
capabilities = ["read"]
}
# Zakázat přístup k admin tajemstvím
path "secret/data/admin/*" {
capabilities = ["deny"]
}
Vault v Kubernetes — praktická implementace¶
V Kubernetes prostředí je Vault typicky nasazený jako StatefulSet s Raft storage backend (integrovaný consensus):
# Vault Helm values
server:
ha:
enabled: true
replicas: 3
raft:
enabled: true
setNodeId: true
resources:
requests:
memory: 256Mi
cpu: 250m
limits:
memory: 512Mi
cpu: 500m
auditStorage:
enabled: true
size: 10Gi
# Auto-unseal přes Azure Key Vault
seal:
azurekeyvault:
tenant_id: "xxx"
vault_name: "core-vault-unseal"
key_name: "vault-auto-unseal"
injector:
enabled: true
resources:
requests:
memory: 64Mi
cpu: 50m
Vault Agent Injector¶
Nejelegantnější způsob, jak dostat tajemství do podů v Kubernetes, je Vault Agent Injector. Funguje jako mutating webhook — automaticky přidá init container a sidecar, které stáhnou tajemství do souboru v podu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-service
spec:
template:
metadata:
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "payment-service"
vault.hashicorp.com/agent-inject-secret-db: "database/creds/payments-rw"
vault.hashicorp.com/agent-inject-template-db: |
{{- with secret "database/creds/payments-rw" -}}
postgresql://{{ .Data.username }}:{{ .Data.password }}@db.core.internal:5432/payments
{{- end }}
spec:
serviceAccountName: payment-service
containers:
- name: app
image: core/payment-service:latest
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: vault-db
key: connection_string
Krása tohoto přístupu: aplikace neví o Vaultu. Čte tajemství ze souboru nebo environment proměnné — Vault Agent se postará o autentizaci, stažení a automatický refresh při rotaci.
Dynamic Secrets — game changer¶
Statická hesla jsou jako klíče od bytu: jakmile je někdo okopíruje, má přístup navždy. Dynamic secrets tento problém eliminují.
Vault umí generovat databázové credentials on-the-fly s omezenou platností:
# Konfigurace database secret engine
vault write database/config/payments \
plugin_name=postgresql-database-plugin \
connection_url="postgresql://{{username}}:{{password}}@db:5432/payments" \
allowed_roles="payments-rw,payments-ro" \
username="vault-admin" \
password="super-secret-admin-password"
# Definice role s TTL 1 hodina
vault write database/roles/payments-rw \
db_name=payments \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT ALL ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
revocation_statements="REVOKE ALL ON ALL TABLES IN SCHEMA public FROM \"{{name}}\"; DROP ROLE IF EXISTS \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
Každý request na database/creds/payments-rw vygeneruje unikátní uživatelské jméno a heslo s platností 1 hodina. Po expiraci Vault credentials automaticky revokuje. Pokud dojde k úniku, credentials jsou platné maximálně hodinu — dramatické snížení blast radius.
Mozilla SOPS — šifrování pro GitOps¶
Ne každá organizace potřebuje (nebo chce) provozovat plnohodnotný Vault cluster. Pro menší týmy nebo jako doplněk k Vaultu existuje Mozilla SOPS (Secrets OPerationS).
Jak SOPS funguje¶
SOPS šifruje hodnoty v YAML, JSON nebo ENV souborech, zatímco klíče (keys) nechává čitelné. To umožňuje commitovat šifrované tajemství přímo do Gitu a přitom vidět strukturu konfigurace:
# Před šifrováním
database:
host: db.production.internal
port: 5432
username: app_user
password: SuperSecretPassword123
# Po šifrování SOPS
database:
host: db.production.internal # nešifrováno — není tajemství
port: 5432
username: ENC[AES256_GCM,data:kBqPdA==,iv:...,tag:...]
password: ENC[AES256_GCM,data:1xMfNZK3nQ==,iv:...,tag:...]
sops:
kms:
- arn: arn:aws:kms:eu-central-1:123456:key/abc-def
azure_kv:
- vaultUrl: https://core-sops.vault.azure.net
key: sops-key
version: abc123
lastmodified: "2026-02-16T10:30:00Z"
mac: ENC[AES256_GCM,data:...,tag:...]
SOPS v praxi¶
# Inicializace s Azure Key Vault
export SOPS_AZURE_KEYVAULT_URLS="https://core-sops.vault.azure.net/keys/sops-key/abc123"
# Šifrování souboru
sops --encrypt --azure-kv https://core-sops.vault.azure.net/keys/sops-key/abc123 \
secrets.yaml > secrets.enc.yaml
# Editace (dešifruje, otevře editor, znovu zašifruje)
sops secrets.enc.yaml
# Dešifrování pro deployment
sops --decrypt secrets.enc.yaml | kubectl apply -f -
SOPS + Flux/ArgoCD¶
Pro GitOps workflow je SOPS ideální. Argo CD i Flux mají nativní podporu:
# Flux Kustomization s SOPS dešifrováním
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: production-secrets
spec:
interval: 10m
path: ./clusters/production/secrets
prune: true
sourceRef:
kind: GitRepository
name: infrastructure
decryption:
provider: sops
secretRef:
name: sops-azure-credentials
External Secrets Operator — most mezi světy¶
External Secrets Operator (ESO) řeší častý problém: aplikace v Kubernetes očekávají klasické Secret objekty, ale tajemství žijí ve Vaultu, AWS Secrets Manager nebo Azure Key Vault. ESO vytváří a synchronizuje Kubernetes Secrets z externích zdrojů.
# Definice externího zdroje (ClusterSecretStore)
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: azure-keyvault
spec:
provider:
azurekv:
tenantId: "xxx"
vaultUrl: "https://core-production.vault.azure.net"
authSecretRef:
clientId:
name: azure-credentials
namespace: external-secrets
key: client-id
clientSecret:
name: azure-credentials
namespace: external-secrets
key: client-secret
---
# Synchronizace tajemství
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: payment-db-credentials
namespace: payments
spec:
refreshInterval: 5m
secretStoreRef:
kind: ClusterSecretStore
name: azure-keyvault
target:
name: payment-db-credentials
creationPolicy: Owner
data:
- secretKey: username
remoteRef:
key: payments-db-username
- secretKey: password
remoteRef:
key: payments-db-password
ESO pravidelně kontroluje externí zdroj a aktualizuje Kubernetes Secret. Pokud se heslo v Azure Key Vault změní, ESO ho do 5 minut propaguje do clusteru.
Secrets v CI/CD pipeline¶
CI/CD pipeline je kritický bod — potřebuje přístup k tajemstvím pro deployment, ale zároveň je to vysokorizikové prostředí (sdílené runnery, logy, artefakty).
Zásady pro CI/CD¶
- Nikdy nelogovat tajemství — maskování v logech nestačí, lepší je tajemství vůbec nevystavovat jako proměnné
- Krátkodobé tokeny — Vault AppRole s TTL 15 minut pro pipeline
- Izolace per-environment — staging pipeline nemá přístup k produkčním tajemstvím
- OIDC federace — GitHub Actions a GitLab CI podporují OIDC tokeny, které lze vyměnit za Vault/cloud credentials bez statických secrets
# GitHub Actions — OIDC autentizace vůči Vaultu
jobs:
deploy:
permissions:
id-token: write
contents: read
steps:
- name: Import secrets from Vault
uses: hashicorp/vault-action@v3
with:
url: https://vault.core.internal
method: jwt
role: github-deploy
jwtGithubAudience: https://vault.core.internal
secrets: |
secret/data/production/db password | DB_PASSWORD ;
secret/data/production/api key | API_KEY
- name: Deploy
run: |
helm upgrade --install app ./chart \
--set db.password=${{ steps.vault.outputs.DB_PASSWORD }}
Pre-commit hooks proti úniku¶
Prevence je lepší než detekce. Nástroje jako gitleaks, trufflehog nebo detect-secrets skenují commity před pushnutím:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
# Nebo standalone
gitleaks detect --source . --verbose
V CI/CD pipeline pak běží jako gate:
# GitLab CI
secret-scan:
stage: security
image: ghcr.io/gitleaks/gitleaks:latest
script:
- gitleaks detect --source . --report-format sarif --report-path gitleaks.sarif
artifacts:
reports:
sast: gitleaks.sarif
Rotace tajemství — automatizace je klíč¶
Manuální rotace hesel je odsouzená k selhání. Buď se neprovádí vůbec, nebo způsobí výpadky kvůli neaktualizovaným konfiguracím.
Strategie rotace¶
Vault dynamic secrets — nejelegantnější. Tajemství se negenerují dopředu, ale on-demand s omezenou platností. Rotace je implicitní.
Vault rotation policy — pro statická tajemství (API klíče třetích stran), kde Vault pravidelně zavolá rotační endpoint:
# Automatická rotace každých 30 dní
vault write sys/policies/password/rotation \
policy='length=32 rule "charset" { charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*" }'
Blue-green rotation — pro tajemství, která nelze rotovat atomicky: 1. Vytvořit nové tajemství (green) 2. Aktualizovat všechny konzumenty 3. Ověřit, že staré tajemství (blue) se nepoužívá 4. Revokovat staré tajemství
Monitoring a alerting¶
# Prometheus alert pro expirující tajemství
groups:
- name: secrets
rules:
- alert: SecretExpiringIn7Days
expr: vault_secret_lease_remaining_seconds < 604800
for: 1h
labels:
severity: warning
annotations:
summary: "Secret {{ $labels.path }} expires in less than 7 days"
- alert: SecretRotationFailed
expr: vault_secret_rotation_failures_total > 0
for: 5m
labels:
severity: critical
Cloud-native alternativy¶
Ne vždy je Vault správná volba. Pokud jste all-in na jednom cloudu, nativní služby mohou být jednodušší:
Azure Key Vault¶
// .NET aplikace s Azure Key Vault
var client = new SecretClient(
new Uri("https://core-production.vault.azure.net"),
new DefaultAzureCredential()
);
KeyVaultSecret secret = await client.GetSecretAsync("database-password");
string connectionString = $"Server=db.core.internal;Password={secret.Value}";
Výhody: nativní integrace s Azure AD, managed identity (žádné credentials pro přístup k credentials), automatická rotace přes Event Grid + Azure Functions.
AWS Secrets Manager¶
import boto3
client = boto3.client('secretsmanager', region_name='eu-central-1')
response = client.get_secret_value(SecretId='production/database')
secret = json.loads(response['SecretString'])
AWS nabízí built-in rotaci pro RDS, Redshift a DocumentDB — stačí zapnout a nastavit interval.
Porovnání¶
| Vlastnost | Vault | Azure KV | AWS SM | GCP SM |
|---|---|---|---|---|
| Multi-cloud | ✅ | ❌ | ❌ | ❌ |
| Dynamic secrets | ✅ | ❌ | ❌ | ❌ |
| PKI/CA | ✅ | ❌ | ❌ | ❌ |
| Encryption as Service | ✅ | ✅ | ✅ | ✅ |
| Automatická rotace | ✅ | ✅ | ✅ | ✅ |
| Provozní náklady | Vysoké | Nízké | Nízké | Nízké |
| Vendor lock-in | Ne | Ano | Ano | Ano |
| Open-source | Ano | Ne | Ne | Ne |
Naše doporučení: Vault pro multi-cloud a komplexní prostředí, cloud-native řešení pro single-cloud s jednoduchými potřebami.
Implementační checklist¶
Pokud začínáte se secrets managementem, postupujte podle tohoto plánu:
Fáze 1 — Audit (týden 1–2)¶
- [ ] Inventura všech tajemství (kód, CI/CD, konfigurace, dokumentace)
- [ ] Klasifikace podle citlivosti (critical, high, medium, low)
- [ ] Identifikace vlastníků tajemství
- [ ] Sken repozitářů pomocí gitleaks/trufflehog
Fáze 2 — Centralizace (týden 3–4)¶
- [ ] Nasazení Vaultu / konfigurace cloud-native řešení
- [ ] Migrace critical tajemství jako první
- [ ] Nastavení přístupových politik (least privilege)
- [ ] Zapnutí audit logů
Fáze 3 — Automatizace (týden 5–8)¶
- [ ] CI/CD integrace (OIDC, AppRole)
- [ ] Kubernetes integrace (ESO nebo Vault Injector)
- [ ] Automatická rotace pro databázové credentials
- [ ] Pre-commit hooks proti úniku
Fáze 4 — Monitoring (ongoing)¶
- [ ] Alerting na expirující tajemství
- [ ] Pravidelný audit přístupů
- [ ] Penetrační testování secrets managementu
- [ ] Quarterly review přístupových politik
Závěr¶
Secrets management není sexy téma — dokud se nestanou. Únik API klíče, databázového hesla nebo privátního certifikátu může mít fatální následky. Investice do správného řešení se vrátí mnohonásobně.
Klíčové takeaways: - Centralizujte — jedno místo pro všechna tajemství - Automatizujte rotaci — manuální rotace nefunguje - Používejte dynamic secrets kde to jde — eliminují problém úniku - Skenujte kód — pre-commit hooks zachytí chyby dřív, než se dostanou do Gitu - Auditujte — logujte každý přístup, nastavte alerting
V CORE SYSTEMS implementujeme secrets management jako součást každého projektu. Bezpečnost není add-on — je to fundament. Pokud řešíte správu tajemství ve své organizaci, ozvěte se nám — rádi pomůžeme s architekturou i implementací.
Potřebujete pomoct se secrets managementem nebo celkovou bezpečnostní architekturou? Podívejte se na naše security služby nebo nás kontaktujte přímo.
Naše zkušenost: Secrets management pro bankovního klienta¶
Pro klienta z bankovního sektoru jsme implementovali kompletní secrets management řešení. Konkrétní výsledky:
- HashiCorp Vault + dynamické DB credentials + automatická rotace — end-to-end řešení pro správu tajemství
- 100 % secrets rotováno automaticky — žádný manuální zásah, včetně databázových přístupů a API klíčů
- Credential exposure window z 90 dnů na 1 hodinu — dynamické credentials s TTL a automatickým revoke
- SOC 2 audit prošel napoprvé — kompletní audit trail a policy enforcement
- Zero secrets v kódu — pre-commit hooks a CI skenování eliminovaly únik tajemství do repozitáře
Potřebujete pomoc s implementací?
Naši experti vám pomohou s návrhem, implementací i provozem. Od architektury po produkci.
Kontaktujte nás