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 в отдельный файл нам необходимо внести следующие изменения в конфиг:
- Параметр json_output редактируем на условие true.
- Параметр 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 и его архитектуры, охватывающая ключевые векторы атак, уязвимости и методы защиты.