Как управлять уязвимостями безопасности с использованием Budibase - не требуется код

Как управлять уязвимостями безопасности с использованием Budibase - не требуется код

7 августа 2025 г.

Я решил запустить серию статей, которые описывают, как я создал панели управления уязвимостью, используя Budibase платформы без кодов. В этой серии я сломаю свою индивидуальную систему приоритетов, продемонстрирую, как система оценки прогнозирования эксплуатации (EPS) может повысить эффективность восстановления и изучить, как консолидировать данные из различных инструментов кибербезопасности в унифицированном представлении.

Управление уязвимостью представляет различные проблемы, которые не могут быть решены с помощью универсального решения. Каждая организация имеет свою структуру, бюджет и технический стек. Поэтому вместо того, чтобы предоставлять пошаговый учебник, я решил поделиться своим практическим опытом и пониманием.

  • Основная цель состоит в том, чтобы разработать внутреннее приложение, которое предоставляет всем заинтересованным сторонам, включая команду SOC, системные администраторы и управление соответствующими отделениями, с доступом к современной статистике и четким пониманием текущей ландшафта уязвимости.
  • Вторая цель - разработать более эффективный метод для определения приоритетов уязвимостей.

Почему панели панели и единый подход необходимы?

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

Кроме того, ИТ -департамент должен четко понимать значимость восстановления уязвимости, поскольку оно влияет не только на безопасность, но и общую устойчивость инфраструктуры.

Почему Будибаз?

Простое сканирование на наличие уязвимостей и отправка отчета больше не является достаточным. Командам важно проводить встречи, чтобы обсудить результаты, обзор отчетов и диаграмм, изучить альтернативы и принимать решения, особенно когда исправление невозможно.

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

Budibase-это решение с открытым исходным кодом, которое поддерживает различные системы управления базами данных (СУБД) и REST API. Он быстро развертывается и допускает настройку пользовательского интерфейса, что делает его отличным выбором для создания легких внутренних приложений.

Первоначальная настройка Budibase

Чтобы упростить настройку, я использовал контейнеры Docker, что является наиболее эффективным методом развертывания.

1. Установка базы данных PostgreSQL

Чтобы начать, потяните изображение PostgreSQL:

docker pull postgres

Создайте файл для хранения пароля, например,postgres-pwd:

echo -n "secretpassword" > postgres-pwd

Установите соответствующие разрешения для файла:

chmod 600 ./postgres-pwd

Далее попробуйте запустить контейнер:

sudo docker run -p 5432:5432 \
--name postgres_budibase \
-e POSTGRES_USER=budiuser \
-e POSTGRES_PASSWORD_FILE=/run/secrets/pg_pass \
-v /home/user/postgres_budibase/postgres-pwd:/run/secrets/pg_pass:ro \
-v /var/budibase_test_postgre/pgdata:/var/lib/postgresql/data/ \
-v /home/user/postgres_budibase/csv/:/tmp/postgres/ \
-d postgres

Вам нужно будет изменить эту команду в соответствии с вашей средой:

  • Заменять/home/user/postgres_budibase/postgres-pwdС путем к вашему файлу пароля.
  • Заменять/var/budibase_test_postgre/pgdataс каталогом на вашем хосте, где будут сохранены данные PostgreSQL.
  • Каталог/home/user/postgres_budibase/csv/Необязательно - я использовал их для импорта данных из файлов CSV.

2. Установка Budibase

Во -первых, потяните изображение Budibase:

docker pull budibase/budibase:latest

Перейдите в каталог, где вы поместитеdocker-compose.ymlФайл, и не забудьте заменить значения пароля:

version: "3"

services:
  budibase:
    restart: unless-stopped
    image: budibase/budibase
    ports:
      - "8080:80"
    environment:
      JWT_SECRET: <secret>
      MINIO_ACCESS_KEY: <secret>
      MINIO_SECRET_KEY: <secret>
      REDIS_PASSWORD: <secret>
      COUCHDB_USER: <secret>
      COUCHDB_PASSWORD: <secret>
      INTERNAL_API_KEY: <secret>
    volumes:
      - ./budibase_store:/data

