Kubernetes стал стандартом для оркестрации контейнерных приложений в современных облачных средах. Однако его сложная архитектура, включающая множество компонентов (API-сервер, etcd, kubelet, контроллеры, сетевая подсистема), создает обширную поверхность для потенциальных атак. По статистике RedHat, 94% организаций, использующих Kubernetes, сталкивались с инцидентами безопасности в своих кластерах.

На конференции Positive Hack Days 2025 мы выступили с докладом на эту тему. Посмотреть его запись можно здесь.

А в этой статье мы подробно разберем, как подготовить полноценный лабораторный стенд на Ubuntu 22.04 для:

  • изучения типовых атак на кластер Kubernetes;
  • отработки навыков обнаружения и реагирования на инциденты;
  • тестирования инструментов мониторинга Falco и Kubernetes Audit.

Особое внимание мы уделим развертыванию специально подготовленного нами уязвимого кластера Kubernetes Miracle — учебной среды, которую мы разработали, чтобы эмулировать реальные сценарии атак в Kubernetes. Она включает в себя следующие возможные сценарии:

Этап атаки

Сценарий

Описание

Initial Access

RCE в WordPress

Использование CVE-2019-9978 для удаленого выполнения команд

Credential Access

Доступ к Service Account

Получение токена доступа из контейнера

Discovery

Доступ к API server

Сканирование ресурсов и namespace

Execution

Exec в контейнер

Выполнение команды в pod с MySQL

Collection

Извлечение образов

Доступ к приватному registry (nginx)

Persistence

Backdoor-контейнер

Подмена образа nginx в приватном реестре

Persistence

Static pod

Размещение манифеста в /etc/kubernetes/manifests

Privilege Escalation

Привилегированный pod-доступ

hostPID + privileged

Pod Escape

Побег из контейнера

Получение доступа к хосту из пода

1. Установка и подготовка лабораторного кластера Kubernetes

Приводим подробную инструкцию по установке кластера на сервере Ubuntu 22.04.

1.1. Обновление системы

	
sudo apt update && sudo apt upgrade -y
	

1.2. Отключение SWAP и настройка параметров ядра

1. Отключите swap:

	
sudo swapoff -a

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
	

2. Загрузите необходимые модули ядра:

	
sudo tee /etc/modules-load.d/containerd.conf << EOF
overlay
br_netfilter
EOF
	
	
sudo modprobe overlay
sudo modprobe br_netfilter
	

3. Установите параметры ядра:

	
sudo tee /etc/sysctl.d/kubernetes.conf << EOT
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOT
	
	
sudo sysctl --system
	

1.3. Установка Containerd

1. Установите зависимости:

	
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
	

2. Добавьте Docker-репозиторий:

	
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"		
	

3. Установите пакеты Docker:

	
sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin		
	

4. Настройте systemd как cgroup-драйвер:

	
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml		
	

5. Перезапустите containerd:

	
sudo systemctl restart containerd

sudo systemctl enable containerd		
	

1.4. Установка Kubernetes-компонентов

1. Добавьте репозиторий:

	
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list		
	

2. Установите компоненты:

	
sudo apt update

sudo apt install -y kubelet kubeadm kubectl

sudo apt-mark hold kubelet kubeadm kubectl		
	

1.5. Инициализация кластера

	
sudo kubeadm init		
	

1. Настройка kubectl:

	
sudo su

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config		
	

2. Проверка статуса:

	
kubectl cluster-info

kubectl get nodes		
	

1.6. Установка сетевого плагина Calico

	
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml

kubectl get pods -n kube-system		
	

2. Настройка Kubernetes Audit Logging

Аудит Kubernetes позволяет отслеживать обращения к API-серверу и фиксировать потенциально опасные действия.

2.1. Настройка манифеста kubernetes-api сервера

Измените файл /etc/kubernetes/manifests/kube-apiserver.yaml, добавив:

Аргументы запуска:

	
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
- --audit-log-path=/var/log/audit.log
- --audit-log-maxsize=10
- --audit-log-maxbackup=5
	

VolumeMounts:

	
volumeMounts:
  - mountPath: /etc/kubernetes/audit-policy.yaml
    name: audit
    readOnly: true
  - mountPath: /var/log/audit.log
    name: audit-log
    readOnly: false
	

Volumes:

	
volumes:
  - name: audit
    hostPath:
      path: /etc/kubernetes/audit-policy.yaml
      type: File
  - name: audit-log
    hostPath:
      path: /var/log/audit.log
      type: FileOrCreate
	

2.2. Политика аудита (audit-policy.yaml)

Создайте файл /etc/kubernetes/audit-policy.yaml со следующим содержимым:

	
apiVersion: audit.k8s.io/v1
kind: Policy

