Стадия жизненного цикла модуля: Общедоступная версия
У модуля есть требования для установки
Карта runtime-поведения — это предварительная функция, по умолчанию она отключена.
Для хранения поведенческих моделей модуль использует собственную встроенную базу данных вместо etcd кластера. Для данных модуля используйте блочные сетевые или локальные устройства или localpath. Не используйте StorageClass на базе сетевых файловых хранилищ, например NFS, S3 или CephFS.
Параметр apiServerStorageClass задаёт StorageClass для security-storage. Размер PVC задаётся параметром securityStoragePVCRequest (по умолчанию 10 ГиБ).
Помимо статического сканирования (уязвимости образов, аудит конфигурации, CIS) модуль может наблюдать, что каждая нагрузка делает в runtime, и превращать эти наблюдения в карту по каждому ворклоаду.
Что содержит карта
При включении на каждом узле работает лёгкий агент, который наблюдает за поведением каждого контейнера с помощью eBPF — без каких-либо изменений в ваших нагрузках. Наблюдения агрегируются по ворклоадам (Deployment, DaemonSet, StatefulSet, …) в два объекта:
ApplicationProfile— отпечаток приложения: какие процессы запускает нагрузка, какие файлы открывает, какие Linux capabilities и системные вызовы использует.NetworkNeighborhood— карта сети: входящие и исходящие соединения нагрузки по узлам-соседям и портам.
Вместе они отвечают на вопрос «что эта нагрузка на самом деле делает и с кем общается?» — на основе данных, наблюдаемых в работающем кластере, а не предполагаемых по манифестам.
Требования
- Ядра узлов должны быть Linux 5.4 или новее и предоставлять BTF в
/sys/kernel/btf/vmlinux(стандартно для актуальных образов ОС узлов DKP). - Агент работает привилегированно с доступом к host PID. По умолчанию он запускается на всех узлах; ограничьте его параметром
nodeAgent.nodeSelector, если часть узлов не удовлетворяет требованию к ядру. ОпциональныеnodeAgent.tolerationsуправляют запуском на узлах с taint.
Включение
Включите карту runtime-поведения в ModuleConfig operator-trivy:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: operator-trivy
spec:
settings:
nodeAgent:
enabled: true
learningPeriod: "1h"
version: 2learningPeriod задаёт, сколько времени нагрузка наблюдается, прежде чем её профиль считается завершённым. В течение этого окна карта продолжает вбирать вновь увиденное поведение; после — профиль фиксируется. Для нагрузок, поведение которых меняется в течение суток, используйте большее значение (например, 24h).
Просмотр карты
Объекты карты — неймспейсные, рядом с нагрузками, которые они описывают:
# Отпечатки приложений по всему кластеру
d8 k get applicationprofiles -A
# Карты сети по всему кластеру
d8 k get networkneighborhoods -A
# Полный отпечаток для одной нагрузки
d8 k get applicationprofile -n my-namespace <name> -o yamlЗаписанные детали (процессы, файлы, capabilities, соединения) возвращает только пообъектный get … -o yaml. Списочный get applicationprofiles -A перечисляет объекты, но опускает эти поля ради производительности, поэтому он всегда выглядит «пустым» — для просмотра самой карты используйте именованный -o yaml.
Данные начинают появляться в течение пары минут после старта контейнера; профиль продолжает расти и помечается завершённым по истечении периода обучения. Дайте только что включённой нагрузке хотя бы learningPeriod, прежде чем ожидать полную карту.
Генерация least-privilege политик
Когда карта нагрузки построена, модуль может превратить её в least-privilege политики. Включите одно или оба:
spec:
settings:
nodeAgent:
enabled: true
generatePolicies:
networkPolicy: true
seccomp: true
version: 2Сетевые политики
При networkPolicy: true из наблюдаемого NetworkNeighborhood каждой нагрузки вычисляется GeneratedNetworkPolicy — готовая к проверке Kubernetes NetworkPolicy, описывающая ровно тот трафик, который у нагрузки наблюдался.
d8 k get generatednetworkpolicies -A
d8 k get generatednetworkpolicy -n my-namespace <name> -o yamlОбъект содержит стандартную NetworkPolicy в .spec. Проверьте её, затем извлеките и примените, чтобы обеспечить least privilege:
d8 k get generatednetworkpolicy -n my-namespace <name> \
-o json | jq '.spec' | d8 k apply -f -Seccomp-профили
При seccomp: true из наблюдаемых системных вызовов каждой нагрузки генерируется SeccompProfile.
d8 k get seccompprofiles -A
d8 k get seccompprofile -n my-namespace <name> -o yamlСохраните профиль в каталог seccomp kubelet на каждом узле (например, с помощью Security Profiles Operator), затем сошлитесь на него из пода:
spec:
securityContext:
seccompProfile:
type: Localhost
localhostProfile: operator-trivy/<name>.jsonВсегда проверяйте сгенерированную политику перед её применением. Профиль отражает только то поведение, которое наблюдалось в период обучения; редко используемые ветки кода могут отсутствовать, поэтому сначала проверьте под характерной нагрузкой.