From 0b3cc949c32cf090ac4c3d3b6fdc5f49827b3307 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Tue, 14 Apr 2026 20:57:26 +0000 Subject: [PATCH] feat: vendor-product-category matrix with infra/ib modes and docker setup --- .dockerignore | 8 + Dockerfile | 15 + README.md | 49 + Z-card_РФ.xlsx | Bin 0 -> 74823 bytes __pycache__/main.cpython-310.pyc | Bin 0 -> 52085 bytes docker-compose.yml | 11 + main.py | 1676 ++++++++++++++++++++++++++++++ matrix.db | Bin 0 -> 90112 bytes mont_logo.png | Bin 0 -> 25574 bytes requirements.txt | 2 + 10 files changed, 1761 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 Z-card_РФ.xlsx create mode 100644 __pycache__/main.cpython-310.pyc create mode 100644 docker-compose.yml create mode 100644 main.py create mode 100644 matrix.db create mode 100644 mont_logo.png create mode 100644 requirements.txt diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0ef8b8d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.venv +__pycache__ +*.pyc +*.pyo +*.pyd +*.db-shm +*.db-wal diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..03dc75a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.12-slim + +WORKDIR /app + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 5000 + +CMD ["python", "main.py"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..5029244 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# MONT Vendor Maps + +Flask-приложение для визуализации и редактирования матрицы: +- вендор -> продукты -> категории +- в двух режимах: Инфраструктура и ИБ + +## Возможности +- фильтрация по вендорам и категориям +- отображение продуктов по выбранным фильтрам +- переключение контуров `Инфраструктура / ИБ` +- отдельный визуальный стиль для ИБ +- админ-панель с редактированием: + - вендоров + - категорий + - продуктов + - матрицы `продукт × категория` + +## API +`GET /api/data?scope=infra|ib` + +Возвращает JSON: +- `vendors` +- `categories` +- `products` +- `product_links` +- `links` (агрегированные vendor-category, для совместимости) + +## Локальный запуск +```bash +python3 -m venv .venv +.venv/bin/python -m ensurepip --upgrade +.venv/bin/python -m pip install -r requirements.txt +.venv/bin/python main.py +``` + +## Docker +```bash +docker compose up -d --build +``` + +Приложение доступно на порту `5000`. + +## Переменные окружения +- `SECRET_KEY` — секрет Flask-сессии. + +## База данных +SQLite: `matrix.db`. + +Содержит данные по двум контурам (`infra` и `ib`), включая продукты и связи категорий. diff --git a/Z-card_РФ.xlsx b/Z-card_РФ.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d5d1b9c3c72808a6c4a8d2fa4c2d8133068cf6cb GIT binary patch literal 74823 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 SpacG(0(SvK*uaGf;Qs(S3GSQ# literal 0 HcmV?d00001 diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..092cdd78e52f3baba553addb9c544a88209bf825 GIT binary patch literal 52085 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 sqlite3.Connection: + conn = sqlite3.connect(DB_PATH) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA foreign_keys = ON") + return conn + + +def seed_data(conn: sqlite3.Connection) -> None: + categories = [ + "Augmented Reality", + "IoT", + "Robotic Process Automation (RPA)", + "Автоматизация бизнес-процессов", + "Видеосвязь и веб-конференции", + "Визуализация и анализ данных", + "Виртуализация", + "Виртуализация рабочих мест, VDI", + "Виртуализация, гиперконвергенция", + "Виртуализация, классическая виртуализация", + "Графические редакторы (замена Visio)", + "Компьютерная техника", + "Контейнерные платформы", + "Корпоративные почтовые серверы", + "Корпоративные коммуникации", + "Облачные платформы", + "Облачные сервисы и сопроводительные решения", + "Онлайн-переводчик", + "Операционные системы", + "СУБД", + "Оцифровка бумажных документов", + "Платформы для онлайн-обучения", + "ПО в сфере ИИ", + "Программные маркетплейсы", + "Программы для смартфонов", + "Работа с PDF", + "Работа с мультимедиа (видео, фото, графика)", + "Разработка в ИИ", + "Резервное копирование и управление данными", + "Речевые технологии, компьютерное зрение", + "САПР", + "Серверное и WiFi оборудование", + "Системы хранения данных", + "Системы ЭДО", + "Средства разработки ПО", + "Техническая поддержка и консалтинг", + "Удаленное управление устройствами", + "Файлы и диски", + ] + + vendors = [ + "Adobe", + "AliveColors", + "Amazon Web Services (AWS)", + "ANWORK", + "CommuniGate Pro (СБК)", + "Content AI (ex-ABBYY)", + "DocTrix", + "EvaTeam", + "eXpress", + "FanRuan", + "GStarCAD", + "Handy Backup", + "InfoWatch", + "iSpring", + "Just AI", + "Kairos Digital", + "LITEBIM", + "LiteManager", + "livedigital", + "Master PDF (Code Industry)", + "MIND Software", + "Monq", + "NextBox", + "Paragon Software Group", + "SL Soft", + "Positive Technologies", + "Postgres Pro", + "Pragmatic Tools", + "Pro32", + "PROMT", + "Quasar", + "Radmin", + "RDW Computers", + "Renga Software", + "SETERE Group", + "Sharx DC", + "SpaceVM", + "TestIT", + "Uncom OS", + "Utinet", + "Valo Cloud", + "Vinteo", + "VK Tech", + "АЛМИ Партнер", + "АСКОН", + "Базальт", + "БФТ", + "ГазИнформСервис", + "Гравитон", + "ГрафТех", + "Группа Астра", + "ИТ Роут", + "Киберпротект", + "Контур", + "Кредо-Диалог", + "Лаборатория Касперского", + "Лаборатория Числитель", + "Мовавика", + "МойОфис", + "МТС Линк", + "Нанософт разработка", + "НЛПК", + "Облакотека", + "Р7", + "РЕД СОФТ", + "РОСА", + "Росплатформа", + "Сакура ПРО", + "Салют для бизнеса (SberDevices)", + "Труконф", + "Флант (Deckhouse)", + "ЦРТ", + "ЦИТИП", + "Яндекс 360 для бизнеса", + ] + + vendor_links = { + "Adobe": ["Работа с PDF", "Оцифровка бумажных документов", "Работа с мультимедиа (видео, фото, графика)"], + "Amazon Web Services (AWS)": ["Облачные платформы", "Облачные сервисы и сопроводительные решения", "ПО в сфере ИИ"], + "CommuniGate Pro (СБК)": ["Корпоративные почтовые серверы", "Корпоративные коммуникации"], + "Content AI (ex-ABBYY)": ["Оцифровка бумажных документов", "Онлайн-переводчик", "Работа с PDF"], + "eXpress": ["Корпоративные коммуникации", "Программы для смартфонов"], + "FanRuan": ["Визуализация и анализ данных"], + "GStarCAD": ["САПР"], + "Handy Backup": ["Резервное копирование и управление данными"], + "iSpring": ["Платформы для онлайн-обучения"], + "Just AI": ["ПО в сфере ИИ", "Речевые технологии, компьютерное зрение"], + "LiteManager": ["Удаленное управление устройствами"], + "Master PDF (Code Industry)": ["Работа с PDF"], + "Paragon Software Group": ["Файлы и диски", "Резервное копирование и управление данными"], + "Postgres Pro": ["СУБД"], + "PROMT": ["Онлайн-переводчик"], + "Radmin": ["Удаленное управление устройствами"], + "Renga Software": ["САПР"], + "SpaceVM": ["Виртуализация", "Виртуализация рабочих мест, VDI"], + "Uncom OS": ["Операционные системы"], + "VK Tech": ["Облачные платформы", "Корпоративные коммуникации", "ПО в сфере ИИ"], + "Базальт": ["Операционные системы"], + "ГазИнформСервис": ["Системы ЭДО", "Техническая поддержка и консалтинг"], + "Группа Астра": ["Операционные системы", "Виртуализация", "СУБД"], + "Киберпротект": ["Резервное копирование и управление данными"], + "Контур": ["Системы ЭДО", "Корпоративные коммуникации"], + "Лаборатория Касперского": ["Техническая поддержка и консалтинг", "Средства разработки ПО"], + "МойОфис": ["Корпоративные коммуникации", "Программы для смартфонов", "Файлы и диски"], + "МТС Линк": ["Видеосвязь и веб-конференции", "Платформы для онлайн-обучения"], + "Р7": ["Корпоративные коммуникации", "Файлы и диски"], + "РЕД СОФТ": ["Операционные системы", "СУБД"], + "РОСА": ["Операционные системы"], + "Росплатформа": ["Облачные платформы", "Виртуализация, гиперконвергенция"], + "Салют для бизнеса (SberDevices)": ["ПО в сфере ИИ", "Речевые технологии, компьютерное зрение"], + "Труконф": ["Видеосвязь и веб-конференции", "Корпоративные коммуникации"], + "Флант (Deckhouse)": ["Контейнерные платформы", "Облачные платформы"], + "ЦРТ": ["Речевые технологии, компьютерное зрение", "ПО в сфере ИИ"], + "Яндекс 360 для бизнеса": ["Корпоративные коммуникации", "Файлы и диски", "Программы для смартфонов"], + } + + conn.executemany("INSERT INTO categories(name) VALUES (?)", [(name,) for name in categories]) + conn.executemany("INSERT INTO vendors(name) VALUES (?)", [(name,) for name in vendors]) + + category_ids = {r["name"]: r["id"] for r in conn.execute("SELECT id, name FROM categories")} + vendor_ids = {r["name"]: r["id"] for r in conn.execute("SELECT id, name FROM vendors")} + + pairs: list[tuple[int, int]] = [] + for vendor, cats in vendor_links.items(): + v_id = vendor_ids.get(vendor) + if not v_id: + continue + for cat in cats: + c_id = category_ids.get(cat) + if c_id: + pairs.append((v_id, c_id)) + + conn.executemany( + "INSERT OR IGNORE INTO vendor_categories(vendor_id, category_id) VALUES (?, ?)", + pairs, + ) + + +def init_db() -> None: + conn = get_db() + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS vendors ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE + ); + + CREATE TABLE IF NOT EXISTS categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE + ); + + CREATE TABLE IF NOT EXISTS vendor_categories ( + vendor_id INTEGER NOT NULL, + category_id INTEGER NOT NULL, + PRIMARY KEY (vendor_id, category_id), + FOREIGN KEY(vendor_id) REFERENCES vendors(id) ON DELETE CASCADE, + FOREIGN KEY(category_id) REFERENCES categories(id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS ib_vendors ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE + ); + + CREATE TABLE IF NOT EXISTS ib_categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE + ); + + CREATE TABLE IF NOT EXISTS ib_vendor_categories ( + vendor_id INTEGER NOT NULL, + category_id INTEGER NOT NULL, + PRIMARY KEY (vendor_id, category_id), + FOREIGN KEY(vendor_id) REFERENCES ib_vendors(id) ON DELETE CASCADE, + FOREIGN KEY(category_id) REFERENCES ib_categories(id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS products ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + vendor_id INTEGER NOT NULL, + name TEXT NOT NULL, + UNIQUE(vendor_id, name), + FOREIGN KEY(vendor_id) REFERENCES vendors(id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS product_categories ( + product_id INTEGER NOT NULL, + category_id INTEGER NOT NULL, + PRIMARY KEY (product_id, category_id), + FOREIGN KEY(product_id) REFERENCES products(id) ON DELETE CASCADE, + FOREIGN KEY(category_id) REFERENCES categories(id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS ib_products ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + vendor_id INTEGER NOT NULL, + name TEXT NOT NULL, + UNIQUE(vendor_id, name), + FOREIGN KEY(vendor_id) REFERENCES ib_vendors(id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS ib_product_categories ( + product_id INTEGER NOT NULL, + category_id INTEGER NOT NULL, + PRIMARY KEY (product_id, category_id), + FOREIGN KEY(product_id) REFERENCES ib_products(id) ON DELETE CASCADE, + FOREIGN KEY(category_id) REFERENCES ib_categories(id) ON DELETE CASCADE + ); + """ + ) + + has_data = conn.execute("SELECT EXISTS(SELECT 1 FROM vendors)").fetchone()[0] + if not has_data: + seed_data(conn) + + has_ib_data = conn.execute("SELECT EXISTS(SELECT 1 FROM ib_vendors)").fetchone()[0] + if not has_ib_data: + ib_matrix = None + from_xlsx = load_matrices_from_xlsx() + if from_xlsx: + ib_matrix = from_xlsx.get("ib") + if not ib_matrix: + ib_matrix = IB_MATRIX + seed_ib_data(conn, ib_matrix) + bootstrap_products_from_vendor_links(conn, "infra") + bootstrap_products_from_vendor_links(conn, "ib") + + conn.commit() + conn.close() + + +def fetch_matrix() -> dict: + conn = get_db() + vendors = [dict(r) for r in conn.execute("SELECT id, name FROM vendors ORDER BY lower(name)")] + categories = [dict(r) for r in conn.execute("SELECT id, name FROM categories ORDER BY lower(name)")] + links = [dict(r) for r in conn.execute("SELECT vendor_id, category_id FROM vendor_categories")] + conn.close() + return {"vendors": vendors, "categories": categories, "links": links} + + +def scope_tables(scope: str) -> dict[str, str]: + if scope == "ib": + return { + "vendors": "ib_vendors", + "categories": "ib_categories", + "vendor_categories": "ib_vendor_categories", + "products": "ib_products", + "product_categories": "ib_product_categories", + } + return { + "vendors": "vendors", + "categories": "categories", + "vendor_categories": "vendor_categories", + "products": "products", + "product_categories": "product_categories", + } + + +def seed_ib_data(conn: sqlite3.Connection, matrix: dict) -> None: + categories = [item["name"] for item in matrix.get("categories", [])] + vendors = [item["name"] for item in matrix.get("vendors", [])] + links = matrix.get("links", []) + + conn.executemany("INSERT OR IGNORE INTO ib_categories(name) VALUES (?)", [(name,) for name in categories]) + conn.executemany("INSERT OR IGNORE INTO ib_vendors(name) VALUES (?)", [(name,) for name in vendors]) + + category_ids = {r["name"]: r["id"] for r in conn.execute("SELECT id, name FROM ib_categories")} + vendor_ids = {r["name"]: r["id"] for r in conn.execute("SELECT id, name FROM ib_vendors")} + src_category_by_id = {item["id"]: item["name"] for item in matrix.get("categories", [])} + src_vendor_by_id = {item["id"]: item["name"] for item in matrix.get("vendors", [])} + + pairs: list[tuple[int, int]] = [] + for link in links: + src_vendor_name = src_vendor_by_id.get(link["vendor_id"]) + src_category_name = src_category_by_id.get(link["category_id"]) + if not src_vendor_name or not src_category_name: + continue + db_vendor_id = vendor_ids.get(src_vendor_name) + db_category_id = category_ids.get(src_category_name) + if db_vendor_id and db_category_id: + pairs.append((db_vendor_id, db_category_id)) + + conn.executemany( + "INSERT OR IGNORE INTO ib_vendor_categories(vendor_id, category_id) VALUES (?, ?)", + pairs, + ) + + +def fetch_ib_matrix() -> dict: + conn = get_db() + vendors = [dict(r) for r in conn.execute("SELECT id, name FROM ib_vendors ORDER BY lower(name)")] + categories = [dict(r) for r in conn.execute("SELECT id, name FROM ib_categories ORDER BY lower(name)")] + links = [dict(r) for r in conn.execute("SELECT vendor_id, category_id FROM ib_vendor_categories")] + conn.close() + return {"vendors": vendors, "categories": categories, "links": links} + + +def fetch_scope_data(scope: str) -> dict: + tables = scope_tables(scope) + conn = get_db() + vendors = [dict(r) for r in conn.execute(f"SELECT id, name FROM {tables['vendors']} ORDER BY lower(name)")] + categories = [dict(r) for r in conn.execute(f"SELECT id, name FROM {tables['categories']} ORDER BY lower(name)")] + products = [ + dict(r) + for r in conn.execute( + f""" + SELECT p.id, p.name, p.vendor_id, v.name AS vendor_name + FROM {tables['products']} p + JOIN {tables['vendors']} v ON v.id = p.vendor_id + ORDER BY lower(v.name), lower(p.name) + """ + ) + ] + product_links = [ + dict(r) + for r in conn.execute( + f"SELECT product_id, category_id FROM {tables['product_categories']}" + ) + ] + links = [ + dict(r) + for r in conn.execute( + f"SELECT vendor_id, category_id FROM {tables['vendor_categories']}" + ) + ] + conn.close() + return { + "vendors": vendors, + "categories": categories, + "products": products, + "product_links": product_links, + "links": links, + } + + +def bootstrap_products_from_vendor_links(conn: sqlite3.Connection, scope: str) -> None: + tables = scope_tables(scope) + has_products = conn.execute(f"SELECT EXISTS(SELECT 1 FROM {tables['products']})").fetchone()[0] + if has_products: + return + vendors = [dict(r) for r in conn.execute(f"SELECT id, name FROM {tables['vendors']}")] + for vendor in vendors: + cur = conn.execute( + f"INSERT INTO {tables['products']}(vendor_id, name) VALUES (?, ?)", + (vendor["id"], "Базовый продукт"), + ) + product_id = cur.lastrowid + categories = [ + r["category_id"] + for r in conn.execute( + f"SELECT category_id FROM {tables['vendor_categories']} WHERE vendor_id = ?", + (vendor["id"],), + ) + ] + conn.executemany( + f"INSERT OR IGNORE INTO {tables['product_categories']}(product_id, category_id) VALUES (?, ?)", + [(product_id, c_id) for c_id in categories], + ) + + +def build_matrix_from_lists( + vendors: list[str], + categories: list[str], + vendor_links: dict[str, list[str]], +) -> dict: + categories_payload = [{"id": i + 1, "name": name} for i, name in enumerate(categories)] + vendors_payload = [{"id": i + 1, "name": name} for i, name in enumerate(vendors)] + category_ids = {item["name"]: item["id"] for item in categories_payload} + vendor_ids = {item["name"]: item["id"] for item in vendors_payload} + links_payload: list[dict[str, int]] = [] + for vendor_name, linked_categories in vendor_links.items(): + v_id = vendor_ids.get(vendor_name) + if not v_id: + continue + for category_name in linked_categories: + c_id = category_ids.get(category_name) + if c_id: + links_payload.append({"vendor_id": v_id, "category_id": c_id}) + return {"vendors": vendors_payload, "categories": categories_payload, "links": links_payload} + + +def parse_xlsx_matrix_sheet( + sheet, + *, + header_row: int, + data_start_row: int, + category_start_col: int, +) -> dict: + category_cols: list[tuple[int, str]] = [] + for col in range(category_start_col, sheet.max_column + 1): + raw = sheet.cell(header_row, col).value + if raw is None: + continue + name = str(raw).strip() + if name: + category_cols.append((col, name)) + + categories_payload = [{"id": i + 1, "name": name} for i, (_, name) in enumerate(category_cols)] + category_id_by_col = {col: idx + 1 for idx, (col, _) in enumerate(category_cols)} + + vendors_payload: list[dict[str, str | int]] = [] + links_payload: list[dict[str, int]] = [] + + for row in range(data_start_row, sheet.max_row + 1): + raw_vendor = sheet.cell(row, 1).value + if raw_vendor is None: + continue + vendor_name = str(raw_vendor).strip() + if not vendor_name: + continue + lowered = vendor_name.lower() + if "вендор" in lowered or "решение" in lowered or "категория" in lowered: + continue + + vendor_id = len(vendors_payload) + 1 + vendors_payload.append({"id": vendor_id, "name": vendor_name}) + + for col, _ in category_cols: + mark = sheet.cell(row, col).value + if mark is None: + continue + if str(mark).strip() == "": + continue + links_payload.append({"vendor_id": vendor_id, "category_id": category_id_by_col[col]}) + + return {"vendors": vendors_payload, "categories": categories_payload, "links": links_payload} + + +def load_matrices_from_xlsx() -> dict[str, dict] | None: + if load_workbook is None: + return None + if not XLSX_PATH.exists(): + return None + wb = load_workbook(XLSX_PATH, data_only=True) + if "инфра" not in wb.sheetnames or "инфобез" not in wb.sheetnames: + return None + infra = parse_xlsx_matrix_sheet( + wb["инфра"], + header_row=1, + data_start_row=2, + category_start_col=4, + ) + ib = parse_xlsx_matrix_sheet( + wb["инфобез"], + header_row=2, + data_start_row=4, + category_start_col=3, + ) + return {"infra": infra, "ib": ib} + + +IB_CATEGORIES = [ + "Защита конечных устройств (EDR/EPP)", + "Безопасность мобильных устройств", + "Межсетевые экраны и NGFW", + "Удаленный доступ (VPN)", + "Защита от DDoS", + "Защита виртуальных сред", + "NTA / анализ сетевого трафика", + "Защита АСУ ТП", + "Sandbox", + "Управление уязвимостями (VM)", + "Управление событиями (SIEM)", + "SOAR", + "SGRC / комплаенс", + "Поведенческий анализ (UEBA)", + "Антифрод", + "KMS / криптозащита", + "DLP", + "Классификация и маркировка данных", + "Защита баз данных", + "DRM", + "DAM / доступ к секретам", + "Биометрическая аутентификация", + "MFA", + "Менеджер паролей", + "SWG / веб-безопасность", + "Родительский контроль", +] + +IB_VENDORS = [ + "Bifit Mitigator", + "BI.ZONE", + "Check Point", + "F6", + "InfoWatch", + "Positive Technologies", + "Лаборатория Касперского", + "Киберпротект", + "Код Безопасности", + "Р7", + "Контур", + "UserGate", + "С-Терра", + "Гарда", + "КриптоПро", + "Эшелон", + "R-Vision", + "RuSIEM", + "SkyDNS", + "IKOD", + "StaffCop", + "Zecurion", + "Nano Security", + "StopPhish", +] + +IB_VENDOR_LINKS = { + "Bifit Mitigator": ["Антифрод", "UEBA", "SIEM"], + "BI.ZONE": ["SIEM", "SOAR", "SGRC / комплаенс", "VM", "DLP", "Антифрод"], + "Check Point": ["Межсетевые экраны и NGFW", "VPN", "Защита конечных устройств (EDR/EPP)", "SWG / веб-безопасность"], + "F6": ["Антифрод", "Защита от DDoS", "NTA / анализ сетевого трафика"], + "InfoWatch": ["DLP", "Классификация и маркировка данных", "DRM"], + "Positive Technologies": ["VM", "NTA / анализ сетевого трафика", "SIEM", "SOAR", "SGRC / комплаенс"], + "Лаборатория Касперского": ["Защита конечных устройств (EDR/EPP)", "Sandbox", "SIEM", "SWG / веб-безопасность"], + "Киберпротект": ["DLP", "Защита баз данных", "DRM"], + "Код Безопасности": ["Межсетевые экраны и NGFW", "VPN", "Защита виртуальных сред", "KMS / криптозащита"], + "Р7": ["MFA", "Менеджер паролей"], + "Контур": ["MFA", "Биометрическая аутентификация"], + "UserGate": ["Межсетевые экраны и NGFW", "SWG / веб-безопасность", "VPN"], + "С-Терра": ["VPN", "KMS / криптозащита"], + "Гарда": ["DLP", "Классификация и маркировка данных", "SIEM"], + "КриптоПро": ["KMS / криптозащита", "MFA", "Биометрическая аутентификация"], + "Эшелон": ["VM", "SIEM", "SGRC / комплаенс"], + "R-Vision": ["SIEM", "SOAR", "SGRC / комплаенс", "UEBA"], + "RuSIEM": ["SIEM", "SOAR"], + "SkyDNS": ["SWG / веб-безопасность", "Родительский контроль"], + "IKOD": ["DAM / доступ к секретам", "Менеджер паролей"], + "StaffCop": ["UEBA", "DLP"], + "Zecurion": ["DLP", "Классификация и маркировка данных", "Защита баз данных"], + "Nano Security": ["Защита конечных устройств (EDR/EPP)", "Sandbox"], + "StopPhish": ["Антифрод", "MFA"], +} + +IB_MATRIX = build_matrix_from_lists(IB_VENDORS, IB_CATEGORIES, IB_VENDOR_LINKS) + + +def require_admin() -> bool: + return bool(session.get("is_admin")) + + +def parse_int(form_value: str | None) -> int | None: + if not form_value: + return None + try: + return int(form_value) + except ValueError: + return None + + +@app.get("/") +def index(): + return render_template_string(INDEX_HTML) + + +@app.get("/api/data") +def api_data(): + scope = (request.args.get("scope") or "infra").strip().lower() + if scope in {"ib", "sec", "security"}: + scope = "ib" + else: + scope = "infra" + return jsonify(fetch_scope_data(scope)) + + +@app.route(ADMIN_PATH, methods=["GET", "POST"]) +def admin_login_or_panel(): + conn = get_db() + raw_scope = (request.args.get("scope") or request.form.get("scope") or "infra").strip().lower() + scope = "ib" if raw_scope in {"ib", "sec", "security"} else "infra" + tables = scope_tables(scope) + + if request.method == "POST" and not require_admin() and request.form.get("action") == "login": + if request.form.get("username") == ADMIN_LOGIN and request.form.get("password") == ADMIN_PASSWORD: + session["is_admin"] = True + conn.close() + return redirect(ADMIN_PATH) + conn.close() + return render_template_string(LOGIN_HTML, error="Неверный логин или пароль") + + if not require_admin(): + conn.close() + return render_template_string(LOGIN_HTML, error=None) + + if request.method == "POST": + action = request.form.get("action", "") + if action == "logout": + session.pop("is_admin", None) + conn.close() + return redirect(ADMIN_PATH) + + if action == "add_vendor": + name = (request.form.get("name") or "").strip() + if name: + conn.execute(f"INSERT OR IGNORE INTO {tables['vendors']}(name) VALUES (?)", (name,)) + + elif action == "add_category": + name = (request.form.get("name") or "").strip() + if name: + conn.execute(f"INSERT OR IGNORE INTO {tables['categories']}(name) VALUES (?)", (name,)) + + elif action == "add_product": + vendor_id = parse_int(request.form.get("vendor_id")) + name = (request.form.get("name") or "").strip() + if vendor_id and name: + conn.execute( + f"INSERT OR IGNORE INTO {tables['products']}(vendor_id, name) VALUES (?, ?)", + (vendor_id, name), + ) + + elif action == "delete_vendor": + v_id = parse_int(request.form.get("vendor_id")) + if v_id: + conn.execute(f"DELETE FROM {tables['vendors']} WHERE id = ?", (v_id,)) + + elif action == "delete_category": + c_id = parse_int(request.form.get("category_id")) + if c_id: + conn.execute(f"DELETE FROM {tables['categories']} WHERE id = ?", (c_id,)) + + elif action == "delete_product": + p_id = parse_int(request.form.get("product_id")) + if p_id: + conn.execute(f"DELETE FROM {tables['products']} WHERE id = ?", (p_id,)) + + elif action == "save_matrix": + products = [r["id"] for r in conn.execute(f"SELECT id FROM {tables['products']}")] + categories = [r["id"] for r in conn.execute(f"SELECT id FROM {tables['categories']}")] + new_pairs: list[tuple[int, int]] = [] + for p_id in products: + for c_id in categories: + if request.form.get(f"pc_{p_id}_{c_id}"): + new_pairs.append((p_id, c_id)) + conn.execute(f"DELETE FROM {tables['product_categories']}") + conn.executemany( + f"INSERT OR IGNORE INTO {tables['product_categories']}(product_id, category_id) VALUES (?, ?)", + new_pairs, + ) + conn.execute(f"DELETE FROM {tables['vendor_categories']}") + conn.execute( + f""" + INSERT OR IGNORE INTO {tables['vendor_categories']}(vendor_id, category_id) + SELECT DISTINCT p.vendor_id, pc.category_id + FROM {tables['products']} p + JOIN {tables['product_categories']} pc ON pc.product_id = p.id + """ + ) + + conn.commit() + conn.close() + return redirect(f"{ADMIN_PATH}?scope={scope}") + + vendors = [dict(r) for r in conn.execute(f"SELECT id, name FROM {tables['vendors']} ORDER BY lower(name)")] + categories = [dict(r) for r in conn.execute(f"SELECT id, name FROM {tables['categories']} ORDER BY lower(name)")] + products = [ + dict(r) + for r in conn.execute( + f""" + SELECT p.id, p.name, p.vendor_id, v.name AS vendor_name + FROM {tables['products']} p + JOIN {tables['vendors']} v ON v.id = p.vendor_id + ORDER BY lower(v.name), lower(p.name) + """ + ) + ] + links = { + (r["product_id"], r["category_id"]) + for r in conn.execute(f"SELECT product_id, category_id FROM {tables['product_categories']}") + } + conn.close() + return render_template_string( + ADMIN_HTML, + vendors=vendors, + categories=categories, + products=products, + links=links, + scope=scope, + ) + + +@app.get("/health") +def health(): + return {"status": "ok"} + + +@app.get("/assets/mont-logo") +def mont_logo(): + return send_from_directory(BASE_DIR, "mont_logo.png") + + +INDEX_HTML = """ + + + + + + Z-карта вендоров + + + + + + + + + + + +""" + +LOGIN_HTML = """ + + + + + + Admin Login + + + + + + +
+

Редактор матрицы

+ {% if error %}

{{ error }}

{% endif %} + + + + +
+ + +""" + +ADMIN_HTML = """ + + + + + + Admin Matrix + + + + + + +
+
+
+ Админ-панель матрицы + +
+
+ +
+ + + +
+
+
+ +
+
+

Добавить вендора

+
+ + + + +
+
+
+

Добавить категорию

+
+ + + + +
+
+
+

Добавить продукт

+
+ + + + + +
+
+
+ +
+
+

Удалить вендора

+ {% for v in vendors %} +
+ + {{ v.name }} + + + +
+ {% endfor %} +
+
+

Удалить категорию

+ {% for c in categories %} +
+ + {{ c.name }} + + + +
+ {% endfor %} +
+
+

Удалить продукт

+ {% for p in products %} +
+ + {{ p.vendor_name }} :: {{ p.name }} + + + +
+ {% endfor %} +
+
+ +
+
+ + + + + + + {% for c in categories %} + + {% endfor %} + + {% for p in products %} + + + {% for c in categories %} + + {% endfor %} + + {% endfor %} +
Вендор / Продукт{{ c.name }}
{{ p.vendor_name }}
{{ p.name }}
+ +
+
+
+
+ + +""" + + +if __name__ == "__main__": + init_db() + app.run(host="0.0.0.0", port=5000, debug=True) +else: + init_db() diff --git a/matrix.db b/matrix.db new file mode 100644 index 0000000000000000000000000000000000000000..b5cb3034ed554a957cc92f90b8ae427ad4084adf GIT binary patch literal 90112 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.0.0 +openpyxl>=3.1.0
+
+ +
+ +
+
+
+

Вендоры в корзине МОНТ

+

Актуальная матрица вендоров, продуктов и категорий. Выбирайте вендоров или категории, чтобы видеть релевантные продуктовые линейки в Инфраструктуре и ИБ.

+
+ + +
+
+
+
+ +
+
+

Вендоры

+ +
+
+ +
+

Категории

+ +
+
+
+ + + +
+
+

Вендоры и продукты (после фильтрации)

+
+
+
+
+