994просмотров
20.6%от подписчиков
19 марта 2026 г.
Score: 1.1K
«Прячем» секреты от cluster admin. Часть 2. Вчера я рассказал про постановку проблемы (где именно текут секреты — API Server и Runtime), почему etcd encryption и RBAC недостаточны, и про общий подход с Vault Agent Injector. Продолжаем тему секретов. 🟠Подмена процесса Это киллер-фича. Мы не прописываем переменные окружения в манифесте Deployment. Мы используем утилиту-враппер (например, vault-env) как ENTRYPOINT. 🟠Как это работает на уровне ядра: 🟠1. Стартует vault-env. Он лезет в Vault, забирает секреты и кладет их в свой массив environ.
🟠2. Далее он делает системный вызов execve("/app/binary", args, envp).
🟠3. Ядро Linux полностью заменяет образ процесса vault-env вашим приложением, но передает ему обогащеннй секретами стек окружения напрямую в память. ✅Итог: kubectl describe pod покажет чистый список переменных. Секреты не проходили через API-сервер, их нет в etcd, и они не светятся в логах. 🟠Помним: Аудит и «Правило четырех глаз». Допустим, админ - настойчивый. Он лезет в логи или пытается перехватить запросы. 🟠 Vault Audit Logs (External): Логи Vault должны уходить сразу в изолированный SIEM, к которому у админа куба нет доступа. Любая попытка пода (или того, кто им притворился) достать лишний секрет должна триггерить алерт.
🟠 Control Groups (Rule of two keys): Для самых критичных штук (например, ключи расшифровки БД) включаем в Vault control_groups. Даже если под попросит секрет, Vault его не отдаст, пока второй человек (Security Officer) не нажмет кнопку «Одобрить» у себя. Конечно это доступно только в enterprise версии и не подойдет для автоматической разблокировки, когда vault неожиданно перезапустится. Но тут уже отдельная история, как делать vault unseal, если все упало, включая падение кластера vault. 🟠Добиваем выживших: Hardening Чтобы kubectl exec превратился для админа в тыкву: 🟠1. Distroless/Scratch: Выкиньте из образа sh, ls и env. Нет бинарников - нет простого способа посмотреть окружение.
🟠2. Drop Capabilities: Сносите CAP_SYS_PTRACE через securityContext. Да и вообще все capabilties дропайте. Без этого даже root внутри контейнера не сможет легко сделать дамп памяти процесса или прочитать чужой /proc/[pid]/environ.
🟠3. Dynamic Credentials: Используйте динамические секреты Vault для БД. Пароль живет 5 секунд и умирает вместе с подом. Даже если админ его украл - через 5 секунд это просто мусор. ✅Итог:
Админ видит пустые конфиги, пустой env в манифестах и заблокированный ptrace. Любая его попытка пошпионить залетает в внешний аудит, который он не может почистить.