Vault — алерт когда secret не ротировался дольше N дней
Compliance требует ротации DB-паролей каждые 90 дней. Vault static-creds-engine должен это делать сам, но кто-то поставил max_ttl=0 — secret лежит вечно. Аудитор найдёт первый.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/vault-rotation
# 0 6 * * * root /opt/vault-rotation.sh
export VAULT_ADDR=${VAULT_ADDR}
export VAULT_TOKEN=${VAULT_TOKEN}
PATHS=${PATHS:-database/static-creds/app1,database/static-creds/app2}
MAX_DAYS=${MAX_DAYS:-90}
NOW=$(date +%s)
STALE=""
IFS=',' read -ra LIST <<< "$PATHS"
for P in "${LIST[@]}"; do
TS=$(vault read -format=json "$P" 2>/dev/null \
| jq -r '.data.last_vault_rotation // ""')
[ -z "$TS" ] && continue
EPOCH=$(date -d "$TS" +%s 2>/dev/null || echo 0)
DAYS=$(( (NOW - EPOCH) / 86400 ))
if [ "$DAYS" -gt "$MAX_DAYS" ]; then
STALE="$STALE$P=${DAYS}d,"
fi
done
if [ -n "$STALE" ]; then
curl -fsS "$HEARTBEAT_URL" --data-urlencode "stale_secrets=$STALE"
exit 2
fi
echo "OK (all secrets rotated within ${MAX_DAYS}d)"
То же самое в Enterno.io
Заверните в Enterno heartbeat с retention 365 дней — у аудитора будет proof «мы знали и фиксили», а не «обнаружили в день audit».
Похожие рецепты
Сервисный VAULT_TOKEN скоро истекает (TTL не renew-ит, no-renewable=true). Сервис ходит в Vault — однажды получит 403 и потеряет доступ к секретам.
Кто-то сделал `vault secrets disable` (debug, или drift) — pipeline ходит за DB-creds и получает 404. Vault сам не уведомит — для него это «нормальный admin-action».
Compliance требует rotation k8s-secrets (DB-passwords, API-tokens) каждые 90 дней. Никто не делает auto-rotate, secrets живут с момента создания cluster-а. Аудитор найдёт первый.