Deckhouse Kubernetes Platform (DKP) предоставляет встроенные средства поиска угроз безопасности за счёт анализа событий ядра Linux и аудита событий Kubernetes API. DKP позволяет:

  • находить угрозы в окружениях, анализируя приложения и контейнеры;
  • обнаруживать попытки применения уязвимостей из базы CVE и признаки запуска криптовалютных майнеров;
  • выявлять угрозы Kubernetes, включая:
    • оболочки командной строки, запущенные в контейнерах или подах;
    • контейнеры, работающие в привилегированном режиме;
    • монтирование небезопасных путей в контейнеры (например, /proc);
    • попытки чтения секретных данных (например, из /etc/shadow).

Источники данных для рантайм-аудита

DKP использует два основных источника событий:

Подробности об архитектуре рантайм-аудита можно найти в разделе «Архитектура рантайм-аудита».

Минимальные требования

Для получения событий ядра требуется:

  • ядро Linux версии 5.8 или выше;
  • поддержка eBPF. Проверить наличие поддержки можно одним из следующих способов:
    • убедитесь в наличии файла /sys/kernel/btf/vmlinux:

      ls -lah /sys/kernel/btf/vmlinux
      
    • убедитесь, что включён параметр CONFIG_DEBUG_INFO_BTF:

      grep -E "CONFIG_DEBUG_INFO_BTF=(y|m)" /boot/config-*
      

На каждом узле кластера запускаются агенты Falco, которые потребляют ресурсы в зависимости от количества применяемых правил или собираемых событий.

На некоторых системах могут не работать пробы eBPF.

Включение рантайм-аудита

Чтобы включить рантайм-аудит, выполните следующие шаги:

  1. Убедитесь, что узлы соответствуют минимальным требованиям.
  2. Включите модуль runtime-audit-engine, используя следующую конфигурацию:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: runtime-audit-engine
    spec:
      enabled: true
    
  3. (Опционально) Если control plane в кластере не управляется DKP при помощи control-plane-manager, настройте вебхук аудита API Kubernetes вручную.

Все доступные параметры рантайм-аудита доступны в разделе документации модуля runtime-audit-engine.

Настройка вебхука API Kubernetes вручную

Настройка вебхука не требуется, если включён модуль control-plane-manager. В этом случае при включении модуля runtime-audit-engine настройки сбора событий аудита API Kubernetes применятся автоматически.

Чтобы настроить вебхук на получение событий аудита от kube-apiserver, выполните следующие шаги:

  1. Создайте файл kubeconfig для вебхука с адресом https://127.0.0.1:9765/k8s-audit и данными сертификата (ca.crt) из Secret d8-runtime-audit-engine/runtime-audit-engine-webhook-tls.

    Пример:

    apiVersion: v1
    kind: Config
    clusters:
      - name: webhook
        cluster:
          certificate-authority-data: BASE64_CA
          server: "https://127.0.0.1:9765/k8s-audit"
    users:
      - name: webhook
    contexts:
      - context:
          cluster: webhook
          user: webhook
        name: webhook
    current-context: webhook
    
  2. Укажите путь к созданному файлу конфигурации с помощью флага --audit-webhook-config-file в манифесте kube-apiserver.
  3. (Опционально) Чтобы собирать события аудита API Kubernetes не только из системных, но и пользовательских неймспейсов, настройте политики аудита.

Работа с правилами аудита

Для анализа событий рантайм-аудита используются правила, определяющие критерии подозрительного поведения. В DKP предусмотрены:

  • встроенные правила, включая:
    • правила для аудита Kubernetes (располагаются в контейнере falco по пути /etc/falco/k8s_audit_rules.yaml);
    • правила, удовлетворяющие требованиям приказа ФСТЭК России №118 от 4 июля 2022 г. «Требования по безопасности информации к средствам контейнеризации» (fstec, в формате кастомного ресурса FalcoAuditRules);

    Чтобы настроить список встроенных правил, используйте параметр settings.builtInRulesList модуля runtime-audit-engine.

  • пользовательские правила, которые задаются через кастомный ресурс FalcoAuditRules.

