Стадия жизненного цикла модуля: Общедоступная версия

У модуля есть требования для установки

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

Набор правил Правило Описание Уровень Источник Теги
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)

Как протестировать

  • Среда: контейнер

Команды:

cp /bin/echo /tmp/falco-drop-exec
/tmp/falco-drop-exec Hello, Falco!

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/falco-chmod.sh
chmod +x /tmp/falco-chmod.sh
/tmp/falco-chmod.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)

Как протестировать

  • Среда: контейнер

Команды:

# The file is created anew: an open of an existing file creates no executable.
rm -f /tmp/falco-drift-exec
cat << 'EOF' > /tmp/falco-drift.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/falco-drift-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/falco-drift.c -o /tmp/falco-drift
/tmp/falco-drift

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/falco-evil
mv /usr/bin/falco-evil /usr/bin/falco-eviltwin
rm -f /usr/bin/falco-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])

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete pod falco-pod-created --ignore-not-found --grace-period=0 >/dev/null 2>&1 || true' EXIT
kubectl run falco-pod-created --image=mirror.gcr.io/library/alpine:3.22 -- /bin/sh -c "while true; do sleep 3600; done"
kubectl delete pod falco-pod-created --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])

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete pod falco-pod-deleted --ignore-not-found --grace-period=0 >/dev/null 2>&1 || true' EXIT
kubectl run falco-pod-deleted --image=mirror.gcr.io/library/alpine:3.22 -- /bin/sh -c "while true; do sleep 3600; done"
kubectl delete pod falco-pod-deleted --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])

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl -n default delete serviceaccount falco-system-sa-1 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl -n default create serviceaccount falco-system-sa-1
kubectl -n default delete serviceaccount falco-system-sa-1
trap 'kubectl -n kube-public delete serviceaccount falco-system-sa-2 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl -n kube-public create serviceaccount falco-system-sa-2
kubectl -n kube-public delete serviceaccount falco-system-sa-2
trap 'kubectl -n kube-system delete serviceaccount falco-system-sa-3 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl -n kube-system create serviceaccount falco-system-sa-3
kubectl -n kube-system delete serviceaccount falco-system-sa-3
trap 'kubectl -n d8-system delete serviceaccount falco-system-sa-4 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl -n d8-system create serviceaccount falco-system-sa-4
kubectl -n d8-system delete serviceaccount falco-system-sa-4

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete clusterrolebinding falco-cluster-admin-binding --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrolebinding falco-cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=default:test
kubectl delete clusterrolebinding falco-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])

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete role falco-wildcard-role-1 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create role falco-wildcard-role-1 --verb=create --resource=*
kubectl delete role falco-wildcard-role-1
trap 'kubectl delete role falco-wildcard-role-2 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create role falco-wildcard-role-2 --verb=* --resource=pod
kubectl delete role falco-wildcard-role-2
trap 'kubectl delete role falco-wildcard-role-3 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create role falco-wildcard-role-3 --verb=* --resource=*
kubectl delete role falco-wildcard-role-3

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

Как протестировать

  • Среда: хост

Команды:

cleanup() {
  kubectl delete rolebinding falco-exec-user-exec falco-exec-user-pods --ignore-not-found
  kubectl delete role falco-exec-user-exec falco-exec-user-pods --ignore-not-found
  kubectl delete serviceaccount falco-exec-user --ignore-not-found
  kubectl delete pod falco-exec-target --ignore-not-found --grace-period=0
}
# kubectl in a pod drops its in-cluster configuration once --as is given
# and sends the request to http://localhost:8080, so name the API server and the token.
kubectl_as() {
  as=$1
  shift
  sa=/var/run/secrets/kubernetes.io/serviceaccount
  kubectl --server="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" --certificate-authority="$sa/ca.crt" --token="$(cat "$sa/token")" --as="$as" "$@"
}
trap 'cleanup >/dev/null 2>&1 || true' EXIT
kubectl run falco-exec-target --image=mirror.gcr.io/library/ubuntu:24.04 -- /bin/sh -c "while true; do sleep 3600; done"
kubectl create serviceaccount falco-exec-user
kubectl create role falco-exec-user-pods --verb=get,list --resource=pods
kubectl create role falco-exec-user-exec --verb=create,get --resource=pods/exec,pods/attach
kubectl create rolebinding falco-exec-user-pods --role=falco-exec-user-pods --serviceaccount=default:falco-exec-user
kubectl create rolebinding falco-exec-user-exec --role=falco-exec-user-exec --serviceaccount=default:falco-exec-user
kubectl wait pod/falco-exec-target --for=condition=Ready --timeout=60s
kubectl_as system:serviceaccount:default:falco-exec-user exec falco-exec-target -- ls

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete pod falco-debug-target --ignore-not-found --grace-period=0 >/dev/null 2>&1 || true' EXIT
kubectl run falco-debug-target --image=mirror.gcr.io/library/ubuntu:24.04 -- /bin/sh -c "while true; do sleep 3600; done"
kubectl wait pod/falco-debug-target --for=condition=Ready --timeout=60s
kubectl debug falco-debug-target --image=mirror.gcr.io/library/alpine:3.22 --target=falco-debug-target

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete role falco-write-role --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create role falco-write-role --verb=create,delete --resource=pods
kubectl delete role falco-write-role
trap 'kubectl delete clusterrole falco-write-clusterrole --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrole falco-write-clusterrole --verb=create,delete --resource=pods
kubectl delete clusterrole falco-write-clusterrole

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

Как протестировать

  • Среда: хост

Команды:

cleanup() {
  kubectl delete role falco-pod-exec-role --ignore-not-found
  kubectl delete rolebinding falco-role-manager falco-role-pod-exec --ignore-not-found
  kubectl delete role falco-role-manager falco-role-pod-exec --ignore-not-found
}
# kubectl in a pod drops its in-cluster configuration once --as is given
# and sends the request to http://localhost:8080, so name the API server and the token.
kubectl_as() {
  as=$1
  shift
  sa=/var/run/secrets/kubernetes.io/serviceaccount
  kubectl --server="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" --certificate-authority="$sa/ca.crt" --token="$(cat "$sa/token")" --as="$as" "$@"
}
trap 'cleanup >/dev/null 2>&1 || true' EXIT
kubectl create role falco-role-manager --verb=create,delete --resource=roles
kubectl create role falco-role-pod-exec --verb=create --resource=pods/exec
kubectl create rolebinding falco-role-manager --role=falco-role-manager --serviceaccount=default:falco-role-user
kubectl create rolebinding falco-role-pod-exec --role=falco-role-pod-exec --serviceaccount=default:falco-role-user
if ! kubectl_as system:serviceaccount:default:falco-role-user create role falco-pod-exec-role --verb=create --resource=pods/exec; then
  echo "system:serviceaccount:default:falco-role-user could not create the role falco-pod-exec-role with pods/exec" >&2
  exit 1
fi
kubectl_as system:serviceaccount:default:falco-role-user delete role falco-pod-exec-role
cleanup() {
  kubectl delete clusterrole falco-pod-exec-clusterrole --ignore-not-found
  kubectl delete clusterrolebinding falco-clusterrole-manager falco-clusterrole-pod-exec --ignore-not-found
  kubectl delete clusterrole falco-clusterrole-manager falco-clusterrole-pod-exec --ignore-not-found
}
# kubectl in a pod drops its in-cluster configuration once --as is given
# and sends the request to http://localhost:8080, so name the API server and the token.
kubectl_as() {
  as=$1
  shift
  sa=/var/run/secrets/kubernetes.io/serviceaccount
  kubectl --server="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" --certificate-authority="$sa/ca.crt" --token="$(cat "$sa/token")" --as="$as" "$@"
}
trap 'cleanup >/dev/null 2>&1 || true' EXIT
kubectl create clusterrole falco-clusterrole-manager --verb=create,delete --resource=clusterroles
kubectl create clusterrole falco-clusterrole-pod-exec --verb=create --resource=pods/exec
kubectl create clusterrolebinding falco-clusterrole-manager --clusterrole=falco-clusterrole-manager --serviceaccount=default:falco-clusterrole-user
kubectl create clusterrolebinding falco-clusterrole-pod-exec --clusterrole=falco-clusterrole-pod-exec --serviceaccount=default:falco-clusterrole-user
if ! kubectl_as system:serviceaccount:default:falco-clusterrole-user create clusterrole falco-pod-exec-clusterrole --verb=create --resource=pods/exec; then
  echo "system:serviceaccount:default:falco-clusterrole-user could not create the clusterrole falco-pod-exec-clusterrole with pods/exec" >&2
  exit 1