Создайте локальный каталог для постоянного хранения:

mkdir ./budibase_store

Затем запустите контейнер:

docker-compose up -d

После этого все данные будут сохранены в местном./budibase_storeкаталог на хосте. Теперь вы можете открыть браузер и перейти кПорт 8080Чтобы получить доступ к интерфейсу Budibase.

3. Импорт данных с сканера

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

В моем случае я использовал данные из сканера уязвимости. Я внес небольшие изменения в официальную библиотеку Python API и создал сценарий для запроса конечной точки API, получая результаты в формате CSV.

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

Хотя Budibase позволяет вам запускать SQL -запросы непосредственно через его веб -интерфейс, я также иногда использую командную строку. Чтобы подключиться к базе данных с хоста, где он установлен, используйте следующую команду:

sudo docker exec -it postgres_budibase sh -c "psql -U budibase"

SQL -запрос для создания таблицы для данных

CREATE TABLE allassets_tbl (
 record_id SERIAL PRIMARY KEY,
 VulnDiscoveryTime TIMESTAMP,
 AuditTime TIMESTAMP,
 IpAddress VARCHAR(255),
 Hostname VARCHAR(255),
 OsName VARCHAR(255),
 OsVersion VARCHAR(255),
 Release VARCHAR(255),
 VulnerableEntity VARCHAR(255),
 VulnerableEntityVersion VARCHAR(255),
 EntityPath VARCHAR(255),
 Vulnerability VARCHAR(255),
 VulnerabilityIssueTime TIMESTAMP,
 CVE VARCHAR(255),
 VulnDescription TEXT,
 HowToFix TEXT,
 Patch VARCHAR(255),
 PatchPublishDate TIMESTAMP,
 Severity VARCHAR(255),
 CVSS3 VARCHAR(255),
 Metrics VARCHAR(255),
 VulnerIsTrend VARCHAR(255),
 HostImportance VARCHAR(255),
 Status VARCHAR(255),
 System TEXT,
 epssScore smallint,
 epssPercentile smallint
);

Затем я переместил файл .csv, содержащий данные об уязвимости в каталог, доступный для контейнера Docker, запускающего базу данных. Примечание. В моем случае файл имеет размер более 5 ГБ, поэтому импорт через Budibase невозможен.

Ниже приведен запрос SQL, используемый для импорта файла .csv в таблицу:

COPY allassets_tbl(VulnDiscoveryTime, AuditTime, IpAddress, Hostname, OsName, OsVersion, Release, VulnerableEntity, VulnerableEntityVersion, EntityPath, Vulnerability, VulnerabilityIssueTime, CVE, VulnDescription, HowToFix, Patch, PatchPublishDate, Severity, CVSS3, Metrics, VulnerIsTrend, HostImportance, Status, System, epssScore, epssPercentile)
FROM '/tmp/postgres/vulns.csv'
DELIMITER ';'
CSV HEADER;

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

Этот подход значительно увеличит рабочую нагрузку в долгосрочной перспективе, усложняет запросы SQL и создаст дополнительную нагрузку на процессор сервера. Однако реляционная структура всегда может быть реализована позже, если система должна развиваться. Ключ должен начать с простого решения и оценить, соответствует ли оно требованиям.

В результате у меня в настоящее время есть плоская таблица в базе данных, причем каждая строка представляет уязвимость. Эта настройка позволяет мне запускать запросы SQL и эффективно создавать пользовательские панели мониторинга.

Начальный интерфейс:

When you log in to Budibase for the first time, you will need to create an application. Budibase allows you to create multiple applications, and within each application, multiple pages can be created.

После создания приложения подключите его к базе данных PostgreSQL из редактора приложения на вкладке Data.

Контроль доступа

Budibase позволяет управлять доступом для страниц и объектов, позволяя пользователям управлять разрешениями посредством управления доступа на основе ролей (RBAC).

