Приём и обработка пользовательских обнаружений безопасности

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

Приём и обработка пользовательских обнаружений безопасности

В этом руководстве вы узнаете, как принимать и обрабатывать пользовательские данные безопасности, передавая их из стороннего инструмента в Ключ-АСТРОМ с помощью API приёма OpenPipeline для событий безопасности.

Целевая аудитория

Специалисты по безопасности, стремящиеся анализировать, визуализировать и автоматизировать пользовательские данные безопасности с помощью Ключ-АСТРОМ.

Сценарий

Вы архитектор по безопасности, использующий Ключ-АСТРОМ для мониторинга работоспособности приложений и сервисов. В рамках практик безопасности жизненного цикла разработки SDLC вам нужно обеспечить, чтобы разработчики сканировали образы контейнеров перед развёртыванием в продуктив.

Для этого вы хотите:

  • Непрерывно загружать результаты сканирования контейнеров в Ключ-АСТРОМ.
  • Связывать обнаружения с отслеживаемыми продуктивными контейнерами.
  • Создавать автоматические тикеты Jira для владельцев-разработчиков контейнеров, если для соответствующих образов контейнеров отсутствуют проверки безопасности.

Эта статья охватывает первую часть: приём пользовательских обнаружений безопасности и их сопоставление с Семантическим словарём Ключ-АСТРОМ для обнаружений уязвимостей.

Пример входных данных для обнаружений безопасности — отчёт сканирования Trivy JSON

