Контекстуализация обнаружений контейнеров в среде выполнения
Контекстуализация обнаружений контейнеров в среде выполнения
Сканирование образов контейнеров обычно выполняется в репозиториях артефактов, таких как Amazon ECR, GCP Artifact Registry и Microsoft Azure Container Registry. После развёртывания образов в продуктивной среде необходимо непрерывно переоценивать образы контейнеров, чтобы гарантировать, что на них не влияют новые критические уязвимости.
Количество обнаружений уязвимостей растёт вместе с количеством хранимых образов контейнеров, и команда разработки может оказаться перегруженной количеством критических обнаружений. Некоторые образы контейнеров никогда не будут развёрнуты в вашей продуктивной среде. Они могут быть частью тестовых сред или устареть и лежать в репозитории как наследие.
В этом контексте Ключ-АСТРОМ помогает:
- Снизить усталость от оповещений.
- Сосредоточить усилия по устранению на критических обнаружениях уязвимостей, которые существенно влияют на ваши продуктивные приложения.
Целевая аудитория
Инженеры по надёжности сайтов (SRE) и владельцы приложений, которые хотят поддерживать гигиену безопасности и работоспособность своих приложений.
Сценарий
Команда разработки хранит образы контейнеров в Amazon ECR. Позже эти образы развёртываются в средах staging и production, работающих на Kubernetes.
Вы отслеживаете работоспособность приложений с помощью ЕдиныйАгент в Kubernetes.
Недавно Amazon ECR обнаружил несколько новых критических уязвимостей в образах контейнеров.
Запрос
- Автоматически сортировать критические уязвимости и оценивать ситуацию.
- Автоматически создавать тикеты и уведомления о новых критических уязвимостях, угрожающих вашему продуктивному приложению.
Цель
Избежать подверженности критическим уязвимостям в продуктивных приложениях на контейнерах с уязвимыми образами контейнеров.
Результат
Наше решение позволяет:
- Фильтровать критические обнаружения в продуктивных приложениях на контейнерах с уязвимыми образами.
- Создавать рабочие процессы автоматизации уведомлений на основе этих обнаружений.
Предварительные требования
- Настройте наблюдаемость Kubernetes с помощью Ключ-АСТРОМ Operator.
- Загрузите обнаружения уязвимостей и события сканирования Amazon ECR.
- Используйте теги продукта/стадии выпуска Ключ-АСТРОМ для ваших контейнеров.
Начало работы
Шаг 1. Визуализация
Чтобы просмотреть сводный и унифицированный список последних обнаружений уязвимостей, загруженных из Amazon ECR:
- Откройте Дашборды и перейдите в раздел Готовые.
- Найдите и выберите Обнаружения уязвимостей контейнеров для интеграции Amazon ECR.
Шаг 2. Фильтрация
- Отфильтруйте по RuntimeStatus, чтобы отобразить контекстуализированные обнаружения, затрагивающие ваши контейнеры среды выполнения.
- Отфильтруйте по ProductStage, чтобы отобразить контекстуализированные обнаружения, затрагивающие ваши продуктивные сервисы и приложения.
Шаг 3. Автоматизация
Вы можете адаптировать наши примеры рабочих процессов автоматизации, чтобы обогатить и отфильтровать внешние обнаружения уязвимостей образов контейнеров по контексту среды выполнения. Подробности см. в разделе «Автоматизация и оркестрация обнаружений безопасности».
Пример запроса для получения новых критических уязвимостей образов контейнеров со списком затронутых образов и работающих контейнеров:
// The query has a rolling window of 7 days and the last 24hrs.
// Vulnerability finding events which have already been reported
// before the current 24hr window will not be reported again.
fetch security.events, from: now() - 7d
| filter dt.system.bucket == "default_securityevents"
AND object.type == "CONTAINER_IMAGE"
AND event.type == "VULNERABILITY_FINDING"
AND dt.security.risk.level == "CRITICAL"
// now enrich the runtime context
| join [
fetch dt.entity.container_group_instance, from:now()-3h
| fieldsAdd entity.name, containerImageDigest, containerImageName, workloadName, containerStatus, processes=contains[dt.entity.process_group_instance]
| expand dt.entity.process=processes
| fieldsRemove processes
| join [
fetch dt.entity.process_group_instance, from:now()-3h
], on:{left[dt.entity.process]==right[id]}, kind:leftOuter, fields:{releasesProduct, releasesStage}
], on:{left[container_image.digest]==right[containerImageDigest]}, kind:leftOuter,
fields:{container_instance.id=id, container_instance.name=entity.name, container_image.name=containerImageName,
releasesProduct, releasesStage, containerStatus}
// summarize and filter
| dedup {object.id, vulnerability.id, component.name, component.version,
container_image.registry, container_image.repository}, sort: {timestamp desc}
| parse containerStatus, """LD* "state=" LD:containerStatus ("}" | ",")"""
| fieldsAdd containerStatus=if(isNull(containerStatus),"not running",else:containerStatus)
| fieldsAdd releasesStage=if(isNull(releasesStage), "None", else:releasesStage)
| filter containerStatus=="running" AND releasesStage=="production"
// Aggregate vulnerability findings per vulnerability, repository,
// component and component version.
| summarize {
affected_images_count = count(),
vulnerability_finding_events = collectArray(
record(
object.id = object.id,
event.provider = event.provider,
container_image.registry = container_image.registry,
container_image.repository = container_image.repository,
component.version = component.version,
component.name = component.name,
dt.security.risk.level = dt.security.risk.level,
ingest_time = timestamp
)
)
}, by:{ vulnerability.id, vulnerability.title, event.provider, container_image.registry, container_image.repository, component.name, component.version }
// Filter out, if this vulnerability for the repository and the component
// and version was already reported before the last 24 hours.
// For example, if the same vulnerability was reported multiple times
// during the last 7 days, don't report it again.
| filterOut iAny(vulnerability_finding_events[][ingest_time] < now() - 24h)
// Expand and deduplicate for repetitive findings if they
// were reported more than once in the last 24 hours.
| expand vulnerability_finding_events
| dedup { vulnerability.id, vulnerability.title, vulnerability_finding_events[object.id], vulnerability_finding_events[component.name], vulnerability_finding_events[component.version] }
// Aggregate again to count the unique affected images within each repository.
| summarize {
affected_images_count = count(),
vulnerability_finding_events = collectArray(
vulnerability_finding_events
)
}, by:{ vulnerability.id, vulnerability.title, event.provider, container_image.registry, container_image.repository, component.name, component.version }
| sort vulnerability_finding_events[][ingest_time] desc
Шаг 4. Отслеживание сокращения оповещений
Чтобы отслеживать процесс сокращения оповещений на основе прогрессивной фильтрации из шага 2:
- Откройте Дашборды и перейдите в раздел Готовые.
- Найдите и выберите Сокращение оповещений об образах контейнеров для интеграции Amazon ECR.