Я скорректировал настройки так, чтобы администраторы конкретных серверов могли получить доступ только к данным, имеющим отношение к их активам. Это также относится к каждой группе, ответственной за обновление конкретной категории активов.

Оптимизация запросов SQL с материализованными взглядами

Каждая панель мониторинга создается путем выполнения SQL -запроса в базе данных. Каждый запрос добавляет нагрузку в базу данных и требует времени для вычисления статистики. При работе с большими наборами данных, такими как миллионы рядов, это может быстро стать узким местом производительности.

Хороший способ оптимизировать панели мониторинга в PostgreSQL - это использование материализованных представлений. Материализованный вид - это физическая копия результата запроса, хранящегося в виде таблицы. При создании запрос выполняется один раз, и результат сохраняется.

CREATE MATERIALIZED VIEW mat_assets AS
SELECT * FROM assets_tbl;

После создания данные остаются статическими, пока они не будут обновляться. Это означает, что изменения в базовых таблицах базы данных не отражаются автоматически, и вам нужно будет вручную обновить представление, используя следующий запрос:

REFRESH MATERIALIZED VIEW mat_assets;

Запросы хранятся в Budibase под вкладкой данных конкретного приложения.

Настройка автоматизации

Настройка автоматизации является полезной функцией Budibase, позволяющей пользователям создавать автоматические задачи.

Например, материализованные представления должны периодически пересматривать, чтобы обновлять свои таблицы с помощью новых данных. Я создал задачу, которая работает автоматически после импорта данных. В рамках этой задачи я указал SQL -запрос, который обновляет представление:

DO $$
BEGIN
REFRESH MATERIALIZED VIEW allassets;
REFRESH MATERIALIZED VIEW mat_Count_vuln_active_by_found_fixed;
REFRESH MATERIALIZED VIEW mat_Chart_area_count_month_severity_active;
END $$;

Примеры панелей мониторинга для количества активов и типов.

This is an example of how the first page with asset counts appears.

Монитоны создаются с использованием запросов SQL из материализованных представлений, которые я упоминал ранее. Этот подход значительно сокращает время запроса и экономит вычислительные ресурсы.

Панель инструментов 1 - отображает количество серверов Windows среди всех активов.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_count_windows_server AS
SELECT COUNT(DISTINCT hostname) AS numofwin FROM allassets_tbl WHERE osname ILIKE '%windows 20%';

Запрос на приборную панель:

SELECT * FROM mat_count_windows_server;

Панель инструментов 2 - отображает общее количество рабочих станций среди всех активов.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_count_windows_arm AS
SELECT COUNT(DISTINCT hostname) AS numofwin FROM allassets_tbl WHERE osname ILIKE '%windows 1%';

Запрос на приборную панель:

SELECT * FROM mat_count_windows_arm;

Панель инструментов 3 - отображает общее количество сетевых устройств, включенных во все активы.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_cisco_ios AS
SELECT COUNT(DISTINCT hostname) numofios FROM allassets_tbl WHERE osname ILIKE '%ios%';

Запрос на приборную панель:

SELECT * FROM mat_cisco_ios;

Панель инструментов 4 - отображает общее количество гипервизоров.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_сount_esxi_os AS
SELECT COUNT(DISTINCT hostname) AS numoflin FROM allassets_tbl WHERE osname ILIKE '%esxi%';

Запрос на приборную панель:

SELECT * FROM mat_сount_esxi_os;

Монитоны для уязвимостей Windows Server

Я создал отдельные панели инструментов для каждой категории активов. Для серверов Windows я разработал несколько вкладок с каждой вкладкой с различными мониторингами. В этой статье я сосредоточусь на инструментальных панелях с первой вкладки, которая представляет тенденции уязвимости. Следующая статья будет охватывать дополнительные вкладки, которые сконцентрируются на приоритете уязвимости.

Панель инструментов 1 - показывает общее количество как активных, так и разрешенных уязвимостей для Windows Servers.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_Count_vuln_windows_server AS
SELECT COUNT(hostname) AS numofvuln FROM allassets_tbl WHERE osname ILIKE '%windows 20%';

