Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки

Встроенные правила аудита

Сводная таблица

Набор правил Правило Описание Уровень Источник Теги
fstec Launch Package Management Process in container Обнаруживает запуск процесса управления пакетами (apt/yum/dnf/apk и т. п.) внутри контейнера. Часто указывает на дрейф контейнера, установку инструментов в рантайме или пост-компрометационные действия. Error fstec, container_drift
fstec Drop and execute new binary in container Обнаруживает запуск исполняемого файла в контейнере, который отсутствует в базовом образе (исполняемый файл из верхнего слоя overlayfs). Типичный признак «drop & execute» после получения доступа к контейнеру. Critical fstec, container_drift
fstec Container drift detected (chmod) Обнаруживает изменение прав (chmod) внутри контейнера, приводящее к появлению/активации исполняемого файла. Может указывать на дрейф контейнера или попытку подготовки вредоносного инструмента к запуску. Error fstec, container_drift
fstec Container drift detected (open+create) Обнаруживает создание исполняемого файла внутри контейнера через open/create с последующим выполнением. Часто встречается при дрейфе контейнера или при загрузке и запуске вредоносных бинарных файлов. Error fstec, container_drift
fstec Modify binary dirs Обнаруживает переименование/удаление файлов в стандартных каталогах бинарных файлов (/bin, /sbin, /usr/bin, /usr/sbin) внутри контейнера. Может указывать на попытку подмены системных утилит или скрытия следов. Error fstec, container_drift
fstec K8s Pod created Обнаруживает успешное создание Pod в Kubernetes по audit-логам. Полезно для контроля появления новых рабочих нагрузок и расследования неожиданных запусков. Informational K8sAudit fstec, container_drift
fstec K8s Pod deleted Обнаруживает успешное удаление Pod в Kubernetes по audit-логам. Полезно для выявления саботажа, попыток скрыть активность и анализа инцидентов. Informational K8sAudit fstec, container_drift
fstec ServiceAccount created in a system namespace Обнаруживает создание ServiceAccount в системных namespace (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 к Pod (subresource exec/attach) по audit-логам. Может указывать на интерактивный доступ к контейнеру и возможные ручные действия в рантайме. Notice K8sAudit fstec, container_image_access
fstec EphemeralContainers created Обнаруживает добавление ephemeral containers в Pod. Эфемерные контейнеры часто используют для отладки, но также могут применяться злоумышленниками для скрытого доступа. 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 с доступом к pods/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 вне системных namespace. Может быть нормой для приложений, но также используется для подготовки доступа и дальнейшей выдачи 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 fstec, container_image_access
fstec Write below containerd images dir Обнаруживает запись/изменение файлов в каталогах containerd. Может указывать на попытку подмены/повреждения данных рантайма, дрейф или атаки на цепочку поставки образов. Error fstec, container_image_drift
fstec Container tag is not @sha256 Обнаруживает создание Pod в системном namespace с образом, не закреплённым по digest (@sha256:). Использование тегов без digest усложняет контроль целостности и повышает риск подмены образа. Notice K8sAudit fstec, integrity_control
fstec Inbound SSH Connection Обнаруживает входящее SSH-соединение на порт 22 на хосте. Может быть легитимным администрированием, но также часто используется для первоначального доступа и требует расследования. Notice 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

Наборы правил

fstec

Launch Package Management Process in container

Обнаруживает запуск процесса управления пакетами (apt/yum/dnf/apk и т. п.) внутри контейнера. Часто указывает на дрейф контейнера, установку инструментов в рантайме или пост-компрометационные действия.

  • Теги: 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 & execute» после получения доступа к контейнеру.

  • Теги: 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) внутри контейнера, приводящее к появлению/активации исполняемого файла. Может указывать на дрейф контейнера или попытку подготовки вредоносного инструмента к запуску.

  • Теги: 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 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 с последующим выполнением. Часто встречается при дрейфе контейнера или при загрузке и запуске вредоносных бинарных файлов.

  • Теги: 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 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) внутри контейнера. Может указывать на попытку подмены системных утилит или скрытия следов.

  • Теги: 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

Обнаруживает успешное создание Pod в 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

Обнаруживает успешное удаление Pod в 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 в системных namespace (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 к Pod (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 в Pod. Эфемерные контейнеры часто используют для отладки, но также могут применяться злоумышленниками для скрытого доступа.

  • Источник: 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 с доступом к pods/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 вне системных namespace. Может быть нормой для приложений, но также используется для подготовки доступа и дальнейшей выдачи 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. Может указывать на попытку извлечения информации о контейнерах/образах или на нехарактерный доступ к данным рантайма.

  • Теги: 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 (alllowd_proc_names) or proc.pname in (alllowd_proc_names))

Сообщение

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 gparent=%proc.aname[2] 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. Может указывать на попытку подмены/повреждения данных рантайма, дрейф или атаки на цепочку поставки образов.

  • Теги: fstec, container_image_drift
  • Уровень: Error

Условие

fd.directory startswith /var/lib/containerd and open_write and not (proc.name in (alllowd_proc_names) or proc.pname in (alllowd_proc_names))

Сообщение

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 gparent=%proc.aname[2] 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

Обнаруживает создание Pod в системном namespace с образом, не закреплённым по 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

Обнаруживает входящее SSH-соединение на порт 22 на хосте. Может быть легитимным администрированием, но также часто используется для первоначального доступа и требует расследования.

  • Теги: fstec, auth_attempts
  • Уровень: Notice

Условие

evt.type in (accept,listen) and fd.sport=22

Сообщение

Inbound SSH Connection (command=%proc.cmdline pid=%proc.pid connection=%fd.name user=%user.name user_loginuid=%user.loginuid type=%evt.type src_ip=%fd.cip 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])