Стадия жизненного цикла модуля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 -h

Drop 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.sh

Container 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.sh

Container 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_exec

Modify 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/eviltwin

K8s 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=0

K8s 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=0

ServiceAccount 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-sa
kubectl -n kube-public create serviceaccount test-sa2
kubectl -n kube-public delete serviceaccount test-sa2
kubectl -n kube-system create serviceaccount test-sa3
kubectl -n kube-system delete serviceaccount test-sa3
kubectl -n d8-system create serviceaccount test-sa4
kubectl -n d8-system delete serviceaccount test-sa4

Attach 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-binding

ClusterRole 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-role1
kubectl create role test-role2 --verb=* --resource=pod
kubectl delete role test-role2
kubectl create role test-role3 --verb=* --resource=*
kubectl delete role test-role3

Attach/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=0

EphemeralContainers 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=0

ClusterRole 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-role
kubectl create clusterrole test-role2 --verb=create,delete --resource=pods
kubectl delete clusterrole test-role2

ClusterRole 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-user
kubectl 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-user

System 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:test1
kubectl -n kube-system create clusterrole system:test2 --verb=create --resource=pods
kubectl -n kube-system delete clusterrole system:test2

K8s 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 test

K8s 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 deletetest

K8s 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 test1
kubectl create clusterrole test2 --verb=get --resource=pods
kubectl delete clusterrole test2

K8s 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 test1
kubectl create clusterrole test2 --verb=create --resource=pods
kubectl delete clusterrole test2

K8s 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-binding

K8s 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-binding

Read 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/testfile

Write 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/testfile

Container 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=0

Inbound 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-test

Inbound 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-test

Unauthorized 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 signature

Event 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])