Приём и обработка пользовательских обнаружений безопасности
Приём и обработка пользовательских обнаружений безопасности
В этом руководстве вы узнаете, как принимать и обрабатывать пользовательские данные безопасности, передавая их из стороннего инструмента в Ключ-АСТРОМ с помощью 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:readopenpipeline:configurations:write
Как настроить разрешения, см. в разделе «Разрешения».
Начало работы
Инструкции по приёму любого типа событий см. в разделе «Как принимать данные (события)».
Шаг 1. Настройте конечную точку
- Перейдите в Настройки > Обработка и контекстуализация > OpenPipeline > События безопасности > Источники приёма.
- У вас есть два варианта приёма:
- Рекомендуемый вариант 1 — использовать встроенную конечную точку событий безопасности. Скопируйте URL встроенной конечной точки событий безопасности.
- Вариант 2 — создать пользовательскую конечную точку. Выберите Источник, чтобы создать пользовательский источник приёма, затем скопируйте его URL.
- Подробнее о вариантах приёма см. в разделе «Приём событий безопасности».
- Создайте токен доступа с необходимой областью действия в соответствии с выбранным на шаге 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. Сопоставьте данные с Семантическим словарём
В простых случаях вы можете работать с принятыми событиями в их исходном формате. Однако в более сложных случаях это становится затруднительным, поскольку:
- Много вложенных полей.
- Вы не можете единообразно получать доступ к обнаружениям из различных инструментов и продуктов.
- Некоторые поля добавляются для правильной классификации обнаружений, а другие сопоставляются с соглашениями.
В таких сложных случаях вам нужно вручную сопоставить принятые данные с Семантическим словарём Ключ-АСТРОМ. При сопоставлении данных исходные данные сохраняются рядом с сопоставленными, что позволяет использовать специфичные для поставщика данные в анализе и автоматизации или в качестве дополнительного контекста.
- В OpenPipeline выберите Конвейеры > Конвейер, чтобы создать пользовательский конвейер, и назовите его, например, «Пользовательские обнаружения безопасности».
- Добавьте в конвейер обработчик типа DQL и настройте его для разбора полей, требуемых Семантическим словарём (в нашем случае мы хотим сопоставить базовые поля обнаружений уязвимостей и, как расширение, сведения об образе контейнера). Введите следующие данные:
- Имя обработчика: например, «Сопоставить поля Trivy»
- Условие соответствия:
SchemaVersion == 2 AND ArtifactType == "container_image"(таким образом, сопоставление будет предпринято только для relevant событий) - Определение обработчика DQL (в сопоставлении мы предполагаем, что массивы
resultиvulnerabilityуже содержат отдельные элементы):- Пример определения обработчика DQL
- Пример сопоставленного результата
- Выберите Динамическая маршрутизация > Динамический маршрут, чтобы добавить динамическую маршрутизацию в новый конвейер. Введите следующие данные:
- Имя динамического маршрута: например, «Пользовательское событие»
- Условие соответствия:
SchemaVersion == 2 AND ArtifactType == "container_image" - Выберите конвейер, к которому будет применяться динамическая маршрутизация (в нашем случае — «Пользовательские обнаружения безопасности»)
- Добавьте динамическую маршрутизацию
Подробности о динамической маршрутизации см. в разделе «Маршрутизация».
Дальнейшие шаги
Теперь вы можете использовать данные для:
- Визуализации обнаружений уязвимостей контейнеров с помощью примера дашборда.
- Автоматизации создания тикетов Jira и уведомлений Slack с помощью примеров рабочих процессов.