Запрос на приборную панель:

SELECT * FROM mat_Count_vuln_windows_server;

Панель инструментов 2 - отображает общее количество активных уязвимостей для серверов Windows.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_Count_vuln_active_windows_server AS
SELECT COUNT(hostname) AS numofvuln FROM allassets_tbl WHERE osname ILIKE '%windows 20%' AND status = 'new';

Запрос на приборную панель:

SELECT * FROM mat_Count_vuln_active_windows_server;

Панель инструментов 3 - указывает процент активных уязвимостей относительно общего числа для серверов Windows.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_Count_vuln_active_windows_server_percent AS
SELECT
active.vuln,
ROUND(active.vuln * 100.0 / all_win.total_vuln , 0) AS percent
FROM 
( SELECT COUNT(hostname) AS vuln
FROM allassets_tbl 
WHERE osname ILIKE '%windows 20%' AND status = 'new' )
AS active,
( SELECT COUNT(hostname) AS total_vuln
FROM allassets_tbl
WHERE osname ILIKE '%windows 20%' )
AS all_win;

Запрос на приборную панель:

SELECT * FROM mat_Count_vuln_active_windows_server_percent;

Панель инструментов 4 - выделяет количество критических уязвимостей для серверов Windows.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_Count_vuln_active_windows_server_critical AS
SELECT COUNT(hostname) AS numofvuln 
FROM allassets_tbl 
WHERE osname ILIKE '%windows 20%' AND status = 'new' AND severity = 'critical';

Запрос на приборную панель:

SELECT * FROM mat_Count_vuln_active_windows_server_critical;

Панель инструментов 5 - представляет состояние уязвимостей ежемесячно для серверов Windows.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_Count_vuln_active_by_found_fixed AS
WITH VulnerabylitiesFixed AS (
SELECT COUNT(hostname) as fixed, EXTRACT(MONTH from VulnDiscoveryTime) AS month
FROM allassets_tbl
WHERE osname ILIKE '%windows 20%' AND status = 'fixed'
GROUP BY month
ORDER BY month),
VulnerabylitiesNew AS (
 SELECT COUNT(hostname) AS numvulns,
EXTRACT(MONTH from VulnDiscoveryTime) AS month
FROM allassets_tbl
WHERE osname ILIKE '%windows 20%' AND status = 'new'
GROUP BY month
ORDER BY month)
SELECT v.numvulns, vf.fixed, v.month
FROM VulnerabylitiesNew v
JOIN VulnerabylitiesFixed vf ON v.month = vf.month;

Запрос на приборную панель:

SELECT * FROM mat_Count_vuln_active_by_found_fixed;

Панель инструментов 6 - иллюстрирует текущее состояние уязвимостей, классифицируемое по рейтингу рисков, разбившись по месяцу для Windows Servers.

Ниже приведен запрос SQL для создания материализованного представления:

CREATE MATERIALIZED VIEW mat_Chart_area_count_month_severity_active AS
SELECT
EXTRACT(MONTH from VulnDiscoveryTime) AS month, 
COUNT(hostname) AS total,
COUNT(hostname) FILTER (WHERE severity = 'critical') AS critical,
COUNT(hostname) FILTER (WHERE severity = 'high') AS high,
COUNT(hostname) FILTER (WHERE severity = 'medium') AS medium,
COUNT(hostname) FILTER (WHERE severity = 'low') AS low,
COUNT(hostname) FILTER (WHERE severity = 'none') AS none
FROM allassets_tbl
WHERE osname ILIKE '%windows 20%' AND status = 'new'
GROUP BY month
ORDER BY month;

Запрос на приборную панель:

SELECT * FROM mat_Chart_area_count_month_severity_active;

Резюме первой части

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

Если у вас есть какие -либо идеи или опыт в области управления уязвимостью, я хотел бы услышать ваши мысли:

  • Как вы вовлекаете межфункциональные команды в процесс восстановления?
  • И как вы поощряете своих коллег быстрее применять патчи?


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE