Security

🚀 Kubernetes Security Best Practices

Kubernetes имеет много уровней защиты – от контейнеров до сети и RBAC. Разберем ключевые практики, которые помогут защитить кластер.


1️⃣ Аутентификация и Авторизация (RBAC)

Используй Role-Based Access Control (RBAC)

• Включаем минимальные привилегии (Principle of Least Privilege).

• Разделяем права на уровне namespace.

• Избегаем cluster-admin без необходимости.

📌 Пример RBAC-роли для чтения подов:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: read-only-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

📌 Применяем и назначаем:

kubectl apply -f role.yaml
kubectl create rolebinding read-only-binding --role=read-only-role --user=developer --namespace=default

🚨 Опасно:

Не использовать kubectl create clusterrolebinding cluster-admin --user=dev → это дает полный доступ ко всему кластеру!


2️⃣ Безопасность контейнеров (Pod Security & Policies)

Используй Pod Security Admission (PSA) или Pod Security Policies (PSP, устарело)

Ограничивай привилегии контейнеров (privileged: false)

Запрещай запуск от root (runAsNonRoot: true)

Ограничивай доступ к хосту (volume mounts, hostNetwork, hostPID, hostIPC)

📌 Пример Pod Security Admission (PSA) для restricted уровня:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  runAsUser:
    rule: MustRunAsNonRoot
  volumes:
    - "configMap"
    - "emptyDir"
    - "persistentVolumeClaim"

🚨 Опасно:

❌ Не запускать поды с securityContext.privileged: true (они могут получить доступ к ядру хоста).


3️⃣ Сетевые политики (Network Policies)

Запрещай межсервисные соединения по умолчанию

• Kubernetes по умолчанию не ограничивает сетевой трафик между подами.

Используй Network Policies для изоляции сервисов.

📌 Пример запрета входящего трафика ко всем подам в default namespace:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress

📌 Как разрешить доступ только для frontend → backend?

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend

🚨 Опасно:

Открытые сети между подами → любой скомпрометированный сервис может атаковать другие.


4️⃣ Контроль образов (Image Security)

Проверяй и подписывай Docker-образы

Используй cosign или Notary для подписи образов

Сканируй образы на уязвимости (Trivy, Clair, Anchore)

Запрещай запуск непроверенных образов (imagePullPolicy: Always)

📌 Как запретить запуск образов не из private-registry.com?

apiVersion: policy/v1
kind: PodSecurityPolicy
metadata:
  name: restrict-registries
spec:
  allowedImages:
  - "private-registry.com/*"

🚨 Опасно:

Запускать образы latest → невозможно контролировать версию и изменения.

Использовать образы с root правами → уязвимость для атак.


5️⃣ Безопасность Kubernetes API (Audit & Logging)

Логируй все изменения в API-сервере

Включи Audit Logging (audit-policy.yaml)

Используй Falco для обнаружения атак

📌 Пример политики аудита в Kubernetes:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
  resources:
  - group: ""
    resources: ["pods"]
  verbs: ["create", "delete", "patch"]

📌 Применение политики аудита:

kubectl apply -f audit-policy.yaml

🚨 Опасно:

Не логировать конфиденциальные данные (например, токены и секреты).

Не игнорировать аномальные логи (например, массовые попытки входа).


6️⃣ Секреты и шифрование

Используй безопасное хранилище для секретов

Kubernetes Secrets + Encryption at Rest

HashiCorp Vault / Sealed Secrets

📌 Как включить шифрование секретов в Kubernetes?

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <base64-encoded-key>

📌 Применение:

kubectl apply -f encryption.yaml

🚨 Опасно:

Хранить секреты в ConfigMap → они не зашифрованы!

Давать подам доступ к default ServiceAccount → это риск утечки токенов.


7️⃣ Обнаружение атак (Intrusion Detection & Runtime Security)

Используй инструменты для обнаружения аномалий

Falco – мониторинг событий в реальном времени

KubeArmor – блокировка подозрительных действий

Kubernetes Audit + SIEM (Elasticsearch, Splunk)

📌 Пример Falco-правила (запрет kubectl exec в продакшене):

- rule: Detect kubectl exec
  desc: Someone is trying to exec into a pod
  condition: spawned_process and proc.name = "kubectl" and proc.args contains "exec"
  output: "User %user.name (uid=%user.uid) executed 'kubectl exec'"
  priority: WARNING

🚨 Опасно:

Не использовать инструменты мониторинга безопасности → сложно обнаружить взлом.

Игнорировать runtime-security → атаки могут происходить уже после деплоя.


🎯 Итог

Категория Best Practice
RBAC (доступ) Минимальные привилегии, RoleBinding, избегать cluster-admin.
Pod Security runAsNonRoot, privileged: false, readOnlyRootFilesystem.
Сеть NetworkPolicy для изоляции сервисов.
Контейнеры imagePullPolicy: Always, проверка образов (Trivy, Notary).
API Security Включение Audit Logging и Falco.
Secrets Kubernetes Secrets + шифрование at rest.
Runtime Security Мониторинг событий (Falco, KubeArmor).