fi
kubectl_as system:serviceaccount:default:falco-clusterrole-user delete clusterrole falco-pod-exec-clusterrole

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl -n kube-system delete role system:test1 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl -n kube-system create role system:test1 --verb=create --resource=pods
kubectl -n kube-system delete role system:test1
trap 'kubectl delete clusterrole system:test2 --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrole system:test2 --verb=create --resource=pods
kubectl 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])

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete namespace falco-sa-created --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl get namespace falco-sa-created >/dev/null 2>&1 || kubectl create namespace falco-sa-created
kubectl -n falco-sa-created create serviceaccount falco-sa-created
kubectl -n falco-sa-created delete serviceaccount falco-sa-created

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 annotate moduleconfig runtime-audit-engine falco-test.deckhouse.io/touched=true --overwrite
kubectl annotate moduleconfig runtime-audit-engine falco-test.deckhouse.io/touched-

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete serviceaccount falco-sa-deleted --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create serviceaccount falco-sa-deleted
kubectl delete serviceaccount falco-sa-deleted

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete role falco-role-created --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create role falco-role-created --verb=get --resource=pods
kubectl delete role falco-role-created
trap 'kubectl delete clusterrole falco-clusterrole-created --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrole falco-clusterrole-created --verb=get --resource=pods
kubectl delete clusterrole falco-clusterrole-created

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete role falco-role-deleted --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create role falco-role-deleted --verb=create --resource=pods
kubectl delete role falco-role-deleted
trap 'kubectl delete clusterrole falco-clusterrole-deleted --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrole falco-clusterrole-deleted --verb=create --resource=pods
kubectl delete clusterrole falco-clusterrole-deleted

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete clusterrolebinding falco-crb-created --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrolebinding falco-crb-created --clusterrole=view --serviceaccount=default:test
kubectl delete clusterrolebinding falco-crb-created

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

Как протестировать

  • Среда: хост

Команды:

trap 'kubectl delete clusterrolebinding falco-crb-deleted --ignore-not-found >/dev/null 2>&1 || true' EXIT
kubectl create clusterrolebinding falco-crb-deleted --clusterrole=view --serviceaccount=default:test
kubectl delete clusterrolebinding falco-crb-deleted

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/falco-read-test
cat /var/lib/containerd/io.containerd.grpc.v1.cri/containers/falco-read-test
rm /var/lib/containerd/io.containerd.grpc.v1.cri/containers/falco-read-test

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/falco-write-test
cat /var/lib/containerd/io.containerd.grpc.v1.cri/containers/falco-write-test
rm /var/lib/containerd/io.containerd.grpc.v1.cri/containers/falco-write-test

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

Команды:

trap 'kubectl -n d8-system delete pod falco-tag-not-sha256 --ignore-not-found --grace-period=0 >/dev/null 2>&1 || true' EXIT
kubectl -n d8-system run falco-tag-not-sha256 --image=mirror.gcr.io/library/ubuntu:24.04 --override-type=strategic --overrides='{"spec":{"securityContext":{"runAsNonRoot":true,"runAsUser":65534,"seccompProfile":{"type":"RuntimeDefault"}},"containers":[{"name":"falco-tag-not-sha256","securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]}}}]}}' -- /bin/sh -c "while true; do sleep 3600; done"
kubectl -n d8-system delete pod falco-tag-not-sha256 --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)

Как протестировать

  • Среда: хост

Команды:

set -eu

USER_NAME=falco-test-attempt
KEY=./id_ed25519_attempt

