Как обеспечивается безопасность при работе с контейнерами и Kubernetes?

Ответ

Безопасность в 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. Как будто комиссия из военкомата пришла: «А почему тут не по уставу? А это что за открытый порт?». Нашел недочёт — сразу исправляю. Чтобы кластер был не просто рабочий, а пизда рулю.

Вот так, примерно. Кажется, овердохуища действий? Зато спишь спокойно. Почти.