Модуль 6.3: Розслідування контейнерів
Складність:
[MEDIUM]— навички реагування на інцидентиЧас на виконання: 40-45 хвилин
Передумови: Модуль 6.2 (Falco), основи процесів Linux
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Простежити запущені процеси, відкриті файли та мережеві з’єднання всередині скомпрометованого контейнера
- Діагностувати масштаб злому контейнера за допомогою crictl, nsenter та аналізу файлової системи /proc
- Реалізувати процедури ізоляції контейнера для збереження доказів під час реагування на інциденти
- Створити послідовність криміналістичного розслідування для інцидентів безпеки Kubernetes
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Коли ви отримуєте сповіщення безпеки, потрібно швидко розслідувати. Які процеси запущені? Які файли були змінені? Які мережеві з’єднання існують? Розслідування контейнерів — це критична навичка реагування на інциденти.
CKS тестує вашу здатність розслідувати підозрілу поведінку контейнерів.
Послідовність розслідування
Розділ «Послідовність розслідування»┌─────────────────────────────────────────────────────────────┐│ ПОСЛІДОВНІСТЬ РОЗСЛІДУВАННЯ КОНТЕЙНЕРІВ │├─────────────────────────────────────────────────────────────┤│ ││ 1. ВИЯВИТИ ││ └── Сповіщення від Falco, журналів аудиту, моніторингу ││ ││ 2. ІДЕНТИФІКУВАТИ ││ └── Який Pod/контейнер? Який вузол? ││ ││ 3. РОЗСЛІДУВАТИ ││ ├── Запущені процеси ││ ├── Мережеві з'єднання ││ ├── Зміни файлів ││ └── Активність користувачів ││ ││ 4. ІЗОЛЮВАТИ ││ ├── Ізоляція за допомогою NetworkPolicy ││ ├── Зупинка контейнера ││ └── Збереження доказів ││ ││ 5. ВИПРАВИТИ ││ ├── Виправити вразливість ││ ├── Оновити образ ││ └── Розгорнути чисту заміну ││ │└─────────────────────────────────────────────────────────────┘Інструменти розслідування
Розділ «Інструменти розслідування»Команди kubectl
Розділ «Команди kubectl»# List pods with statuskubectl get pods -o wide
# Get pod detailskubectl describe pod suspicious-pod
# Get pod YAML (check securityContext, volumes)kubectl get pod suspicious-pod -o yaml
# Check pod logskubectl logs suspicious-podkubectl logs suspicious-pod --previous # Previous container
# Check eventskubectl get events --field-selector involvedObject.name=suspicious-podРозслідування всередині контейнера
Розділ «Розслідування всередині контейнера»# Execute into containerkubectl exec -it suspicious-pod -- /bin/bash# Or without bashkubectl exec -it suspicious-pod -- /bin/sh
# List running processeskubectl exec suspicious-pod -- ps auxkubectl exec suspicious-pod -- ps -ef
# Check network connectionskubectl exec suspicious-pod -- netstat -tulnpkubectl exec suspicious-pod -- ss -tulnp
# Check open fileskubectl exec suspicious-pod -- ls -la /proc/1/fd/
# Check environment variables (may contain secrets!)kubectl exec suspicious-pod -- env
# Check mounted filesystemskubectl exec suspicious-pod -- mountkubectl exec suspicious-pod -- df -h
# Check recent file modificationskubectl exec suspicious-pod -- find / -mmin -60 -type f 2>/dev/nullРозслідування процесів
Розділ «Розслідування процесів»Використання файлової системи /proc
Розділ «Використання файлової системи /proc»# Inside container, examine process details# Process 1 is usually the main container process
# Command linecat /proc/1/cmdline | tr '\0' ' '
# Current working directoryls -la /proc/1/cwd
# Executable pathls -la /proc/1/exe
# Environment variablescat /proc/1/environ | tr '\0' '\n'
# Open filesls -la /proc/1/fd/
# Memory maps (loaded libraries)cat /proc/1/maps
# Network connectionscat /proc/1/net/tcpcat /proc/1/net/tcp6Використання crictl (на вузлі)
Розділ «Використання crictl (на вузлі)»# List containerssudo crictl ps
# Get container ID for podCONTAINER_ID=$(sudo crictl ps --name suspicious-pod -q)
# Inspect containersudo crictl inspect $CONTAINER_ID
# Get container PIDPID=$(sudo crictl inspect $CONTAINER_ID | jq '.info.pid')
# Access container's namespace from hostsudo nsenter -t $PID -p -n ps auxsudo nsenter -t $PID -p -n netstat -tulnpМережеве розслідування
Розділ «Мережеве розслідування»Зсередини контейнера
Розділ «Зсередини контейнера»# Check listening portsnetstat -tulnpss -tulnp
# Check established connectionsnetstat -an | grep ESTABLISHEDss -s
# Check routing tableroute -nip route
# DNS configurationcat /etc/resolv.conf
# Check iptables rules (if accessible)iptables -L -nЗ хоста
Розділ «З хоста»# Find container network namespaceCONTAINER_ID=$(sudo crictl ps --name suspicious-pod -q)PID=$(sudo crictl inspect $CONTAINER_ID | jq '.info.pid')
# Enter container's network namespacesudo nsenter -t $PID -n netstat -tulnpsudo nsenter -t $PID -n ss -tulnp
# Check for connections to suspicious IPssudo nsenter -t $PID -n ss -tnp | grep -E "(22|23|3389)"Розслідування файлової системи
Розділ «Розслідування файлової системи»Перевірка змін
Розділ «Перевірка змін»# Recent file modificationsfind / -mmin -30 -type f 2>/dev/null | head -50
# Files modified todayfind / -mtime 0 -type f 2>/dev/null
# Check for suspicious files in /tmpls -la /tmp/ls -la /var/tmp/ls -la /dev/shm/
# Check for hidden filesfind / -name ".*" -type f 2>/dev/null
# Check for setuid/setgid binariesfind / -perm -4000 -type f 2>/dev/nullfind / -perm -2000 -type f 2>/dev/null
# Check crontabscat /etc/crontabls -la /etc/cron.d/crontab -lПеревірка відомих шаблонів атак
Розділ «Перевірка відомих шаблонів атак»# Cryptocurrency miners often use thesefind / -name "*xmrig*" 2>/dev/nullfind / -name "*minerd*" 2>/dev/null
# Web shellsfind / -name "*.php" -exec grep -l "eval\|base64_decode\|system\|passthru" {} \; 2>/dev/null
# Suspicious shell historycat /root/.bash_historycat /home/*/.bash_history
# Check for reverse shellsnetstat -an | grep -E ":(4444|5555|6666|7777|8888|9999)"Ефемерні контейнери налагодження
Розділ «Ефемерні контейнери налагодження»Коли контейнер не має оболонки або інструментів, використовуйте контейнери налагодження.
# Add debug container to running podkubectl debug -it suspicious-pod --image=busybox --target=main-container
# Or create a copy of the pod with debug containerkubectl debug suspicious-pod --copy-to=debug-pod --container=debugger --image=ubuntu
# Debug node issueskubectl debug node/worker-1 -it --image=ubuntuРеальні сценарії іспиту
Розділ «Реальні сценарії іспиту»Сценарій 1: Розслідування підозрілого процесу
Розділ «Сценарій 1: Розслідування підозрілого процесу»# Alert: Crypto miner detected in pod "app" in namespace "production"
# Step 1: Get pod detailskubectl get pod app -n production -o wide
# Step 2: Check running processeskubectl exec -n production app -- ps aux
# Step 3: Check network connectionskubectl exec -n production app -- netstat -tulnp
# Step 4: Check recent file modificationskubectl exec -n production app -- find /tmp -mmin -60
# Step 5: Document findings and delete podkubectl delete pod app -n productionСценарій 2: Розслідування мережевої ексфільтрації
Розділ «Сценарій 2: Розслідування мережевої ексфільтрації»# Alert: Outbound connection to suspicious IP from pod "data-processor"
# Step 1: Check current connectionskubectl exec data-processor -- ss -tnp
# Step 2: Check for data stagingkubectl exec data-processor -- ls -la /tmp/kubectl exec data-processor -- ls -la /var/tmp/
# Step 3: Isolate the pod with NetworkPolicycat <<EOF | kubectl apply -f -apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: isolate-data-processorspec: podSelector: matchLabels: app: data-processor policyTypes: - Egress egress: [] # Block all egressEOFСценарій 3: Підробка файлової системи
Розділ «Сценарій 3: Підробка файлової системи»# Alert: Write to /etc detected in container
# Step 1: Check what was modifiedkubectl exec suspicious-pod -- find /etc -mmin -30 -type f
# Step 2: Check file contentskubectl exec suspicious-pod -- cat /etc/passwd
# Step 3: Compare with original imageIMAGE=$(kubectl get pod suspicious-pod -o jsonpath='{.spec.containers[0].image}')kubectl run compare --image=$IMAGE --rm -it -- cat /etc/passwd
# Step 4: Check for persistence mechanismskubectl exec suspicious-pod -- crontab -lkubectl exec suspicious-pod -- ls -la /etc/cron.d/Збереження доказів
Розділ «Збереження доказів»# Export pod YAMLkubectl get pod suspicious-pod -o yaml > pod-evidence.yaml
# Export logskubectl logs suspicious-pod > pod-logs.txtkubectl logs suspicious-pod --previous > pod-logs-previous.txt
# Export eventskubectl get events --field-selector involvedObject.name=suspicious-pod > events.txt
# If possible, create filesystem snapshotkubectl exec suspicious-pod -- tar -czf - / > container-filesystem.tar.gzЧи знали ви?
Розділ «Чи знали ви?»-
Ефемерні контейнери налагодження (kubectl debug) з’явилися в Kubernetes 1.18 і стали стабільними в 1.25. Вони ідеально підходять для розслідування distroless образів.
-
Контейнери використовують спільне ядро хоста, але мають окремі представлення /proc. Кожен /proc контейнера показує лише його власні процеси.
-
nsenter дозволяє увійти до будь-якого простору імен Linux. В поєднанні з PID контейнера можна отримати доступ до мережевих, монтування та PID просторів імен контейнера з хоста.
-
Файлова система тільки для читання не запобігає всім записам. Зловмисники все ще можуть писати в змонтовані томи, /tmp (якщо tmpfs) та /dev/shm.
Поширені помилки
Розділ «Поширені помилки»| Помилка | Чому це шкідливо | Рішення |
|---|---|---|
| Негайне видалення Pod | Докази втрачені | Спочатку розслідуйте |
| Без мережевої ізоляції | Атака продовжується | Спочатку застосуйте NetworkPolicy |
| Відсутні логи | Неможливо відтворити хронологію | Експортуйте перед видаленням |
| Не перевірені всі контейнери | Багатоконтейнерні Pod | Перевірте sidecar також |
| Забуті попередні логи | Перший контейнер впав | Використовуйте прапорець —previous |
Тест
Розділ «Тест»-
Як перевірити запущені процеси в контейнері без доступу через exec?
Відповідь
Використовуйте `kubectl debug` для створення ефемерного контейнера налагодження, або використовуйте `crictl inspect` та `nsenter` з вузла для входу до просторів імен контейнера. -
Яка команда знаходить файли, змінені за останні 30 хвилин?
Відповідь
`find / -mmin -30 -type f 2>/dev/null`. Прапорець `-mmin` визначає хвилини, а `-mtime` визначає дні. -
Як ізолювати підозрілий Pod під час розслідування?
Відповідь
Застосувати NetworkPolicy з порожніми правилами egress для блокування всього вихідного трафіку. Це запобігає ексфільтрації даних під час розслідування. -
Яка перевага використання ефемерних контейнерів налагодження?
Відповідь
Вони працюють з distroless образами, що не мають оболонки, використовують спільні простори імен цільового контейнера для повної видимості та не змінюють оригінальний контейнер.
Практична вправа
Розділ «Практична вправа»Завдання: Практика технік розслідування контейнерів.
# Step 1: Create a "suspicious" pod for investigationcat <<EOF | kubectl apply -f -apiVersion: v1kind: Podmetadata: name: suspicious-app labels: app: suspiciousspec: containers: - name: app image: busybox command: ["sh", "-c", " echo 'suspicious data' > /tmp/exfil.txt && while true; do sleep 10; done "]EOF
# Wait for pod to be readykubectl wait --for=condition=Ready pod/suspicious-app --timeout=60s
# Step 2: Investigate processesecho "=== Running Processes ==="kubectl exec suspicious-app -- ps aux
# Step 3: Check networkecho "=== Network Configuration ==="kubectl exec suspicious-app -- cat /etc/resolv.conf
# Step 4: Check for recent file modificationsecho "=== Recent File Modifications ==="kubectl exec suspicious-app -- find / -mmin -10 -type f 2>/dev/null
# Step 5: Check /tmp for suspicious filesecho "=== /tmp Contents ==="kubectl exec suspicious-app -- ls -la /tmp/kubectl exec suspicious-app -- cat /tmp/exfil.txt
# Step 6: Create isolation NetworkPolicyecho "=== Creating Isolation Policy ==="cat <<EOF | kubectl apply -f -apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: isolate-suspiciousspec: podSelector: matchLabels: app: suspicious policyTypes: - Egress - Ingress egress: [] ingress: []EOF
echo "Pod isolated with NetworkPolicy"
# Step 7: Preserve evidenceecho "=== Preserving Evidence ==="kubectl get pod suspicious-app -o yaml > /tmp/pod-evidence.yamlkubectl logs suspicious-app > /tmp/pod-logs.txtecho "Evidence saved to /tmp/"
# Cleanupkubectl delete pod suspicious-appkubectl delete networkpolicy isolate-suspiciousrm -f /tmp/pod-evidence.yaml /tmp/pod-logs.txt
echo "=== Investigation Complete ==="Критерії успіху: Зрозуміти команди розслідування та послідовність дій.
Підсумок
Розділ «Підсумок»Кроки розслідування:
- Виявити (сповіщення, логи)
- Ідентифікувати (Pod, простір імен, вузол)
- Розслідувати (процеси, мережа, файли)
- Ізолювати (NetworkPolicy, ізоляція)
- Виправити (видалити, перерозгорнути)
Ключові команди:
kubectl execдля виконання командkubectl debugдля контейнерів налагодженняkubectl logsдля логів додатківcrictlтаnsenterна вузлах
Що перевіряти:
- Запущені процеси (ps aux)
- Мережеві з’єднання (netstat, ss)
- Зміни файлів (find -mmin)
- Змінні середовища (env)
Поради для іспиту:
- Знайте синтаксис kubectl exec
- Розумійте файлову систему /proc
- Вмійте ізолювати Pod
- Пам’ятайте про збереження доказів
Наступний модуль
Розділ «Наступний модуль»Модуль 6.4: Незмінна інфраструктура — Побудова контейнерів, які не можна змінити під час виконання.