Подробности о работе правил рантайм-аудита можно найти в разделе «Архитектура рантайм-аудита».

Добавление пользовательского правила

Чтобы добавить правило, создайте ресурс FalcoAuditRules с необходимыми условиями. Используйте синтаксис условий Falco. Агенты Falco автоматически применят созданное правило.

Пример:

apiVersion: deckhouse.io/v1alpha1
kind: FalcoAuditRules
metadata:
  name: ownership-permissions
spec:
  rules:
    - macro:
        name: spawned_process
        condition: (evt.type in (execve, execveat) and evt.dir=<)
    - rule:
        name: Detect Ownership Change
        desc: detect file permission/ownership change
        condition: >
          spawned_process and proc.name in (chmod, chown) and proc.args contains "/tmp/"
        output: >
          The file or directory below has had its permissions or ownership changed (user=%user.name
          command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2])
        priority: Warning
        tags: [filesystem]

Дополнительные примеры правил можно найти на следующих ресурсах:

Применение стороннего правила

Поскольку структура правил Falco отличается от схемы кастомных ресурсов DKP, сторонние правила из интернета необходимо сконвертировать в ресурс FalcoAuditRules перед применением.

Используйте следующий скрипт для конвертации:

git clone github.com/deckhouse/deckhouse
cd deckhouse/ee/modules/runtime-audit-engine/hack/far-converter
go run main.go -input /path/to/falco/rule_example.yaml > ./my-rules-cr.yaml

Пример результата работы скрипта:

  • Изначальное правило:

    # /path/to/falco/rule_example.yaml
    - macro: spawned_process
        condition: (evt.type in (execve, execveat) and evt.dir=<)
    
    - rule: Linux Cgroup Container Escape Vulnerability (CVE-2022-0492)
        desc: "This rule detects an attempt to exploit a container escape vulnerability in the Linux Kernel."
        condition: container.id != "" and proc.name = "unshare" and spawned_process and evt.args contains "mount" and evt.args contains "-o rdma" and evt.args contains "/release_agent"
        output: "Detect Linux Cgroup Container Escape Vulnerability (CVE-2022-0492) (user=%user.loginname uid=%user.loginuid command=%proc.cmdline args=%proc.args)"
        priority: CRITICAL
        tags: [process, mitre_privilege_escalation]
    
  • Ресурс с правилом после конвертации:

    # ./my-rules-cr.yaml
    apiVersion: deckhouse.io/v1alpha1
    kind: FalcoAuditRules
    metadata:
      name: rule-example
    spec:
      rules:
        - macro:
            name: spawned_process
            condition: (evt.type in (execve, execveat) and evt.dir=<)
        - rule:
            name: Linux Cgroup Container Escape Vulnerability (CVE-2022-0492)
            condition: container.id != "" and proc.name = "unshare" and spawned_process and evt.args contains "mount" and evt.args contains "-o rdma" and evt.args contains "/release_agent"
            desc: This rule detects an attempt to exploit a container escape vulnerability in the Linux Kernel.
            output: Detect Linux Cgroup Container Escape Vulnerability (CVE-2022-0492) (user=%user.loginname uid=%user.loginuid command=%proc.cmdline args=%proc.args)
            priority: Critical
            tags:
              - process
              - mitre_privilege_escalation
    

Сбор логов и оповещения

DKP экспортирует события рантайм-аудита в формате метрик Prometheus, по которым можно настроить сбор логов и оповещения с помощью ресурсов модулей log-shipper и observability. Это позволяет:

  • подключить внешнее хранилище для сбора логов (например, Loki или Elasticsearch);
  • настроить оповещения о критических событиях.

Настройка сбора логов и событий