rm -f "$KEY" "$KEY.pub"
ssh-keygen -t ed25519 -N '' -f "$KEY" -q

kubectl apply -f -<<EOF
apiVersion: deckhouse.io/v1
kind: NodeUser
metadata:
  name: $USER_NAME
spec:
  isSudoer: false
  nodeGroups:
  - '*'
  sshPublicKeys:
  - $(cat "$KEY.pub")
  uid: 1224
EOF

trap 'kubectl delete nodeuser/$USER_NAME --ignore-not-found >/dev/null 2>&1 || true' EXIT

# A node without an ExternalIP is reached at its InternalIP, which a pod can reach too.
NODE_IP=$(kubectl get nodes -l node.deckhouse.io/deckhouse-ready=true -o json | jq -r '[.items[].status.addresses[]? | select(.type=="ExternalIP") | .address] + [.items[].status.addresses[]? | select(.type=="InternalIP") | .address] | .[0] // empty')
if [ -z "$NODE_IP" ]; then
  echo "no Ready node exposes an ExternalIP or an InternalIP, cannot test inbound SSH" >&2
  exit 1
fi

# Provisioning the NodeUser onto the node is asynchronous, and the object
# carries no condition to wait on - "kubectl wait --for=jsonpath=
# '{.metadata.name}'=$USER_NAME" only asserts the name equals itself and
# returns at once. So poll the login instead of sleeping a fixed guess:
# until the key reaches the node the login gets refused, which produces a
# connection attempt but no shell, and reports as "Cmd: OK, Log: FAIL".
i=0
until ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=10 -i "$KEY" "$USER_NAME@$NODE_IP" true 2>/dev/null; do
  i=$((i + 1))
  if [ "$i" -ge 30 ]; then
    echo "$USER_NAME could not log in to $NODE_IP after $((i * 10))s; the NodeUser never reached the node" >&2
    exit 1
  fi
  sleep 10
done

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -i "$KEY" "$USER_NAME@$NODE_IP" "ls -la && sleep 30"

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)

Как протестировать

  • Среда: хост

Команды:

set -eu

USER_NAME=falco-test-login
KEY=./id_ed25519_login

rm -f "$KEY" "$KEY.pub"
ssh-keygen -t ed25519 -N '' -f "$KEY" -q

kubectl apply -f -<<EOF
apiVersion: deckhouse.io/v1
kind: NodeUser
metadata:
  name: $USER_NAME
spec:
  isSudoer: false
  nodeGroups:
  - '*'
  sshPublicKeys:
  - $(cat "$KEY.pub")
  uid: 1225
EOF

trap 'kubectl delete nodeuser/$USER_NAME --ignore-not-found >/dev/null 2>&1 || true' EXIT

# A node without an ExternalIP is reached at its InternalIP, which a pod can reach too.
NODE_IP=$(kubectl get nodes -l node.deckhouse.io/deckhouse-ready=true -o json | jq -r '[.items[].status.addresses[]? | select(.type=="ExternalIP") | .address] + [.items[].status.addresses[]? | select(.type=="InternalIP") | .address] | .[0] // empty')
if [ -z "$NODE_IP" ]; then
  echo "no Ready node exposes an ExternalIP or an InternalIP, cannot test inbound SSH" >&2
  exit 1
fi

# Provisioning the NodeUser onto the node is asynchronous, and the object
# carries no condition to wait on - "kubectl wait --for=jsonpath=
# '{.metadata.name}'=$USER_NAME" only asserts the name equals itself and
# returns at once. So poll the login instead of sleeping a fixed guess:
# until the key reaches the node the login gets refused, which produces a
# connection attempt but no shell, and reports as "Cmd: OK, Log: FAIL".
i=0
until ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=10 -i "$KEY" "$USER_NAME@$NODE_IP" true 2>/dev/null; do
  i=$((i + 1))
  if [ "$i" -ge 30 ]; then
    echo "$USER_NAME could not log in to $NODE_IP after $((i * 10))s; the NodeUser never reached the node" >&2
    exit 1
  fi
  sleep 10
done

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -i "$KEY" "$USER_NAME@$NODE_IP" "ls -la && sleep 30"

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