rules:
  - level: Request
    resources:
      - group: ""
        resources: ["serviceaccounts"]
    verbs: ["create"]

  - level: Request
    resources:
      - group: "rbac.authorization.k8s.io"
        resources: ["clusterrolebindings"]
    verbs: ["create", "update", "patch", "get"]

  - level: Metadata
    resources:
      - group: ""
        resources: ["pods/exec"]

  - level: Request
    verbs: ["create", "update", "delete"]
    resources:
      - group: "batch"
        resources: ["cronjobs"]

  - level: Request
    verbs: ["create", "delete"]
    resources:
      - group: "batch"
        resources: ["jobs"]

  - level: Metadata
    verbs: ["get", "list"]
    resources:
      - group: "batch"
        resources: ["CronJobs"]

  - level: Metadata
    resources:
      - group: ""
        resources: ["events"]
    verbs: ["delete"]

  - level: Request
    resources:
      - group: ""
        resources: ["configmaps"]
    verbs: ["update", "patch"]
    namespaces: ["kube-system"]

  - level: Request
    resources:
      - group: ""
        resources: ["secrets"]
    verbs: ["get", "list"]

  - level: Request
    resources:
      - group: ""
        resources: ["pods"]
      - group: ""
        resources: ["deployments", "replicasets", "statefulsets"]
    verbs: ["create", "update", "patch"]
	
  • Metadata: логирует основные метаданные запроса (кто, когда, к какому ресурсу).
  • RequestResponse: логирует содержимое запроса и ответа (полезно для аудита exec).
  • None: исключения для системных сервисов, чтобы не перегружать лог.

3. Установка и настройка Falco

3.1. Что такое Falco?

Falco — это open-source-система обнаружения вторжений (IDS) от Sysdig, которая анализирует системные вызовы и события Kubernetes, определяя подозрительное поведение в режиме реального времени.

Об использовании Falco подробнее мы рассказывали на SOC-форуме в 2024 году: «Расширение возможностей хостового аудита: адаптация Falco для Linux-систем».

3.2. Установка Falco

	
curl -fsSL https://falco.org/repo/falcosecurity-packages.asc | sudo gpg --dearmor -o
/usr/share/keyrings/falco-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] https://download.falco.org/packages/deb stable main"
| sudo tee /etc/apt/sources.list.d/falcosecurity.list

sudo apt update && sudo FALCO_FRONTEND=noninteractive FALCOCTL_ENABLED=no apt-get install -y falco		
	

3.3. Настройка правил

Файл правил: /etc/falco/falco_rules.yaml.

Измените файл с правилами на представленные ниже:

	
- required_engine_version: 0.31.0

- macro: open_write
  condition: (evt.type in (open,openat,openat2) and evt.is_open_write=true and fd.typechar='f' and fd.num>=0)

- macro: open_read
  condition: (evt.type in (open,openat,openat2) and evt.is_open_read=true and fd.typechar='f' and fd.num>=0)

- macro: open_file_failed
  condition: (evt.type in (open,openat,openat2) and fd.typechar='f' and fd.num=-1 and evt.res startswith E)

- macro: spawned_process
  condition: (evt.type in (execve, execveat) and evt.dir=<)

- rule: Spawned process
  desc: >
    Records all process executions for auditing purposes
  condition: >
    spawned_process
  output: Spawned process (k8s_ns_name=%k8s.ns.name k8s_pod_name=%k8s.pod.name k8s_pod_ip=%k8s.pod.ip parent_exe=%proc.pexe parent_exepath=%proc.pexepath pcmdline=%proc.pcmdline gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] ggggparent=%proc.aname[5] evt_type=%evt.type user=%user.name user_uid=%user.uid user_loginuid=%user.loginuid process=%proc.name proc_exepath=%proc.exepath parent=%proc.pname command=%proc.cmdline terminal=%proc.tty exe_flags=%evt.arg.flags container_name=%container.name container_info=%container.info container_mounts=%container.mounts container_privileged=%container.privileged container_host_pid=%container.host_pid container_host_network=%container.host_network container_host_ipc=%container.host_ipc)
  priority: INFO
  tags: [spawned_process]

- rule: File read
  desc: >
    Detect reading files using common file-reading commands
  condition: >
    (open_read or open_file_failed)
    and proc.name in ("cat", "less", "head", "tail", "grep", "sed", "strings")
  enabled: true
  output: Reading file detected (k8s_ns_name=%k8s.ns.name k8s_pod_name=%k8s.pod.name k8s_pod_ip=%k8s.pod.ip file=%fd.name fileraw=%fd.nameraw evt_type=%evt.type user=%user.name user_uid=%user.uid user_loginuid=%user.loginuid process=%proc.name proc_exepath=%proc.exepath parent=%proc.pname proc_pexepath=%proc.pexepath command=%proc.cmdline terminal=%proc.tty container_name=%container.name container_info=%container.info container_mounts=%container.mounts container_privileged=%container.privileged container_host_pid=%container.host_pid container_host_network=%container.host_network container_host_ipc=%container.host_ipc)
  priority: INFO
  tags: [file_read]