Все события рантайм-аудита выводятся в stdout. Для сбора и отправки событий в хранилище логов создайте ресурс ClusterLoggingConfig, следуя примеру:

apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
  name: falco-events
spec:
  destinationRefs:
  - xxxx
  kubernetesPods:
    namespaceSelector:
      labelSelector:
        matchExpressions:
        - key: "kubernetes.io/metadata.name"
          operator: In
          values: [d8-runtime-audit-engine]
  labelFilter:
  - operator: Regex
    values: ["\\{.*"] # Для сбора логов только в формате JSON.
    field: "message"
  type: KubernetesPods

Настройка оповещений о критических событиях

Для создания оповещений о критических событиях:

  1. Убедитесь, что включён модуль observability.
  2. Создайте ресурс ClusterObservabilityMetricsRulesGroup или ObservabilityMetricsRulesGroup:

Пример конфигурации:

apiVersion: deckhouse.io/v1alpha1
kind: ClusterObservabilityMetricsRulesGroup
metadata:
  name: falco-critical-alerts
spec:
  groups:
    - name: falco-critical-alerts
      rules:
        - alert: FalcoCriticalAlertsAreFiring
          for: 1m
          annotations:
            description: |
              There is a suspicious activity on a node {{ $labels.node }}.
              Check your events journal for more details.
            summary: Falco detected a critical security incident.
          expr: |
            sum by (node) (rate(falcosecurity_falcosidekick_falco_events_total{priority="Critical"}[5m]) > 0)

Просмотр метрик

Для получения Prometheus-метрик используйте PromQL-запрос falcosecurity_falcosidekick_falco_events_total{}:

d8 k -n d8-monitoring exec -it prometheus-main-0 prometheus -- \
  curl -s "http://127.0.0.1:9090/api/v1/query?query=falcosecurity_falcosidekick_falco_events_total" | jq

Отладка и эмуляция событий

Для отладки и эмуляции событий рантайм-аудита в DKP можно использовать:

  • утилиту event-generator;
  • HTTP-эндпоинт /test сервиса falcosidekick.

Включение логов для отладки

В Falco по умолчанию используется отладочный уровень логирования debug.

В Falcosidekick по умолчанию отладочное логирование отключено. Для включения установите параметр spec.settings.debugLogging в true, следуя примеру:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: runtime-audit-engine
spec:
  version: 1
  enabled: true
  settings:
    debugLogging: true

Настройка эмуляции событий

Falco

Утилита event-generator позволяет генерировать различные подозрительные действия (например, системные вызовы или события аудита API Kubernetes).

Используйте следующую команду для запуска тестового набора событий в кластере Kubernetes:

d8 k run falco-event-generator --image=falcosecurity/event-generator run

Если вам нужно сымитировать определённое действие, обратитесь к руководству утилиты.

Falcosidekick

Чтобы имитировать отправку тестовых событий для сервиса falcosidekick, используйте HTTP-эндпоинт /test:

  1. Создайте тестовое событие, выполнив следующую команду:

    nsenter -t $(pidof falcosidekick) curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" http://localhost:2801/test
    
  2. Проверьте метрику события:

    d8 k -n d8-monitoring exec -it prometheus-main-0 prometheus -- \
      curl -s "http://127.0.0.1:9090/api/v1/query?query=falcosecurity_falcosidekick_falco_events_total" \
      | jq '.data.result.[] | select (.metric.priority_raw == "debug")'
    

    Пример вывода:

    {
      "metric": {
        "__name__": "falcosecurity_falcosidekick_falco_events_total",
        "container": "kube-rbac-proxy",
        "hostname": "falcosidekick",
        "instance": "192.168.208.7:4212",
        "job": "runtime-audit-engine",
        "node": "dev-master-0",
        "priority": "1",
        "priority_raw": "debug",
        "rule": "Test rule",
        "source": "internal",
        "tier": "cluster"
      },
      "value": [
        1744234729.799,
        "1"
      ]
    }
    

Дополнительные ресурсы