Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки
Сводная таблица
| Набор правил | Правило | Описание | Уровень | Источник | Теги |
|---|---|---|---|---|---|
| Fstec | Launch Package Management Process in container | Обнаруживает запуск процесса управления пакетами (apt/yum/dnf/apk и т. п.) внутри контейнера. Часто указывает на дрейф контейнера, установку инструментов в рантайме или пост-компрометационные действия. | Error | Syscall | fstec, container_drift |
| Fstec | Drop and execute new binary in container | Обнаруживает запуск исполняемого файла в контейнере, который отсутствует в базовом образе (исполняемый файл из верхнего слоя OverlayFS). Типичный признак «drop and execute» после получения доступа к контейнеру. | Critical | Syscall | fstec, container_drift |
| Fstec | Container drift detected (chmod) | Обнаруживает изменение прав (chmod) внутри контейнера, приводящее к появлению или активации исполняемого файла. Может указывать на дрейф контейнера или попытку подготовки вредоносного инструмента к запуску. | Error | Syscall | fstec, container_drift |
| Fstec | Container drift detected (open+create) | Обнаруживает создание исполняемого файла внутри контейнера через open/create с последующим выполнением. Часто встречается при дрейфе контейнера или при загрузке и запуске вредоносных бинарных файлов. |
Error | Syscall | fstec, container_drift |
| Fstec | Modify binary dirs | Обнаруживает переименование/удаление файлов в стандартных каталогах бинарных файлов (/bin, /sbin, /usr/bin, /usr/sbin) внутри контейнера. Может указывать на попытку подмены системных утилит или сокрытия следов. |
Error | Syscall | fstec, container_drift |
| Fstec | K8s Pod created | Обнаруживает успешное создание пода в Kubernetes по audit-логам. Полезно для контроля появления новых рабочих нагрузок и расследования неожиданных запусков. | Informational | K8sAudit | fstec, container_drift |
| Fstec | K8s Pod deleted | Обнаруживает успешное удаление пода в Kubernetes по audit-логам. Полезно для выявления саботажа, попыток скрыть активность и анализа инцидентов. | Informational | K8sAudit | fstec, container_drift |
| Fstec | ServiceAccount created in a system namespace | Обнаруживает создание ServiceAccount в системных неймспейсах (kube-system, kube-public, default или d8-*). Может быть признаком попытки закрепиться в кластере и получить дополнительные права. |
Warning | K8sAudit | fstec, rbac_drift |
| Fstec | Attach to cluster-admin Role | Обнаруживает создание ClusterRoleBinding, привязывающего субъект к роли cluster-admin. Это критическое действие, дающее полный административный доступ к кластеру. | Warning | K8sAudit | fstec, rbac_drift |
| Fstec | ClusterRole with wildcard created | Обнаруживает создание Role/ClusterRole с wildcard-ресурсами или verb ("*") в правилах RBAC. Такие роли существенно расширяют права и часто являются признаком ошибочной настройки или эскалации привилегий. | Warning | K8sAudit | fstec, rbac_drift |
| Fstec | Attach/Exec Pod | Обнаруживает попытку exec/attach к поду (subresource exec/attach) по audit-логам. Может указывать на интерактивный доступ к контейнеру и возможные ручные действия в рантайме. | Notice | K8sAudit | fstec, container_image_access |
| Fstec | EphemeralContainers created | Обнаруживает добавление ephemeral containers в под. Эфемерные контейнеры часто используют для отладки, но также могут применяться злоумышленниками для скрытого доступа. | Notice | K8sAudit | fstec, container_image_access |
| Fstec | ClusterRole with write privileges created | Обнаруживает создание Role/ClusterRole с правами на запись (create, update, patch, delete). Такие роли позволяют изменять объекты кластера и могут использоваться для эскалации или внедрения изменений. |
Notice | K8sAudit | fstec, rbac_drift |
| Fstec | ClusterRole with Pod Exec created | Обнаруживает создание Role/ClusterRole с доступом к подам с возможностью exec. Доступ к exec позволяет выполнять команды в контейнерах и часто эквивалентен высокому уровню доступа к рабочей нагрузке. | Warning | K8sAudit | fstec, rbac_drift |
| Fstec | System ClusterRole modified/deleted | Обнаруживает изменение или удаление системных Role/ClusterRole (system:*), за исключением некоторых разрешённых. Может быть признаком попытки нарушить работу кластера или ослабить безопасность. |
Warning | K8sAudit | fstec, rbac_drift |
| Fstec | K8s ServiceAccount created | Обнаруживает создание ServiceAccount вне системных неймспейсов. Может быть нормой для приложений, но также используется для подготовки доступа и дальнейшей выдачи RBAC-прав. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | K8s ModuleConfig modified | Обнаруживает изменение объекта ModuleConfig по audit-логам. Изменения ModuleConfig могут влиять на поведение и настройки компонентов (в т. ч. безопасность) и требуют контроля. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | K8s ServiceAccount deleted | Обнаруживает удаление ServiceAccount по audit-логам. Может указывать на попытку очистки артефактов доступа или на изменения в настройках приложений. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | K8s Role/ClusterRole created | Обнаруживает создание Role/ClusterRole по audit-логам. Используется для контроля изменений RBAC и выявления неожиданных расширений прав. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | K8s Role/ClusterRole deleted | Обнаруживает удаление Role/ClusterRole по audit-логам. Может указывать на попытку скрыть следы, откат настроек или разрушение конфигурации доступа. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | K8s ClusterRoleBinding created | Обнаруживает создание ClusterRoleBinding по audit-логам. ClusterRoleBinding изменяет назначение кластерных прав и может быть вектором эскалации привилегий. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | K8s ClusterRoleBinding deleted | Обнаруживает удаление ClusterRoleBinding по audit-логам. Может приводить к потере доступа или использоваться для сокрытия несанкционированных назначений. | Notice | K8sAudit | fstec, rbac_drift |
| Fstec | Read below containerd images dir | Обнаруживает чтение файлов в каталоге containerd, связанном с данными контейнеров или CRI. Может указывать на попытку извлечения информации о контейнерах и образах или на нехарактерный доступ к данным рантайма. | Notice | Syscall | fstec, container_image_access |
| Fstec | Write below containerd images dir | Обнаруживает запись и изменение файлов в каталогах containerd. Может указывать на попытку подмены или повреждения данных рантайма, дрейф или атаки на цепочку поставки образов. | Error | Syscall | fstec, container_image_drift |
| Fstec | Container tag is not @sha256 | Обнаруживает создание подов в системном неймспейсе с образом, не закреплённым по digest (@sha256:). Использование тегов без digest усложняет контроль целостности и повышает риск подмены образа. | Notice | K8sAudit | fstec, integrity_control |
| Fstec | Inbound SSH Connection Attempt | Обнаруживает попытку входящего SSH-подключения на порт 22 на хосте. Включает неуспешные попытки аутентификации. Имя пользователя недоступно на этом этапе. Для получения имени пользователя при неуспешных попытках аутентификации настройте события безопасности на основе логов sshd. | Notice | Syscall | fstec, auth_attempts |
| Fstec | Inbound SSH Connection | Обнаруживает успешное входящее SSH-соединение на хосте. Срабатывает при запуске оболочки пользователя процессом sshd после успешной аутентификации. Имя пользователя разрешается через плагин k8s-nodeuser-info (nodeusers.deckhouse.io) по login UID; это работает только для пользователей, заведённых через Deckhouse NodeUser. Для остальных пользователей доступен только числовой UID — настройте события безопасности на основе логов sshd для получения имён пользователей вне NodeUser. | Notice | Syscall | fstec, auth_attempts |
| Fstec | Unauthorized request to Kubernetes API | Обнаруживает запросы к Kubernetes API, завершившиеся 401 (Unauthorized), в audit-логах (исключая health и version эндпоинты). Может указывать на попытки подбора токенов, неправильную конфигурацию клиентов или активность злоумышленника. |
Warning | K8sAudit | fstec, auth_attempts |
| Fstec | Security Reports Created | Обнаруживает создание объектов security report (configauditreports/vulnerabilityreports). Может указывать на запуск сканирования, появление новых результатов по уязвимостям или активность, связанную с безопасностью контейнеров. | Notice | K8sAudit | fstec, security_reports |
| D8IntegrityCheck | Missing digital signature | Один из бинарных файлов системных компонентов Deckhouse не прошёл проверку цифровой подписи. Проверьте логи утилиты d8-bcheck и обратитесь в техническую поддержку. | Error | Syscall | integrity_check, subscription_check |
| D8IntegrityCheck | Event with deckhouse.io/signature annotation | Обнаружено событие Kubernetes API с аннотацией deckhouse.io/signature. Указывает, что в базе etcd найдены неподписанные объекты или объекты с невалидной подписью. | Notice | K8sAudit | integrity_check, signature |
Наборы правил
Fstec
Launch Package Management Process in container
Обнаруживает запуск процесса управления пакетами (apt/yum/dnf/apk и т. п.) внутри контейнера. Часто указывает на дрейф контейнера, установку инструментов в рантайме или пост-компрометационные действия.
- Источник: Syscall
- Теги:
fstec,container_drift - Уровень: Error
Условие
spawned_process and container and user.name != "_apt" and package_mgmt_procs and not package_mgmt_ancestor_procsСообщение
Package management process launched in container (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid container_id=%container.id container_name=%container.name image=%container.image.repository:%container.image.tag exe_flags=%evt.arg.flags)Как протестировать
- Среда: контейнер
Команды:
apt -hDrop and execute new binary in container
Обнаруживает запуск исполняемого файла в контейнере, который отсутствует в базовом образе (исполняемый файл из верхнего слоя OverlayFS). Типичный признак «drop and execute» после получения доступа к контейнеру.
- Источник: Syscall
- Теги:
fstec,container_drift - Уровень: Critical
Условие
spawned_process and container and proc.is_exe_upper_layer=true and not container.image.repository in (known_drop_and_execute_containers)Сообщение
Executing binary not part of base image (user=%user.name user_loginuid=%user.loginuid user_uid=%user.uid comm=%proc.cmdline exe=%proc.exe container_id=%container.id image=%container.image.repository proc.name=%proc.name proc.sname=%proc.sname proc.pname=%proc.pname proc.aname[2]=%proc.aname[2] exe_flags=%evt.arg.flags proc.exe_ino=%proc.exe_ino proc.exe_ino.ctime=%proc.exe_ino.ctime proc.exe_ino.mtime=%proc.exe_ino.mtime proc.exe_ino.ctime_duration_proc_start=%proc.exe_ino.ctime_duration_proc_start proc.exepath=%proc.exepath proc.cwd=%proc.cwd proc.tty=%proc.tty container.start_ts=%container.start_ts proc.sid=%proc.sid proc.vpgid=%proc.vpgid evt.res=%evt.res)Как протестировать
- Среда: контейнер
Команды:
echo "echo Hello, Falco!" > /tmp/test.sh
chmod +x /tmp/test.sh
/tmp/test.shContainer drift detected (chmod)
Обнаруживает изменение прав (chmod) внутри контейнера, приводящее к появлению или активации исполняемого файла. Может указывать на дрейф контейнера или попытку подготовки вредоносного инструмента к запуску.
- Источник: Syscall
- Теги:
fstec,container_drift - Уровень: Error
Условие
chmod and container and not runc_writing_exec_fifo and not runc_writing_var_lib_docker and not kubelet_pod_volume and not image_scanner_drift and not deckhouse_controller_drift and not neuvector_container and not vault_env_injector_drift and not nginx_ingress_drift and evt.rawres>=0 and (
(evt.arg.mode contains "S_IXUSR")
or (evt.arg.mode contains "S_IXGRP")
or (evt.arg.mode contains "S_IXOTH")
)Сообщение
Drift detected (chmod), new executable created in a container (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid filename=%evt.arg.filename name=%evt.arg.name mode=%evt.arg.mode event=%evt.type container_id=%container.id image=%container.image.repository)Как протестировать
- Среда: контейнер
Команды:
echo "echo Hello, Falco!" > /tmp/test.sh
chmod +x /tmp/test.sh
/tmp/test.shContainer drift detected (open+create)
Обнаруживает создание исполняемого файла внутри контейнера через open/create с последующим выполнением. Часто встречается при дрейфе контейнера или при загрузке и запуске вредоносных бинарных файлов.
- Источник: Syscall
- Теги:
fstec,container_drift - Уровень: Error
Условие
evt.type in (open,openat,openat2,creat) and evt.is_open_exec=true and container and not runc_writing_exec_fifo and not runc_writing_var_lib_docker and not runc_writing_var_lib_containerd and not kubelet_pod_volume and not image_scanner_drift and not deckhouse_controller_drift and not neuvector_container and not vault_env_injector_drift and not nginx_ingress_drift and not lvm_lock_drift and evt.rawres>=0Сообщение
Drift detected (open+create), new executable created in a container (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid filename=%evt.arg.filename name=%evt.arg.name mode=%evt.arg.mode event=%evt.type container_id=%container.id image=%container.image.repository)Как протестировать
- Среда: контейнер
Команды:
cat << 'EOF' > /tmp/drift_exec.c
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
int main() {
char path[] = "/tmp/zzz-exec";
char *text = "#!/bin/sh\necho HACKED\n";
int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0755);
write(fd, text, strlen(text));
fchmod(fd, 0755);
char *const args[] = {path, NULL};
execv(path, args);
}
EOF
gcc /tmp/drift_exec.c -o /tmp/drift_exec
/tmp/drift_execModify binary dirs
Обнаруживает переименование/удаление файлов в стандартных каталогах бинарных файлов (/bin, /sbin, /usr/bin, /usr/sbin) внутри контейнера. Может указывать на попытку подмены системных утилит или сокрытия следов.
- Источник: Syscall
- Теги:
fstec,container_drift - Уровень: Error
Условие
container and bin_dir_rename and modify and not package_mgmt_procs and evt.rawres>=0Сообщение
File below known binary directory renamed/removed (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid pcmdline=%proc.pcmdline operation=%evt.type file=%fd.name %evt.args container_id=%container.id image=%container.image.repository)Как протестировать
- Среда: контейнер
Команды:
touch /usr/bin/evilfile
mv /usr/bin/evilfile /usr/bin/eviltwin
rm /usr/bin/eviltwinK8s Pod created
Обнаруживает успешное создание пода в Kubernetes по audit-логам. Полезно для контроля появления новых рабочих нагрузок и расследования неожиданных запусков.
- Источник: K8sAudit
- Теги:
fstec,container_drift - Уровень: Informational
Условие
(kevt and kcreate and pod and response_successful)Сообщение
K8s Pod Created (user=%ka.user.name pod=%ka.target.name ns=%ka.target.namespace resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl run testpod --image=alpine:latest -- /bin/sh -c "while true; do sleep 3600; done"
kubectl delete pod testpod --grace-period=0K8s Pod deleted
Обнаруживает успешное удаление пода в Kubernetes по audit-логам. Полезно для выявления саботажа, попыток скрыть активность и анализа инцидентов.
- Источник: K8sAudit
- Теги:
fstec,container_drift - Уровень: Informational
Условие
(kevt and kdelete and pod and response_successful)Сообщение
K8s Pod Deleted (user=%ka.user.name pod=%ka.target.name ns=%ka.target.namespace resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl run testpod --image=alpine:latest -- /bin/sh -c "while true; do sleep 3600; done"
kubectl delete pod testpod --grace-period=0ServiceAccount created in a system namespace
Обнаруживает создание ServiceAccount в системных неймспейсах (kube-system, kube-public, default или d8-*). Может быть признаком попытки закрепиться в кластере и получить дополнительные права.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Warning
Условие
kevt and serviceaccount and kcreate and system_namespace and response_successfulСообщение
Service account created in kube namespace (user=%ka.user.name serviceaccount=%ka.target.name resource=%ka.target.resource ns=%ka.target.namespace sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl -n default create serviceaccount test-sa
kubectl -n default delete serviceaccount test-sakubectl -n kube-public create serviceaccount test-sa2
kubectl -n kube-public delete serviceaccount test-sa2kubectl -n kube-system create serviceaccount test-sa3
kubectl -n kube-system delete serviceaccount test-sa3kubectl -n d8-system create serviceaccount test-sa4
kubectl -n d8-system delete serviceaccount test-sa4Attach to cluster-admin Role
Обнаруживает создание ClusterRoleBinding, привязывающего субъект к роли cluster-admin. Это критическое действие, дающее полный административный доступ к кластеру.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Warning
Условие
kactivity and clusterrolebinding and kcreate and ka.req.binding.role=cluster-adminСообщение
Cluster Role Binding to cluster-admin role (user=%ka.user.name binding=%ka.target.name resource=%ka.target.resource subjects=%ka.req.binding.subjects role=%ka.req.binding.role resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=default:test
kubectl delete clusterrolebinding cluster-admin-bindingClusterRole with wildcard created
Обнаруживает создание Role/ClusterRole с wildcard-ресурсами или verb ("*") в правилах RBAC. Такие роли существенно расширяют права и часто являются признаком ошибочной настройки или эскалации привилегий.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Warning
Условие
kevt and (role or clusterrole) and kcreate and role_with_wildcardСообщение
Created Role/ClusterRole with wildcard (user=%ka.user.name role=%ka.target.name resource=%ka.target.resource rules=%ka.req.role.rules sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create role test-role1 --verb=create --resource=*
kubectl delete role test-role1kubectl create role test-role2 --verb=* --resource=pod
kubectl delete role test-role2kubectl create role test-role3 --verb=* --resource=*
kubectl delete role test-role3Attach/Exec Pod
Обнаруживает попытку exec/attach к поду (subresource exec/attach) по audit-логам. Может указывать на интерактивный доступ к контейнеру и возможные ручные действия в рантайме.
- Источник: K8sAudit
- Теги:
fstec,container_image_access - Уровень: Notice
Условие
kevt and (jevt.value[/verb] in (get,create,connect)) and (jevt.value[/requestURI] contains "/pods/") and (jevt.value[/requestURI] contains "/exec" or jevt.value[/requestURI] contains "/attach") and not (jevt.value[/impersonatedUser/username] exists and jevt.value[/impersonatedUser/username] in (exec_attach_allowed_users))Сообщение
Attach/Exec to pod (user=%jevt.value[/user/username] pod=%jevt.value[/objectRef/name] resource=%jevt.value[/objectRef/resource] ns=%jevt.value[/objectRef/namespace] action=%jevt.value[/objectRef/subresource] container_name=%ka.uri.param[container] command=%ka.uri.param[command] sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl run testpod --image=ubuntu:latest -- /bin/sh -c "while true; do sleep 3600; done"
kubectl create serviceaccount exec-user
kubectl create role exec-user-pod-exec --verb=get,list --resource=pods
kubectl create role exec-user-pod-exec-subresource --verb=create,get --resource=pods/exec,pods/attach
kubectl create rolebinding exec-user-pod-exec --role=exec-user-pod-exec --serviceaccount=default:exec-user
kubectl create rolebinding exec-user-pod-exec-subresource --role=exec-user-pod-exec-subresource --serviceaccount=default:exec-user
kubectl wait pod/testpod --for=condition=Ready --timeout=60s
kubectl exec testpod --as=system:serviceaccount:default:exec-user -- ls
kubectl delete rolebinding exec-user-pod-exec-subresource
kubectl delete rolebinding exec-user-pod-exec
kubectl delete role exec-user-pod-exec-subresource
kubectl delete role exec-user-pod-exec
kubectl delete serviceaccount exec-user
kubectl delete pod testpod --grace-period=0EphemeralContainers created
Обнаруживает добавление ephemeral containers в под. Эфемерные контейнеры часто используют для отладки, но также могут применяться злоумышленниками для скрытого доступа.
- Источник: K8sAudit
- Теги:
fstec,container_image_access - Уровень: Notice
Условие
kevt and pod_subresource and kmodify and ka.target.subresource in (ephemeralcontainers)Сообщение
Ephemeral container is created in pod (user=%ka.user.name pod=%ka.target.name resource=%ka.target.resource ns=%ka.target.namespace ephemeral_container_name=%jevt.value[/requestObject/spec/ephemeralContainers/0/name] ephemeral_container_image=%jevt.value[/requestObject/spec/ephemeralContainers/0/image] sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl run test --image=ubuntu:latest -- /bin/sh -c "while true; do sleep 3600; done"
kubectl wait pod/test --for=condition=Ready --timeout=60s
kubectl debug test --image=alpine --target=test
kubectl delete pod test --grace-period=0ClusterRole with write privileges created
Обнаруживает создание Role/ClusterRole с правами на запись (create, update, patch, delete). Такие роли позволяют изменять объекты кластера и могут использоваться для эскалации или внедрения изменений.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kevt and (role or clusterrole) and kcreate and role_with_write_privs and not role_with_wildcard and not role_with_pod_execСообщение
Created Role/ClusterRole with write privileges (user=%ka.user.name role=%ka.target.name resource=%ka.target.resource rules=%ka.req.role.rules sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create role test-role --verb=create,delete --resource=pods
kubectl delete role test-rolekubectl create clusterrole test-role2 --verb=create,delete --resource=pods
kubectl delete clusterrole test-role2ClusterRole with Pod Exec created
Обнаруживает создание Role/ClusterRole с доступом к подам с возможностью exec. Доступ к exec позволяет выполнять команды в контейнерах и часто эквивалентен высокому уровню доступа к рабочей нагрузке.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Warning
Условие
kevt and (jevt.value[/stage]=ResponseComplete) and (jevt.value[/verb]=create) and (jevt.value[/objectRef/resource] in (roles,clusterroles) or jevt.value[/requestURI] contains "/roles" or jevt.value[/requestURI] contains "/clusterroles") and role_with_pod_exec and not (jevt.value[/requestObject/rules] contains "\"*\"" or jevt.value[/requestObject] contains "\"*\"") and not (jevt.value[/impersonatedUser/username] exists and jevt.value[/impersonatedUser/username] in (exec_attach_allowed_users))Сообщение
Created Role/ClusterRole with pod exec privileges (user=%jevt.value[/user/username] role=%jevt.value[/objectRef/name] resource=%jevt.value[/objectRef/resource] rules=%jevt.value[/requestObject/rules] sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create serviceaccount pod-exec-role-user
kubectl create role pod-exec-role-manager --verb=create,delete --resource=roles
kubectl create role pod-exec-role-required --verb=create --resource=pods/exec
kubectl create rolebinding pod-exec-role-manager --role=pod-exec-role-manager --serviceaccount=default:pod-exec-role-user
kubectl create rolebinding pod-exec-role-required --role=pod-exec-role-required --serviceaccount=default:pod-exec-role-user
kubectl create role test --verb=create --resource=pods/exec --as=system:serviceaccount:default:pod-exec-role-user
kubectl delete role test --as=system:serviceaccount:default:pod-exec-role-user
kubectl delete rolebinding pod-exec-role-required
kubectl delete rolebinding pod-exec-role-manager
kubectl delete role pod-exec-role-required
kubectl delete role pod-exec-role-manager
kubectl delete serviceaccount pod-exec-role-userkubectl create serviceaccount pod-exec-clusterrole-user
kubectl create clusterrole pod-exec-clusterrole-manager --verb=create,delete --resource=clusterroles
kubectl create clusterrole pod-exec-clusterrole-required --verb=create --resource=pods/exec
kubectl create clusterrolebinding pod-exec-clusterrole-manager --clusterrole=pod-exec-clusterrole-manager --serviceaccount=default:pod-exec-clusterrole-user
kubectl create clusterrolebinding pod-exec-clusterrole-required --clusterrole=pod-exec-clusterrole-required --serviceaccount=default:pod-exec-clusterrole-user
kubectl create clusterrole test2 --verb=create --resource=pods/exec --as=system:serviceaccount:default:pod-exec-clusterrole-user
kubectl delete clusterrole test2 --as=system:serviceaccount:default:pod-exec-clusterrole-user
kubectl delete clusterrolebinding pod-exec-clusterrole-required
kubectl delete clusterrolebinding pod-exec-clusterrole-manager
kubectl delete clusterrole pod-exec-clusterrole-required
kubectl delete clusterrole pod-exec-clusterrole-manager
kubectl delete serviceaccount pod-exec-clusterrole-userSystem ClusterRole modified/deleted
Обнаруживает изменение или удаление системных Role/ClusterRole (system:*), за исключением некоторых разрешённых. Может быть признаком попытки нарушить работу кластера или ослабить безопасность.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Warning
Условие
kevt and (role or clusterrole) and (kmodify or kdelete) and (ka.target.name startswith "system:") and not ka.target.name in (system:coredns, system:managed-certificate-controller)Сообщение
System ClusterRole/Role modified or deleted (user=%ka.user.name role=%ka.target.name resource=%ka.target.resource action=%ka.verb sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl -n kube-system create role system:test1 --verb=create --resource=pods
kubectl -n kube-system delete role system:test1kubectl -n kube-system create clusterrole system:test2 --verb=create --resource=pods
kubectl -n kube-system delete clusterrole system:test2K8s ServiceAccount created
Обнаруживает создание ServiceAccount вне системных неймспейсов. Может быть нормой для приложений, но также используется для подготовки доступа и дальнейшей выдачи RBAC-прав.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and kcreate and serviceaccount and not system_namespace and response_successfulСообщение
K8s Serviceaccount Created (user=%ka.user.name serviceaccount=%ka.target.name ns=%ka.target.namespace resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl get ns test || kubectl create ns test
kubectl -n test create serviceaccount test
kubectl -n test delete serviceaccount testK8s ModuleConfig modified
Обнаруживает изменение объекта ModuleConfig по audit-логам. Изменения ModuleConfig могут влиять на поведение и настройки компонентов (в т. ч. безопасность) и требуют контроля.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and writable_verbs and moduleconfig and response_successfulСообщение
K8s ModuleConfig changed (user=%ka.user.name verb=%ka.verb moduleconfig=%ka.target.name resource=%ka.target.resource ns=%ka.target.namespace resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl patch moduleconfig deckhouse --type=merge -p '{"spec":{"settings":{"allowExperimentalModules":false}}}'
kubectl patch moduleconfig deckhouse --type=merge -p '{"spec":{"settings":{"allowExperimentalModules":true}}}'K8s ServiceAccount deleted
Обнаруживает удаление ServiceAccount по audit-логам. Может указывать на попытку очистки артефактов доступа или на изменения в настройках приложений.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and kdelete and serviceaccount and response_successfulСообщение
K8s Serviceaccount Deleted (user=%ka.user.name serviceaccount=%ka.target.name ns=%ka.target.namespace resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create serviceaccount deletetest
kubectl delete serviceaccount deletetestK8s Role/ClusterRole created
Обнаруживает создание Role/ClusterRole по audit-логам. Используется для контроля изменений RBAC и выявления неожиданных расширений прав.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and kcreate and (clusterrole or role) and response_successful and not role_with_wildcard and not role_with_pod_exec and not role_with_write_privsСообщение
K8s Cluster Role Created (user=%ka.user.name role=%ka.target.name resource=%ka.target.resource rules=%ka.req.role.rules resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create role test1 --verb=create --resource=pods
kubectl delete role test1kubectl create clusterrole test2 --verb=get --resource=pods
kubectl delete clusterrole test2K8s Role/ClusterRole deleted
Обнаруживает удаление Role/ClusterRole по audit-логам. Может указывать на попытку скрыть следы, откат настроек или разрушение конфигурации доступа.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and kdelete and (clusterrole or role) and response_successful and not (ka.target.name startswith "system:")Сообщение
K8s Cluster Role Deleted (user=%ka.user.name role=%ka.target.name resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create role test1 --verb=create --resource=pods
kubectl delete role test1kubectl create clusterrole test2 --verb=create --resource=pods
kubectl delete clusterrole test2K8s ClusterRoleBinding created
Обнаруживает создание ClusterRoleBinding по audit-логам. ClusterRoleBinding изменяет назначение кластерных прав и может быть вектором эскалации привилегий.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and kcreate and clusterrolebinding and response_successful and not ka.req.binding.role=cluster-adminСообщение
K8s Cluster Role Binding Created (user=%ka.user.name binding=%ka.target.name resource=%ka.target.resource subjects=%ka.req.binding.subjects role=%ka.req.binding.role resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create clusterrolebinding view-binding --clusterrole=view --serviceaccount=default:test
kubectl delete clusterrolebinding view-bindingK8s ClusterRoleBinding deleted
Обнаруживает удаление ClusterRoleBinding по audit-логам. Может приводить к потере доступа или использоваться для сокрытия несанкционированных назначений.
- Источник: K8sAudit
- Теги:
fstec,rbac_drift - Уровень: Notice
Условие
kactivity and kdelete and clusterrolebinding and response_successfulСообщение
K8s Cluster Role Binding Deleted (user=%ka.user.name binding=%ka.target.name resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
Команды:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=default:test
kubectl delete clusterrolebinding cluster-admin-bindingRead below containerd images dir
Обнаруживает чтение файлов в каталоге containerd, связанном с данными контейнеров или CRI. Может указывать на попытку извлечения информации о контейнерах и образах или на нехарактерный доступ к данным рантайма.
- Источник: Syscall
- Теги:
fstec,container_image_access - Уровень: Notice
Условие
fd.name startswith /var/lib/containerd/io.containerd.grpc.v1.cri/containers/ and open_read and not (proc.name in (allowed_proc_names) or proc.pname in (allowed_proc_names) or containerd_allowed_paths)Сообщение
File below a known containerd directory opened for reading (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline proc.aname[1]=%proc.aname[1] gparent=%proc.aname[2] proc.aname[3]=%proc.aname[3] vpid=%proc.vpid container_id=%container.id image=%container.image.repository)Как протестировать
- Среда: хост
Команды:
mkdir -p /var/lib/containerd/io.containerd.grpc.v1.cri/containers
echo "Hello Falco!" > /var/lib/containerd/io.containerd.grpc.v1.cri/containers/testfile
cat /var/lib/containerd/io.containerd.grpc.v1.cri/containers/testfile
rm /var/lib/containerd/io.containerd.grpc.v1.cri/containers/testfileWrite below containerd images dir
Обнаруживает запись и изменение файлов в каталогах containerd. Может указывать на попытку подмены или повреждения данных рантайма, дрейф или атаки на цепочку поставки образов.
- Источник: Syscall
- Теги:
fstec,container_image_drift - Уровень: Error
Условие
fd.directory startswith /var/lib/containerd and open_write and not (proc.name in (allowed_proc_names) or proc.pname in (allowed_proc_names) or containerd_allowed_paths)Сообщение
File below a known containerd directory opened for writing (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline proc.aname[1]=%proc.aname[1] gparent=%proc.aname[2] proc.aname[3]=%proc.aname[3] vpid=%proc.vpid container_id=%container.id image=%container.image.repository)Как протестировать
- Среда: хост
Команды:
mkdir -p /var/lib/containerd/io.containerd.grpc.v1.cri/containers
echo Hello Falco! > /var/lib/containerd/io.containerd.grpc.v1.cri/containers/testfile
cat /var/lib/containerd/io.containerd.grpc.v1.cri/containers/testfile
rm /var/lib/containerd/io.containerd.grpc.v1.cri/containers/testfileContainer tag is not @sha256
Обнаруживает создание подов в системном неймспейсе с образом, не закреплённым по digest (@sha256:). Использование тегов без digest усложняет контроль целостности и повышает риск подмены образа.
- Источник: K8sAudit
- Теги:
fstec,integrity_control - Уровень: Notice
Условие
kactivity and kcreate and pod and response_successful and system_namespace and not (ka.req.container.image contains @sha256:) and not (ka.target.namespace="d8-system" and ka.target.name startswith "deckhouse-")Сообщение
Not all containers are running with the sha256 sum as a tag in a system namespace, which is a potential integrity control mechanism misconfiguration (user=%ka.user.name binding=%ka.target.name resource=%ka.target.resource resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason image=%ka.req.pod.containers.image sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])Как протестировать
- Среда: хост
- Условия:
bundle: CSE
Команды:
kubectl -n d8-system run test --image=ubuntu:latest -- /bin/sh -c "while true; do sleep 3600; done"
kubectl -n d8-system delete pod test --grace-period=0Inbound SSH Connection Attempt
Обнаруживает попытку входящего SSH-подключения на порт 22 на хосте. Включает неуспешные попытки аутентификации. Имя пользователя недоступно на этом этапе. Для получения имени пользователя при неуспешных попытках аутентификации настройте события безопасности на основе логов sshd.
- Источник: Syscall
- Теги:
fstec,auth_attempts - Уровень: Notice
Условие
evt.type in (accept,listen) and fd.sport=22 and proc.name=sshdСообщение
Inbound SSH Connection Attempt (src_ip=%fd.cip connection=%fd.name container_id=%container.id)Как протестировать
- Среда: хост
Команды:
rm -f ./ed25519*
ssh-keygen -t ed25519 -N '' -f ./id_ed25519 -q
kubectl apply -f -<<EOF
apiVersion: deckhouse.io/v1
kind: NodeUser
metadata:
name: falco-test
spec:
isSudoer: false
nodeGroups:
- '*'
sshPublicKeys:
- $(cat ./id_ed25519.pub)
uid: 1224
EOF
kubectl wait nodeuser/falco-test --for=jsonpath='{.metadata.name}'=falco-test --timeout=300s
sleep 60
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null falco-test@$(kubectl get nodes -l node.deckhouse.io/deckhouse-ready=true -o json | jq -r '.items[0].status.addresses[] | select(.type=="ExternalIP") | .address') -i ./id_ed25519 "ls -la && sleep 30"
kubectl delete nodeuser/falco-testInbound SSH Connection
Обнаруживает успешное входящее SSH-соединение на хосте. Срабатывает при запуске оболочки пользователя процессом sshd после успешной аутентификации. Имя пользователя разрешается через плагин k8s-nodeuser-info (nodeusers.deckhouse.io) по login UID; это работает только для пользователей, заведённых через Deckhouse NodeUser. Для остальных пользователей доступен только числовой UID — настройте события безопасности на основе логов sshd для получения имён пользователей вне NodeUser.
- Источник: Syscall
- Теги:
fstec,auth_attempts - Уровень: Notice
Условие
spawned_process and proc.pname=sshd and not proc.name in (sshd, ssh-keygen, sshd-keygen)Сообщение
Inbound SSH Connection (user=%user.name user_uid=%user.uid user_loginuid=%user.loginuid command=%proc.cmdline pid=%proc.pid shell=%proc.name parent=%proc.pname src_ip=%fd.cip connection=%fd.name container_id=%container.id)Как протестировать
- Среда: хост
Команды:
rm -f ./ed25519*
ssh-keygen -t ed25519 -N '' -f ./id_ed25519 -q
kubectl apply -f -<<EOF
apiVersion: deckhouse.io/v1
kind: NodeUser
metadata:
name: falco-test
spec:
isSudoer: false
nodeGroups:
- '*'
sshPublicKeys:
- $(cat ./id_ed25519.pub)
uid: 1224
EOF
kubectl wait nodeuser/falco-test --for=jsonpath='{.metadata.name}'=falco-test --timeout=300s
sleep 60
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null falco-test@$(kubectl get nodes -l node.deckhouse.io/deckhouse-ready=true -o json | jq -r '.items[0].status.addresses[] | select(.type=="ExternalIP") | .address') -i ./id_ed25519 "ls -la && sleep 30"
kubectl delete nodeuser/falco-testUnauthorized request to Kubernetes API
Обнаруживает запросы к Kubernetes API, завершившиеся 401 (Unauthorized), в audit-логах (исключая health и version эндпоинты). Может указывать на попытки подбора токенов, неправильную конфигурацию клиентов или активность злоумышленника.
- Источник: K8sAudit
- Теги:
fstec,auth_attempts - Уровень: Warning
Условие
ka.response.code=401 and not jevt.value[/requestURI] startswith /version and not jevt.value[/requestURI] in (/healthz, /readyz, /livez)Сообщение
Unauthorized K8s API request detected
user=%jevt.value[/user/username]
agents=%jevt.value[/userAgent]
verb=%jevt.value[/verb]
uri=%jevt.value[/requestURI]
src_ip=%jevt.value[/sourceIPs]
dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0]
dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0]Как протестировать
- Среда: хост
Команды:
curl -k https://$(kubectl -n default get svc kubernetes -o json | jq -r ".spec.clusterIP")/auth/test -H 'Authorization: Bearer TEST'Security Reports Created
Обнаруживает создание объектов security report (configauditreports/vulnerabilityreports). Может указывать на запуск сканирования, появление новых результатов по уязвимостям или активность, связанную с безопасностью контейнеров.
- Источник: K8sAudit
- Теги:
fstec,security_reports - Уровень: Notice
Условие
kevt and kcreate and ka.target.resource in (security_reports)Сообщение
K8s Security Reports Created. The report may contain vulnerability information. Check the object in the cluster (user=%ka.user.name, verb=%ka.verb, ns=%ka.target.namespace, resource=%ka.target.resource, object=%ka.target.name sourceIP=%jevt.value[/sourceIPs] dex_name=%jevt.value[/user/extra/user-authn.deckhouse.io~1name/0] dex_provider=%jevt.value[/user/extra/user-authn.deckhouse.io~1dex-provider/0])D8IntegrityCheck
Missing digital signature
Один из бинарных файлов системных компонентов Deckhouse не прошёл проверку цифровой подписи. Проверьте логи утилиты d8-bcheck и обратитесь в техническую поддержку.
- Источник: Syscall
- Теги:
integrity_check,subscription_check - Уровень: Error
Условие
open_write_append and bin_dir and proc_nameСообщение
Deckhouse binary %fd.name is missing a proper digital signatureEvent with deckhouse.io/signature annotation
Обнаружено событие Kubernetes API с аннотацией deckhouse.io/signature. Указывает, что в базе etcd найдены неподписанные объекты или объекты с невалидной подписью.
- Источник: K8sAudit
- Теги:
integrity_check,signature - Уровень: Notice
Условие
kevt and jevt.value[/annotations/deckhouse.io~1signature] existsСообщение
K8s audit event with deckhouse.io/signature annotation. Indicates that unsigned objects or objects with invalid signatures were found in the etcd database. (user=%ka.user.name verb=%ka.verb resource=%ka.target.resource object=%ka.target.name signature=%jevt.value[/annotations/deckhouse.io~1signature])