Контекстуализация обнаружений контейнеров в среде выполнения

Материал из Документация Ключ-АСТРОМ

Контекстуализация обнаружений контейнеров в среде выполнения

Сканирование образов контейнеров обычно выполняется в репозиториях артефактов, таких как 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:

  1. Откройте Дашборды и перейдите в раздел Готовые.
  2. Найдите и выберите Обнаружения уязвимостей контейнеров для интеграции 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:

  1. Откройте Дашборды и перейдите в раздел Готовые.
  2. Найдите и выберите Сокращение оповещений об образах контейнеров для интеграции Amazon ECR.