{
  "SchemaVersion": 2,
  "CreatedAt": "2021-08-25T12:20:30.000000005Z",
  "ArtifactName": "testdata/fixtures/images/alpine-39.tar.gz",
  "ArtifactType": "container_image",
  "Metadata": {
    "OS": {
      "Family": "alpine",
      "Name": "3.9.4",
      "EOSL": true
    },
    "ImageID": "sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1",
    "DiffIDs": [
      "sha256:f1b5933fe4b5f49bbe8258745cf396afe07e625bdab3168e364daf7c956b6b81"
    ],
    "ImageConfig": {
      "architecture": "amd64",
      "container": "c10d36fa368a7ea673683682666758adf35efe98e10989505f4f566b5b18538f",
      "created": "2019-05-11T00:07:03.510395965Z",
      "docker_version": "18.06.1-ce",
      "history": [
        {
          "created": "2019-05-11T00:07:03.358250803Z",
          "created_by": "/bin/sh -c #(nop) ADD file:a86aea1f3a7d68f6ae03397b99ea77f2e9ee901c5c59e59f76f93adbb4035913 in / "
        },
        {
          "created": "2019-05-11T00:07:03.510395965Z",
          "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
          "empty_layer": true
        }
      ],
      "os": "linux",
      "rootfs": {
        "type": "layers",
        "diff_ids": [
          "sha256:f1b5933fe4b5f49bbe8258745cf396afe07e625bdab3168e364daf7c956b6b81"
        ]
      },
      "config": {
        "Cmd": [
          "/bin/sh"
        ],
        "Env": [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Image": "sha256:09f2bbe58e774849d74dc1391c2e01731896c745c4aba1ecf69a283bdb4b537a",
        "ArgsEscaped": true
      }
    }
  },
  "Results": [
    {
      "Target": "testdata/fixtures/images/alpine-39.tar.gz (alpine 3.9.4)",
      "Class": "os-pkgs",
      "Type": "alpine",
      "Vulnerabilities": [
        {
          "VulnerabilityID": "CVE-2019-14697",
          "PkgID": "musl@1.1.20-r4",
          "PkgName": "musl",
          "PkgIdentifier": {
            "PURL": "pkg:apk/alpine/musl@1.1.20-r4?arch=x86_64\u0026distro=3.9.4",
            "UID": "d6abd271e71d3ce2"
          },
          "InstalledVersion": "1.1.20-r4",
          "FixedVersion": "1.1.20-r5",
          "Status": "fixed",
          "Layer": {
            "Digest": "sha256:e7c96db7181be991f19a9fb6975cdbbd73c65f4a2681348e63a141a2192a5f10",
            "DiffID": "sha256:f1b5933fe4b5f49bbe8258745cf396afe07e625bdab3168e364daf7c956b6b81"
          },
          "SeveritySource": "nvd",
          "PrimaryURL": "https://avd.aquasec.com/nvd/cve-2019-14697",
          "DataSource": {
            "ID": "alpine",
            "Name": "Alpine Secdb",
            "URL": "https://secdb.alpinelinux.org/"
          },
          "Description": "musl libc through 1.1.23 has an x87 floating-point stack adjustment imbalance, related to the math/i386/ directory. In some cases, use of this library could introduce out-of-bounds writes that are not present in an application's source code.",
          "Severity": "CRITICAL",
          "CweIDs": [
            "CWE-787"
          ],
          "VendorSeverity": {
            "nvd": 4
          },
          "CVSS": {
            "nvd": {
              "V2Vector": "AV:N/AC:L/Au:N/C:P/I:P/A:P",
              "V3Vector": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
              "V2Score": 7.5,
              "V3Score": 9.8
            }
          },
          "References": [
            "http://www.openwall.com/lists/oss-security/2019/08/06/4",
            "https://security.gentoo.org/glsa/202003-13",
            "https://www.openwall.com/lists/musl/2019/08/06/1"
          ],
          "PublishedDate": "2019-08-06T16:15:00Z",
          "LastModifiedDate": "2020-03-14T19:15:00Z"
        },
        {
          "VulnerabilityID": "CVE-2019-14697",
          "PkgID": "musl-utils@1.1.20-r4",
          "PkgName": "musl-utils",
          "PkgIdentifier": {
            "PURL": "pkg:apk/alpine/musl-utils@1.1.20-r4?arch=x86_64\u0026distro=3.9.4",
            "UID": "8c341199f4077fc8"
          },
          "InstalledVersion": "1.1.20-r4",
          "FixedVersion": "1.1.20-r5",
          "Status": "fixed",
          "Layer": {
            "Digest": "sha256:e7c96db7181be991f19a9fb6975cdbbd73c65f4a2681348e63a141a2192a5f10",
            "DiffID": "sha256:f1b5933fe4b5f49bbe8258745cf396afe07e625bdab3168e364daf7c956b6b81"
          },
          "SeveritySource": "nvd",
          "PrimaryURL": "https://avd.aquasec.com/nvd/cve-2019-14697",
          "DataSource": {
            "ID": "alpine",
            "Name": "Alpine Secdb",
            "URL": "https://secdb.alpinelinux.org/"
          },
          "Description": "musl libc through 1.1.23 has an x87 floating-point stack adjustment imbalance, related to the math/i386/ directory. In some cases, use of this library could introduce out-of-bounds writes that are not present in an application's source code.",
          "Severity": "CRITICAL",
          "CweIDs": [
            "CWE-787"
          ],
          "VendorSeverity": {
            "nvd": 4
          },
          "CVSS": {
            "nvd": {
              "V2Vector": "AV:N/AC:L/Au:N/C:P/I:P/A:P",
              "V3Vector": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
              "V2Score": 7.5,
              "V3Score": 9.8
            }
          },
          "References": [
            "http://www.openwall.com/lists/oss-security/2019/08/06/4",
            "https://security.gentoo.org/glsa/202003-13",
            "https://www.openwall.com/lists/musl/2019/08/06/1"
          ],
          "PublishedDate": "2019-08-06T16:15:00Z",
          "LastModifiedDate": "2020-03-14T19:15:00Z"
        }
      ]
    }
  ]
}

Предварительные требования

  • Ваши контейнеры развёрнуты в Kubernetes и отслеживаются Ключ-АСТРОМ.
  • Соответствующие образы контейнеров сканируются сторонним инструментом (в данном случае — Trivy).

Разрешения

Чтобы добавить новые источники и обработку конвейера в OpenPipeline, вам нужны оба разрешения ниже:

  • openpipeline:configurations:read
  • openpipeline:configurations:write

Как настроить разрешения, см. в разделе «Разрешения».

Начало работы

Инструкции по приёму любого типа событий см. в разделе «Как принимать данные (события)».

Шаг 1. Настройте конечную точку

  1. Перейдите в Настройки > Обработка и контекстуализация > OpenPipeline > События безопасности > Источники приёма.
  2. У вас есть два варианта приёма:
    • Рекомендуемый вариант 1 — использовать встроенную конечную точку событий безопасности. Скопируйте URL встроенной конечной точки событий безопасности.
    • Вариант 2 — создать пользовательскую конечную точку. Выберите Источник, чтобы создать пользовательский источник приёма, затем скопируйте его URL.
    • Подробнее о вариантах приёма см. в разделе «Приём событий безопасности».
  3. Создайте токен доступа с необходимой областью действия в соответствии с выбранным на шаге 3 вариантом приёма.
    • Подробности о необходимых областях действия см. в разделе «Начало работы».

Шаг 2. Передайте данные

Используйте URL конечной точки приёма и токен доступа, созданные ранее, чтобы настроить сторонний продукт.

Чтобы в дальнейшем работать с обнаружениями безопасности, загруженными в Ключ-АСТРОМ, гранулярно, агрегированные отчёты следует разбивать и загружать как отдельные обнаружения.

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

Пример загруженного события с одним обнаружением уязвимости

Шаг 3. Проверьте данные в Блокнотах

Чтобы проверить данные, откройте Блокноты и запросите события безопасности.

Пример запроса DQL:

fetch security.events
| filter dt.system.bucket == "default_securityevents"
| sort timestamp desc

Чтобы чётко отличать загруженные данные от других принятых событий, вы можете добавить фильтры по ожидаемым атрибутам. Пример:

| filter SchemaVersion == 2 AND ArtifactType == "container_image"

Результат запроса должен включать загруженное событие в исходном формате с несколькими обогащёнными полями, такими как timestamp и event.kind.

Пример результата запроса

В текущем случае формат не поддерживается, и данные не сопоставляются. Если Ключ-АСТРОМ поддерживает формат, он автоматически сопоставляет его с соглашениями Семантического словаря.

Шаг 4. Сопоставьте данные с Семантическим словарём

В простых случаях вы можете работать с принятыми событиями в их исходном формате. Однако в более сложных случаях это становится затруднительным, поскольку:

  • Много вложенных полей.
  • Вы не можете единообразно получать доступ к обнаружениям из различных инструментов и продуктов.
  • Некоторые поля добавляются для правильной классификации обнаружений, а другие сопоставляются с соглашениями.

В таких сложных случаях вам нужно вручную сопоставить принятые данные с Семантическим словарём Ключ-АСТРОМ. При сопоставлении данных исходные данные сохраняются рядом с сопоставленными, что позволяет использовать специфичные для поставщика данные в анализе и автоматизации или в качестве дополнительного контекста.

  1. В OpenPipeline выберите Конвейеры > Конвейер, чтобы создать пользовательский конвейер, и назовите его, например, «Пользовательские обнаружения безопасности».
  2. Добавьте в конвейер обработчик типа DQL и настройте его для разбора полей, требуемых Семантическим словарём (в нашем случае мы хотим сопоставить базовые поля обнаружений уязвимостей и, как расширение, сведения об образе контейнера). Введите следующие данные:
    • Имя обработчика: например, «Сопоставить поля Trivy»
    • Условие соответствия: SchemaVersion == 2 AND ArtifactType == "container_image" (таким образом, сопоставление будет предпринято только для relevant событий)
    • Определение обработчика DQL (в сопоставлении мы предполагаем, что массивы result и vulnerability уже содержат отдельные элементы):
      • Пример определения обработчика DQL
      • Пример сопоставленного результата
  3. Выберите Динамическая маршрутизация > Динамический маршрут, чтобы добавить динамическую маршрутизацию в новый конвейер. Введите следующие данные:
    • Имя динамического маршрута: например, «Пользовательское событие»
    • Условие соответствия: SchemaVersion == 2 AND ArtifactType == "container_image"
    • Выберите конвейер, к которому будет применяться динамическая маршрутизация (в нашем случае — «Пользовательские обнаружения безопасности»)
    • Добавьте динамическую маршрутизацию

Подробности о динамической маршрутизации см. в разделе «Маршрутизация».

Дальнейшие шаги

Теперь вы можете использовать данные для:

  • Визуализации обнаружений уязвимостей контейнеров с помощью примера дашборда.
  • Автоматизации создания тикетов Jira и уведомлений Slack с помощью примеров рабочих процессов.