- rule: Network activity
  desc: Logs all outgoing/incoming network connections (TCP/UDP)
  condition: >
    evt.type in (connect,accept,sendto,recvfrom) and
    fd.type = ipv4
  output: Network connection detected (k8s_ns_name=%k8s.ns.name k8s_pod_name=%k8s.pod.name k8s_pod_ip=%k8s.pod.ip user=%user.name proc=%proc.name proc_exepath=%proc.exepath cmd=%proc.cmdline parent=%proc.pname proc_pexepath=%proc.pexepath lip=%fd.lip lport=%fd.lport rip=%fd.rip rport=%fd.rport proto=%fd.l4proto container_name=%container.name container_info=%container.info container_mounts=%container.mounts container_privileged=%container.privileged container_host_pid=%container.host_pid container_host_network=%container.host_network container_host_ipc=%container.host_ipc)
  priority: INFO
  tags: [network]

- rule: File Created in Suspicious Directory
  desc: Detect file creation in high-risk directories (e.g., /tmp, /dev/shm, web roots)
  condition: >
    evt.type = creat and
    (
      fd.name startswith "/tmp/" or
      fd.name startswith "/var/tmp/" or
      fd.name startswith "/dev/shm/" or
      fd.name startswith "/usr/local/bin/" or
      fd.name startswith "/etc/cron." or
      fd.name startswith "/etc/kubernetes/manifests/"
    )
  output: Suspicious file creation detected (k8s_ns_name=%k8s.ns.name k8s_pod_name=%k8s.pod.name k8s_pod_ip=%k8s.pod.ip user=%user.name proc=%proc.name proc_exepath=%proc.exepath cmd=%proc.cmdline parent=%proc.pname proc_pexepath=%proc.pexepath file=%fd.name container_name=%container.name container_info=%container.info container_mounts=%container.mounts container_privileged=%container.privileged container_host_pid=%container.host_pid container_host_network=%container.host_network container_host_ipc=%container.host_ipc)
  priority: WARNING
  tags: [file_creation]
	

3.4. Настройка конфигурации

Конфигурационный файл Falco находится по пути /etc/falco/falco.yaml.

Для логирования событий Falco в отдельный файл нам необходимо внести следующие изменения в конфиг:

  1. Параметр json_output редактируем на условие true.
  2. Параметр file_output — перевод enabled в true и в поле filename указываем желаемый нам путь до журнала событий, например: /var/log/falco/events.json.

Перезапускаем Falco после внесенных изменений:

	
	
sudo systemctl restart falco
	

P.S. Имя сервиса может отличаться в зависимости от используемого модуля Falco, например, вместо falco может быть falco-modern-bpf.

4. Развертывание уязвимой лаборатории kubernetesMiracle

1. Клонируйте репозиторий:

	
	
git clone https://github.com/4RAYS-by-SOLAR/kubernetesMiracle.git	
cd kubernetesMiracle
	

2. Запустите установку:

	
	
 sudo sh laboratory-up.sh	
	

Это скрипт, который поднимает:

  • Необходимые поды
  • Deployment’ы
  • Секреты
  • RBAC-объекты

Заключение

После выполнения всех шагов вы получите полноценную лабораторную среду для:

  • изучения архитектуры Kubernetes;
  • анализа типичных атак на событиях Kubernetes audit и Falco;
  • отработки навыков реагирования команды Blue Team.

Такой стенд особенно полезен в рамках тренировок Purple Team и для повышения квалификации специалистов в области облачной безопасности.

И напоследок мы бы хотели поделиться с вами полезными ссылками, которые помогут вам следить за актуальными угрозами в Kubernetes и их способами обнаружения:

  • k8security — один из самых популярных тг-каналов в русскоязычном сегменте про Kubernetes с эксклюзивными разборами уязвимостей, практическими гайдами и свежими исследованиями.
  • Wiz All Incidents — это база данных последних киберугроз и инцидентов безопасности, собранных Wiz. Платформа фокусируется на облачных средах, поэтому здесь представлены атаки на Kubernetes, облачные сервисы и другие современные инфраструктуры.
  • AquaSec Blog: Kubernetes Security — блог Aqua Security с углубленным анализом угроз и уязвимостей Kubernetes. Здесь публикуются исследования реальных атак, рекомендации по защите кластеров, разборы эксплойтов и best practices для DevSecOps.
  • Sysdig Blog: Kubernetes & Container Security — практические руководства и кейсы от Sysdig по защите Kubernetes и контейнеров. Освещаются вопросы мониторинга угроз, обнаружения аномалий с помощью Falco, расследования инцидентов и обеспечения compliance.
  • MITRE ATT&CK: Containers Matrix — тактики, техники и процедуры (TTPs), используемые атакующими против контейнеров и Kubernetes. Служит эталоном для моделирования угроз, построения SOC-мониторинга и тестирования защитных механизмов.
  • Microsoft: Threat Matrix for Kubernetes — структурированная по модели MITRE ATT&CK матрица тактик и техник атакующих на Kubernetes. Главным ее отличием от MITRE ATT&CK является адаптация исключительно под Kubernetes.
  • A Deep Dive Into Kubernetes Threat Modeling — одна из наиболее лучших статей по детальному анализу угроз Kubernetes и его архитектуры, охватывающая ключевые векторы атак, уязвимости и методы защиты.