Приём результатов соответствия Kyverno
Приём результатов соответствия Kyverno
Принимайте результаты соответствия Kyverno в Ключ-АСТРОМ как события безопасности. С контекстом времени выполнения от Ключ-АСТРОМ вы можете анализировать результаты политик Kubernetes вместе с сервисами и рабочими нагрузками, на которые они влияют.
Начало работы
Обзор
Интеграция Ключ-АСТРОМ с Kyverno позволяет унифицировать и контекстуализировать результаты политик и соответствия Kubernetes с другими данными безопасности на платформе Ключ-АСТРОМ.
Kyverno — это нативный для Kubernetes движок политик, который проверяет, изменяет и генерирует конфигурации ресурсов. Когда проверяющие политики развёрнуты в кластере, Kyverno оценивает целевые ресурсы и создаёт стандартизированные отчёты OpenReports.
Эта интеграция развёртывает пользовательский дистрибутив OpenTelemetry Collector, который читает OpenReports Kyverno, преобразует результаты политик в события безопасности Ключ-АСТРОМ и отправляет их в конечную точку приёма событий безопасности OpenPipeline.
Ключ-АСТРОМ сопоставляет принятые данные с сущностями времени выполнения, которые являются частью вашей контролируемой среды, для унифицированного анализа, приоритизации и оркестрации.
Варианты использования
С принятыми данными вы можете реализовать различные сценарии, такие как:
- Визуализация и анализ результатов безопасности
- Обнаружение пробелов в покрытии результатов безопасности
- Автоматизация и оркестрация результатов безопасности
Требования
Ниже приведены требования для Kyverno и Kubernetes, а также Ключ-АСТРОМ.
Требования Kyverno и Kubernetes
- Работающий кластер Kubernetes версии 1.26 или новее.
kubectl, настроенный с разрешениями на создание ресурсовClusterRoleиClusterRoleBinding.- Helm 3 или 4.
- Kyverno, установленный с включёнными OpenReports.
- Развёрнутые в кластере проверяющие политики Kyverno.
Включение OpenReports и настройка метрик Kyverno Включите OpenReports и настройте контроллеры Kyverno на отправку метрик через OTLP gRPC со следующими минимальными значениями Helm:
openreports:
enabled: true
installCrds: true
admissionController:
metering:
disabled: false
config: grpc
port: 4317
collector: otel-collector.astromkey.svc.cluster.local
backgroundController:
metering:
disabled: false
config: grpc
port: 4317
collector: otel-collector.astromkey.svc.cluster.local
cleanupController:
metering:
disabled: false
config: grpc
port: 4317
collector: otel-collector.astromkey.svc.cluster.local
reportsController:
metering:
disabled: false
config: grpc
port: 4317
collector: otel-collector.astromkey.svc.cluster.local
Требования Ключ-АСТРОМ
Сгенерируйте токен платформы или классический токен доступа и сохраните его для дальнейшего использования.
| Область токена платформы | Область классического токена доступа | Назначение |
|---|---|---|
openpipeline:security.events:ingest
|
openpipeline.events_security
|
Приём событий безопасности через /platform/ingest/v1/security.events.
|
openpipeline:metrics:ingest
|
metrics.ingest
|
Отправка метрик OTLP в Ключ-АСТРОМ. |
openpipeline:logs:ingest
|
logs.ingest
|
Отправка логов OTLP в Ключ-АСТРОМ. |
openpipeline:traces:ingest
|
openTelemetryTrace.ingest
|
Отправка трассировок OTLP в Ключ-АСТРОМ. |
Активация и настройка
Чтобы интегрировать OpenReports Kyverno с Ключ-АСТРОМ, разверните пользовательский Коллектор событий безопасности Ключ-АСТРОМ в вашем кластере Kubernetes.
Требуемый образ коллектора доступен по адресу:
ghcr.io/astromkey-oss/astromkey-security-events-collector:latest
Этот образ коллектора может принимать, анализировать и преобразовывать OpenReports Kyverno в события безопасности Ключ-АСТРОМ, которые соответствуют Семантическому словарю Ключ-АСТРОМ.
Используйте один из следующих подходов к развёртыванию.
OpenTelemetry Operator
Рекомендуется
Используйте этот вариант, если у вас уже установлен OpenTelemetry Operator или вы предпочитаете управление жизненным циклом на основе CRD.
1. Подготовьте среду
Создайте пространство имён.
kubectl create namespace astromkey
Создайте секрет Kubernetes с вашей конечной точкой Ключ-АСТРОМ, API-токеном и именем кластера.
kubectl -n astromkey create secret generic astromkey-secrets \
--from-literal=endpoint=https://<your-environment>.astromkey.com \ --from-literal=api-token=dt0XXX.XXXXXXXX \ --from-literal=cluster-name=<your-cluster-name>
Замените:
<your-environment>на вашу среду Ключ-АСТРОМ.dt0XXX.XXXXXXXXна токен платформы или классический токен доступа, который вы сгенерировали для этой интеграции.<your-cluster-name>на имя, идентифицирующее этот кластер в Ключ-АСТРОМ (например,prod-eu-1). Имя кластера необязательно, но рекомендуется для многое кластерных конфигураций.
Примените разрешения RBAC.
curl -O https://raw.githubusercontent.com/astromkey-oss/astromkey-security-events-collector/refs/heads/master/manifests/rbac.yaml kubectl apply -f rbac.yaml
2. Установите OpenTelemetry Operator Пропустите этот шаг, если OpenTelemetry Operator уже установлен в вашем кластере.
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts helm install opentelemetry-operator open-telemetry/opentelemetry-operator \ --namespace opentelemetry-operator-system --create-namespace
3. Разверните коллектор
Файл openTelemetry-manifest_statefulset.yaml определяет пользовательский ресурс OpenTelemetryCollector, которым управляет оператор.
curl -O https://raw.githubusercontent.com/astromkey-oss/astromkey-security-events-collector/refs/heads/master/manifests/openTelemetry-manifest_statefulset.yaml kubectl apply -f openTelemetry-manifest_statefulset.yaml
Используйте пользовательский образ коллектора с ghcr.io/astromkey-oss/astromkey-security-events-collector:latest. Стандартный образ OpenTelemetry Collector не включает необходимые плагины Security Event Processor и Exporter.
4. Проверьте развёртывание
Проверьте статус пода.
kubectl -n astromkey get pods
Вы должны увидеть под с именем security-events-collector-* со статусом Running.
Проверьте логи.
kubectl -n astromkey logs -l app.kubernetes.io/name=security-events-collector --tail=50
Ищите строки логов, в которых упоминается обработка OpenReports и экспорт событий.
Проверьте события в Ключ-АСТРОМ.
После того как первые результаты будут отправлены, выполните следующий запрос в Notebooks:
fetch security.events
| filter dt.system.bucket == "default_securityevents"
| filter event.kind == "SECURITY_EVENT"
AND event.provider == "Kyverno"
AND event.type == "COMPLIANCE_FINDING"
5. Удалите интеграцию
Удаление коллектора останавливает приём новых событий безопасности. Оно не удаляет события, которые уже были сохранены. Эти события сохраняются в соответствии с политикой хранения данных вашей среды.
Удалите ресурс OpenTelemetryCollector.
kubectl -n astromkey delete opentelemetrycollector otel
Опционально: удалите OpenTelemetry Operator, если он был установлен только для этой интеграции.
helm uninstall opentelemetry-operator --namespace opentelemetry-operator-system
Удалите общие ресурсы.
kubectl delete clusterrolebinding otelcontribcol kubectl delete clusterrole otelcontribcol kubectl -n astromkey delete serviceaccount security-events-collector kubectl -n astromkey delete secret astromkey-secrets
Манифесты Kubernetes
Используйте этот вариант, если вы не можете установить OpenTelemetry Operator или предпочитаете обычные манифесты Kubernetes.
1. Подготовьте среду
Создайте пространство имён.
kubectl create namespace astromkey
Создайте секрет Kubernetes с вашей конечной точкой Ключ-АСТРОМ, API-токеном и именем кластера.
kubectl -n astromkey create secret generic astromkey-secrets \
--from-literal=endpoint=https://<your-environment>.astromkey.com \ --from-literal=api-token=dt0XXX.XXXXXXXX \ --from-literal=cluster-name=<your-cluster-name>
Замените:
<your-environment>на вашу среду Ключ-АСТРОМ.dt0XXX.XXXXXXXXна токен платформы или классический токен доступа, который вы сгенерировали для этой интеграции.<your-cluster-name>на имя, идентифицирующее этот кластер в Ключ-АСТРОМ (например,prod-eu-1).
Примените разрешения RBAC.
curl -O https://raw.githubusercontent.com/astromkey-oss/astromkey-security-events-collector/refs/heads/master/manifests/rbac.yaml kubectl apply -f rbac.yaml
2. Примените ConfigMap коллектора
Файл configmap.yaml хранит конфигурацию конвейера коллектора и монтирует её в под коллектора при запуске.
curl -O https://raw.githubusercontent.com/astromkey-oss/astromkey-security-events-collector/refs/heads/master/manifests/configmap.yaml kubectl apply -f configmap.yaml
3. Разверните коллектор
Файл collector-deployment.yaml определяет Deployment и сервис ClusterIP, который предоставляет доступ к коллектору внутри кластера.
curl -O https://raw.githubusercontent.com/astromkey-oss/astromkey-security-events-collector/refs/heads/master/manifests/collector-deployment.yaml kubectl apply -f collector-deployment.yaml
Используйте пользовательский образ коллектора с ghcr.io/astromkey-oss/astromkey-security-events-collector:latest. Стандартный образ OpenTelemetry Collector не включает необходимые плагины Security Event Processor и Exporter.
4. Проверьте развёртывание
Проверьте статус пода.
kubectl -n astromkey get pods
Вы должны увидеть под с именем dt-security-events-collector-* со статусом Running.
Проверьте логи.
kubectl -n astromkey logs -l app=dt-security-events-collector --tail=50
Ищите строки логов, в которых упоминается обработка OpenReports и экспорт событий. Проверьте конечную точку метрик.
kubectl -n astromkey port-forward deployment/dt-security-events-collector 8888:8888 curl -s http://localhost:8888/metrics | grep processor_securityevent
Вы должны увидеть счётчики processor_securityevent_incoming_logs_total и processor_securityevent_outgoing_logs_total.
Проверьте события в Ключ-АСТРОМ.
После того как первые результаты будут отправлены, выполните следующий запрос в Notebooks:
fetch security.events
| filter dt.system.bucket == "default_securityevents"
| filter event.kind == "SECURITY_EVENT"
AND event.provider == "Kyverno"
AND event.type == "COMPLIANCE_FINDING"
5. Удалите интеграцию
Удаление коллектора останавливает приём новых событий безопасности. Оно не удаляет события, которые уже были сохранены.
Удалите Service и Deployment.
kubectl -n astromkey delete service otel-collector kubectl -n astromkey delete deployment dt-security-events-collector
Удалите ConfigMap.
kubectl -n astromkey delete configmap dt-security-collector-config
Удалите общие ресурсы.
kubectl delete clusterrolebinding otelcontribcol kubectl delete clusterrole otelcontribcol kubectl -n astromkey delete serviceaccount security-events-collector kubectl -n astromkey delete secret astromkey-secrets
Опционально: удалите пространство имён, если оно было создано только для этой интеграции и не содержит других ресурсов.
kubectl delete namespace astromkey
Удаление пространства имён удаляет все ресурсы внутри него, включая другие рабочие нагрузки или секреты. Выполните kubectl -n astromkey get all перед удалением пространства имён, чтобы убедиться, что оно не содержит нужных вам ресурсов.
Детали
Как это работает
Интеграция Kyverno — результаты соответствия Kyverno проходят из OpenReports через Коллектор событий безопасности Ключ-АСТРОМ в конечную точку событий безопасности OpenPipeline, где Ключ-АСТРОМ сохраняет их как события безопасности.
- Kyverno проверяет ресурсы Kubernetes на соответствие развёрнутым проверяющим политикам. Для каждой оценки политики Kyverno создаёт OpenReports, содержащие результаты по каждому ресурсу с серьёзностью и деталями соответствия.
- Получатель
k8sobjectsв OpenTelemetry Collector читает ресурсыreportsиclusterreportsиз группы APIopenreports.ioчерез настроенный интервал. - Пользовательский процессор
securityeventанализирует каждый OpenReport, извлекает отдельные результаты политик и сопоставляет их с семантической моделью данных событий безопасности Ключ-АСТРОМ. Сопоставление добавляет серьёзность, оценку риска, статус соответствия, заголовок результата, поставщика продукта и контекст Kubernetes. - Процессор
k8sattributesдобавляет метаданные Kubernetes, такие как UID кластера и пространство имён. Процессорresourceдобавляет имя кластера. - Пользовательский экспортёр
securityeventотправляет пакетные HTTP POST-запросы на/platform/ingest/v1/security.events, аутентифицированные API-токеном Ключ-АСТРОМ. - Ключ-АСТРОМ сохраняет события безопасности в бакете
default_securityevents. События становятся доступными для запросов в Notebooks, Investigations и Дашбордах, и вы можете использовать их в рабочих процессах.
Расширенная конфигурация
Коллектор событий безопасности Ключ-АСТРОМ — это пользовательский дистрибутив OpenTelemetry Collector, который объединяет три компонента в конвейере логов для преобразования данных соответствия политик Kubernetes в события безопасности Ключ-АСТРОМ.
k8sobjects receiver securityevent processor securityevent exporter (pulls OpenReports) -> (transforms to events) -> (posts to Astromkey)
Тип конвейера — logs, потому что получатель k8sobjects выдаёт объекты Kubernetes как записи логов. Процессор и экспортёр работают с этими записями логов.
Настройка сбора OpenReports
Получатель k8sobjects отслеживает или извлекает пользовательские ресурсы Kubernetes и выдаёт их как записи логов. Эта интеграция использует его для извлечения OpenReports из Kyverno и других движков политик, реализующих спецификацию OpenReports.
Конфигурация получателя OpenReports
receivers:
k8sobjects:
auth_type: serviceAccount
objects:
- name: clusterreports
group: openreports.io
mode: pull
interval: 10m
- name: reports
group: openreports.io
mode: pull
interval: 10m
| Параметр | Описание |
|---|---|
auth_type
|
Метод аутентификации. Используйте serviceAccount при работе внутри Kubernetes.
|
objects[].name
|
Имя ресурса Kubernetes для сбора. Используйте clusterreports для отчётов уровня кластера и reports для отчётов в пространствах имён.
|
objects[].group
|
Группа API. OpenReports используют openreports.io.
|
objects[].mode
|
Режим сбора. pull извлекает все объекты по расписанию. watch передаёт изменения в реальном времени.
|
objects[].interval
|
Как часто извлекать отчёты. По умолчанию — 10m. Меньшие значения увеличивают нагрузку на API-сервер.
|
Фильтрация по статусу
По умолчанию процессор обрабатывает все статусы результатов Kyverno: pass, fail, error и skip. Чтобы уменьшить объём событий и затраты на приём, вы можете обрабатывать только определённые статусы.
Конфигурация фильтра статуса
processors:
securityevent:
processors:
openreports:
enabled: true
status_filter:
- "fail"
- "error"
Лицензирование и затраты
Информацию о выставлении счетов см. в разделе «События».
Часто задаваемые вопросы
Какой тип данных принимается из Kyverno? Коллектор принимает события результатов соответствия: одно событие безопасности на каждый результат политики и ресурс Kubernetes, оценённый Kyverno. Каждое событие представляет собой один вердикт pass, fail, error или skip от правила политики Kyverno, применённого к конкретному ресурсу.
Ключ-АСТРОМ классифицирует эти события как COMPLIANCE_FINDING с категорией COMPLIANCE в схеме событий безопасности.
Как результаты соответствия Kyverno импортируются в Ключ-АСТРОМ? Интеграция работает по принципу push из кластера Kubernetes в Ключ-АСТРОМ. Пользовательский коллектор периодически читает OpenReports из API Kubernetes и отправляет преобразованные события безопасности в конечную точку приёма событий безопасности Ключ-АСТРОМ.
Получатель k8sobjects запрашивает ресурсы reports и clusterreports с фиксированным интервалом. Каждое извлечение получает существующие отчёты. Процессор использует дедупликацию на основе SHA256, чтобы предотвратить создание дубликатов событий в Ключ-АСТРОМ из ранее отправленных результатов.
Фоновый сканер Kyverno работает по своему собственному расписанию, которое по умолчанию составляет 1 час. Интервал коллектора и расписание сканирования Kyverno независимы.
Сколько событий генерирует один OpenReport? Один OpenReport обычно содержит множество отдельных результатов политик, по одному результату на каждый оценённый ресурс. Например, если политика нацелена на 50 Deployments, отчёт содержит 50 результатов, и процессор расширяет это до 50 отдельных событий безопасности.
Вы можете отслеживать это расширение с помощью метрик процессора:
processor_securityevent_incoming_logs_total: полученные отчётыprocessor_securityevent_outgoing_logs_total: отправленные события
Какие типы политик Kyverno создают отчёты? Только проверяющие типы политик создают OpenReports, которые могут быть приняты. Политики изменения, генерации, удаления и очистки не создают отчёты и не отображаются в Ключ-АСТРОМ через эту интеграцию.
| Тип политики | Область | Тип отчёта |
|---|---|---|
| ClusterPolicy | Уровень кластера | clusterreports |
| Policy | Пространство имён | reports |
| ClusterValidatingPolicy | Уровень кластера | clusterreports |
| ValidatingPolicy | Пространство имён | reports |
| ImageValidatingPolicy | Уровень кластера | clusterreports |
| ClusterImageValidatingPolicy | Уровень кластера | clusterreports |
| NamespacedImageValidatingPolicy | Пространство имён | reports |
Как сопоставляются серьёзность и оценка риска? Ключ-АСТРОМ сопоставляет уровни риска и оценки из исходной серьёзности политики Kyverno. Если серьёзность не указана в политике, Ключ-АСТРОМ использует MEDIUM.
| dt.security.risk.level (сопоставлено из finding.severity) | dt.security.risk.score |
|---|---|
| critical → CRITICAL | 10,0 |
| high → HIGH | 8,9 |
| medium → MEDIUM | 6,9 |
| low → LOW | 3,9 |
| отсутствует или неизвестно → NONE | 0,0 |
Могу ли я использовать стандартный образ OpenTelemetry Collector? Нет. Эта интеграция требует плагинов Security Event Processor и Security Event Exporter. Эти плагины не являются частью стандартных дистрибутивов OpenTelemetry Collector или Collector Contrib. Используйте предварительно собранный образ с ghcr.io/astromkey-oss/astromkey-security-events-collector:latest или соберите пользовательский коллектор, включающий эти плагины.
Что произойдёт, если коллектор перезапустится? Коллектор прочитает все существующие OpenReports при следующем интервале. Дедупликация на основе SHA256 в процессоре предотвращает отправку дубликатов событий в Ключ-АСТРОМ. Данные не теряются.
Могу ли я использовать эту интеграцию с несколькими кластерами? Да. Коллектор каждого кластера должен задать уникальное значение k8s.cluster.name через переменную окружения CLUSTERNAME или ключ cluster-name в секрете Kubernetes.
Затем вы можете фильтровать события по кластеру в DQL:
fetch security.events | filter event.type == "COMPLIANCE_FINDING" | filter k8s.cluster.name == "production-eu-west-1"