Ответ
Безопасность в Kubernetes — это многоуровневая модель. Я выстраиваю её по принципу Defense in Depth.
1. Безопасность образов:
- Использую минималистичные базовые образы (Alpine, Distroless) для сокращения поверхности атаки.
- Интегрирую сканирование образов на уязвимости (Trivy, Grype) в CI/CD пайплайн. Образы с критическими CVE не попадают в registry.
- Подписываю образы с помощью Cosign и проверяю подписи на этапе деплоя через политики Kyverno или OPA Gatekeeper.
2. Безопасность рантайма (Pod Security):
- Применяю принцип наименьших привилегий через
securityContext. Стандартная практика:apiVersion: v1 kind: Pod metadata: name: secured-app spec: securityContext: runAsNonRoot: true runAsUser: 1000 seccompProfile: type: RuntimeDefault containers: - name: app image: myapp:latest securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] readOnlyRootFilesystem: true - Включаю Pod Security Admission (PSA) в кластере, применяя стандартные профили (
restricted,baseline).
3. Сетевая безопасность:
- Сегментирую трафик с помощью NetworkPolicies. По умолчанию запрещаю весь входящий и исходящий трафик, а затем разрешаю только необходимые соединения между компонентами (например, от фронтенда к бэкенду).
- Использую service mesh (например, Istio) для mTLS-шифрования трафика "сервис-сервис".
4. Управление секретами:
- Не храню секреты в манифестах или образах. Использую HashiCorp Vault с механизмом инжекции через CSI Driver или сторонние решения типа External Secrets Operator для синхронизации с облачными KMS (AWS Secrets Manager, GCP Secret Manager).
5. Аудит и соответствие:
- Включаю аудит Kubernetes API-сервера и отправляю логи в централизованную систему (Loki, Elasticsearch).
- Использую инструменты для проверки соответствия стандартам CIS Benchmarks (kube-bench, kube-hunter).
Ответ 18+ 🔞
А, безопасность в кубересе? Ну это, блядь, целая эпопея, ёпта. Тут нельзя просто так взять и натыкать подов — будет вам хиросима и нигерсраки. Я её выстраиваю, как крепость, слой за слоем. Принцип называется Defense in Depth, или, по-нашему, «чтоб даже самый хитрый пидарас шерстяной не пролез».
1. Образы — с них всё начинается.
- Беру образы самые тощие, голые. Alpine, Distroless — чтоб там нихуя лишнего не торчало, не за что зацепиться. Поверхность атаки, блядь, как у иголки.
- В пайплайн встроил сканеры (Trivy, Grype) — они каждый образ, как рентгеном, просвечивают. Найдёт критическую дыру — образ в registry даже не попадёт, сразу в помойку. Доверия ебать ноль ко всему, что из интернета приплыло.
- А ещё я образы подписываю, Cosign'ом. И когда кластер его тянет, политики (Kyverno или OPA Gatekeeper) проверяют: а твоя ли это подпись, или какой-то левый чувак свою мудю впихнул? Без подписи — не стартанёт. Всё, приехали.
2. А вот рантайм, где поды бегают. Тут вообще терпения ноль ебать.
Принцип наименьших привилегий — святое. В каждом манифесте securityContext прописываю, чтоб приложение не воображало себя рутом. Стандартный набор, который всех ставит на место:
apiVersion: v1
kind: Pod
metadata:
name: secured-app
spec:
securityContext:
runAsNonRoot: true # Не под рутом, ясно? И не спорь.
runAsUser: 1000 # Бегай под каким-нибудь безликим юзером.
seccompProfile:
type: RuntimeDefault # Системные вызовы под замком.
containers:
- name: app
image: myapp:latest
securityContext:
allowPrivilegeEscalation: false # Забудь про эскалацию.
capabilities:
drop: ["ALL"] # Все права отобрал, сиди тихо.
readOnlyRootFilesystem: true # Файловую систему не трогай.
- И по всему кластеру включаю Pod Security Admission (PSA). Вешаю профиль
restrictedна всё, что движется. Захочет какой-нибудь распиздяй под с рутом запустить — получит от ворот поворот.
3. Сеть. Тут вообще отдельная песня, ебать колотить.
- NetworkPolicies — моя любовь. По умолчанию ставлю политику: весь трафик запрещён. Абсолютно. Тишина в эфире. А потом уже, как царек, разрешаю только то, что нужно: вот этому фронтенду — стучаться на этот порт бэкенда. Всё. Больше ни-ни. Пусть гомосеки не летают туда-сюда.
- Для паранойи пожиже ставлю service mesh (типа Istio), чтобы весь трафик между сервисами шифровался по mTLS. Чтоб даже если кто в сети подсмотрит — видел только абракадабру.
4. Секреты. О, это святая святых.
- Хранить секреты в манифестах или, того хуже, в образах — это залупа ты конская. Я использую HashiCorp Vault, этакий неприступный сейф. А в поды секреты инжектятся на лету через CSI Driver. Или через External Secrets Operator, который их из облачного хранилища (AWS Secrets Manager) синхронизирует. В самом кубересе — только ссылка. Украсть нечего.
5. Аудит и проверки. Без этого — как без глаз.
- Включаю аудит API-сервера кубера и всё, что он шепчет, гоню в централизованные логи (в Loki, Elasticsearch). Кто, когда и к чему прикасался — всё записано. Подозрение ебать чувствую ко всем.
- Регулярно гоняю по кластеру сканеры (kube-bench, kube-hunter), которые проверяют его на соответствие CIS Benchmarks. Как будто комиссия из военкомата пришла: «А почему тут не по уставу? А это что за открытый порт?». Нашел недочёт — сразу исправляю. Чтобы кластер был не просто рабочий, а пизда рулю.
Вот так, примерно. Кажется, овердохуища действий? Зато спишь спокойно. Почти.