Skip to content

About

Курсовая работа по программированию, третий семестр, ИБ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Network Availability Monitor

Профессиональный анализатор доступности сетевых ресурсов с PostgreSQL и расширенными проверками безопасности.

Описание

Network Availability Monitor - приложение для мониторинга доступности сетевых ресурсов с поддержкой различных протоколов (HTTP/HTTPS, SSH, FTP, SMTP, PostgreSQL). Приложение использует PostgreSQL для хранения данных и истории проверок.

Основные возможности

  • Мониторинг различных протоколов: HTTP/HTTPS, SSH, FTP, SMTP, PostgreSQL, Custom TCP
  • Комплексные проверки: DNS lookup, ICMP ping, TCP connect, SSL certificate validation
  • Диагностика блокировок: DNS spoofing, IP blocking, port blocking, DPI detection
  • Автоматический мониторинг: планировщик задач с настраиваемыми интервалами
  • Прокси поддержка: HTTP и SOCKS5
  • Docker интеграция: изолированная PostgreSQL БД в контейнере

Требования

Системные требования

  • Linux (Ubuntu 22.04+, Debian 11+, Arch Linux)
  • PostgreSQL 12+ (или Docker для изолированной БД)
  • Qt 6.2+
  • CMake 3.16+
  • Компилятор C++17 (GCC 9+, Clang 10+)
  • Docker & Docker Compose (опционально, но рекомендуется)

Зависимости

# Ubuntu/Debian
sudo apt update
sudo apt install -y \
    build-essential \
    cmake \
    qt6-base-dev \
    libqt6sql6-psql \
    libpq-dev \
    docker.io \
    docker-compose

# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker

# Arch Linux
sudo pacman -S \
    base-devel \
    cmake \
    qt6-base \
    docker \
    docker-compose

sudo systemctl enable --now docker

Установка и настройка

Быстрый старт

# Автоматическая настройка
./docker-setup.sh

# Или вручную
docker-compose -f docker/docker-compose.yml up -d

# Сборка приложения
cmake -S . -B build
cmake --build build -j$(nproc)

# Запуск
./build/NetworkAvailabilityAnalyzer

Преимущества:

  • ✅ Не нужно настраивать системный PostgreSQL
  • ✅ Изолированная БД в Docker контейнере
  • ✅ Работает одинаково на всех машинах
  • ✅ Легко удалить: docker-compose -f docker/docker-compose.yml down -v

Использование

Добавление ресурсов

  1. Введите URL или IP адрес в поле ввода
  2. Выберите тип сервиса (HTTP, SSH, FTP, и т.д.)
  3. Укажите порт (опционально)
  4. Установите интервал мониторинга (в секундах)
  5. Нажмите "Add Resource"

Проверка ресурсов

  • Разовая проверка: нажмите "Check All Resources"
  • Автоматический мониторинг: нажмите "Start Monitoring"
  • Тестирование одного ресурса: правый клик на ресурсе -> Test

Архитектура проекта

Структура директорий

coursework/
├── src/
│   ├── main.cpp              # Точка входа
│   ├── controller/           # Контроллеры (MVC)
│   │   ├── AppController.cpp
│   │   └── AppController.h
│   ├── model/                # Модели данных
│   │   ├── DatabaseManager.cpp    # PostgreSQL менеджер
│   │   ├── SimpleORM.h            # Собственный ORM
│   │   ├── Resource.h             # ORM модель ресурсов
│   │   ├── CheckHistory.h         # ORM модель истории
│   │   ├── NetworkWorker.cpp      # Сетевые проверки
│   │   ├── AnalysisEngine.cpp     # Анализ результатов
│   │   └── MonitorScheduler.cpp   # Планировщик задач
│   └── view/                 # UI (MVC)
│       ├── MainWindow.cpp
│       └── MainWindow.h
├── docker/                   # Docker конфигурация
│   ├── Dockerfile
│   └── docker-compose.yml
├── build/                    # Артефакты сборки
├── CMakeLists.txt           # Конфигурация CMake
└── setup_database.sh        # Скрипт настройки БД

MVC Архитектура

  • Model: DatabaseManager, NetworkWorker, AnalysisEngine
  • View: MainWindow (Qt Widgets)
  • Controller: AppController (связь между Model и View)

База данных

Таблица resources

CREATE TABLE resources (
    id SERIAL PRIMARY KEY,
    url VARCHAR(512) NOT NULL UNIQUE,
    service_type VARCHAR(50) NOT NULL,
    port INTEGER,
    interval INTEGER DEFAULT 300,
    is_enabled BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Таблица check_history

CREATE TABLE check_history (
    id SERIAL PRIMARY KEY,
    resource_id INTEGER REFERENCES resources(id) ON DELETE CASCADE,
    timestamp TIMESTAMP NOT NULL,
    url VARCHAR(512),
    ip VARCHAR(45),
    dns_match BOOLEAN,
    ping_success BOOLEAN,
    tcp80_success BOOLEAN,
    tcp443_success BOOLEAN,
    http_status_code INTEGER,
    http_success BOOLEAN,
    ssl_success BOOLEAN,
    latency_ms INTEGER,
    available BOOLEAN,
    details TEXT
);

Использование

Docker поддержка

Быстрый старт с Docker

# Запуск PostgreSQL в контейнере
docker-compose -f docker/docker-compose.yml up -d

# Приложение подключится автоматически к БД на localhost:5432
./build/NetworkAvailabilityAnalyzer

Преимущества Docker

  • ✅ Изолированная БД: не затрагивает системный PostgreSQL
  • ✅ Воспроизводимость: одинаковое окружение на любой машине
  • ✅ Легкая очистка: docker-compose down -v удалит всё
  • ✅ Персистентность: данные сохраняются в volume postgres_data

Управление Docker

# Остановка
docker-compose -f docker/docker-compose.yml stop

# Перезапуск
docker-compose -f docker/docker-compose.yml restart

# Просмотр логов PostgreSQL
docker-compose -f docker/docker-compose.yml logs -f postgres

# Подключение к БД в контейнере
docker-compose -f docker/docker-compose.yml exec postgres psql -U netanalyzer_user -d network_analyzer

# Полная очистка (удалит данные!)
docker-compose -f docker/docker-compose.yml down -v

Docker поддержка

Быстрый старт с Docker

# Запуск PostgreSQL в контейнере
docker-compose -f docker/docker-compose.yml up -d

# Приложение подключится автоматически к БД на localhost:5432
./build/NetworkAvailabilityAnalyzer

Преимущества Docker

  • ✅ Изолированная БД: не затрагивает системный PostgreSQL
  • ✅ Воспроизводимость: одинаковое окружение на любой машине
  • ✅ Легкая очистка: docker-compose down -v удалит всё
  • ✅ Персистентность: данные сохраняются в volume postgres_data

Управление Docker

# Остановка
docker-compose -f docker/docker-compose.yml stop

# Перезапуск
docker-compose -f docker/docker-compose.yml restart

# Просмотр логов PostgreSQL
docker-compose -f docker/docker-compose.yml logs -f postgres

# Подключение к БД в контейнере
docker-compose -f docker/docker-compose.yml exec postgres psql -U netanalyzer_user -d network_analyzer

# Полная очистка (удалит данные!)
docker-compose -f docker/docker-compose.yml down -v

Разработка

Пересборка после изменений

cd build
cmake --build . -j$(nproc)

Очистка сборки

rm -rf build
cmake -S . -B build
cmake --build build

Просмотр логов БД

docker-compose -f docker/docker-compose.yml logs -f postgres

Подключение к БД

docker-compose -f docker/docker-compose.yml exec postgres psql -U netanalyzer_user -d network_analyzer

Технологии

  • Qt 6: GUI framework (Widgets, Network, SQL)
  • PostgreSQL: реляционная СУБД с FOREIGN KEY и индексами
  • CMake: система сборки
  • C++17: стандарт языка
  • Qt SQL ORM: Prepared Statements для защиты от SQL injection
  • MVC Architecture: разделение Model, View, Controller

Безопасность

Проект реализует следующие меры безопасности в соответствии с требованиями информационной безопасности:

1. SQL Injection Protection

Проблема: Внедрение вредоносного SQL-кода через пользовательский ввод.

Решение: Собственный ORM с Prepared Statements во всех операциях с БД.

// Пример из Resource.h: bindInsertValues использует bindValue вместо конкатенации
void bindInsertValues(QSqlQuery &query) const override {
    query.bindValue(":url", m_url);           // Безопасная параметризация
    query.bindValue(":service_type", m_serviceType);
    query.bindValue(":port", m_port);
    // Невозможно внедрить: "; DROP TABLE users; --"
}

Защита: Все значения передаются как параметры, а не конкатенируются в строку запроса.

2. Type Safety (Строгая типизация)

Проблема: Ошибки типов данных во время выполнения (runtime).

Решение: C++ статическая типизация + проверка на этапе компиляции.

// Компилятор не позволит передать строку вместо числа
bool addResource(const QString &url, ServiceType serviceType, int port, int interval);

3. Input Validation

Проблема: Некорректные или вредоносные данные от пользователя.

Решение: Проверка на уровне UI и бизнес-логики.

// ConfigManager.cpp: валидация порта СУБД
int port = settings.value("Database/Port", 5432).toInt();
if (port < 1 || port > 65535) port = 5432;  // Защита от переполнения

// MainWindow.cpp: проверка URL перед добавлением
if (urlInput.isEmpty()) {
    QMessageBox::warning(this, "Error", "URL cannot be empty");
    return;
}

4. PostgreSQL Security

Изоляция пользователя:

  • Отдельный пользователь netanalyzer_user (не postgres)
  • Доступ только к БД network_analyzer
  • MD5 аутентификация
  • Минимальные привилегии (только CRUD для своих таблиц)
# docker-compose.yml
environment:
  POSTGRES_USER: netanalyzer_user      # Не root!
  POSTGRES_PASSWORD: secure_password   # Из переменных окружения в продакшне

5. SSL/TLS Validation

Проблема: Man-in-the-Middle атаки при HTTPS проверках.

Решение: Qt Network с проверкой сертификатов.

// NetworkWorker.cpp: проверка SSL сертификата
QSslCertificate cert = reply->sslConfiguration().peerCertificate();
if (cert.isNull() || cert.expiryDate() < QDateTime::currentDateTime()) {
    result.sslSuccess = false;
    result.details = "Invalid or expired SSL certificate";
}

6. Attack Detection

Диагностика блокировок:

  • DNS Spoofing: Сравнение ожидаемого IP с реальным
  • DPI (Deep Packet Inspection): TCP работает, HTTP блокируется
  • IP Blocking: DNS работает, TCP не подключается
  • MITM: Несовпадение SSL сертификатов
// AnalysisEngine.cpp: детектирование DNS spoofing
if (result.dnsMatch == false && !result.dnsIp.isEmpty()) {
    return "DNS Spoofing: expected IP differs from resolved IP";
}

7. No Raw SQL in Business Logic

Архитектурное решение: Весь SQL изолирован в ORM Entity классах.

// ❌ НЕТ такого кода в проекте:
db.exec("SELECT * FROM resources WHERE url = '" + userInput + "'");  // ОПАСНО!

// ✅ Вместо этого используется ORM:
Resource::findAll(db, "url = :url", {{":url", userInput}});  // БЕЗОПАСНО!

Паттерн Active Record: SQL находится в Entity (Resource.h, CheckHistory.h), но это описание схемы, аналог Django Models. Все значения передаются через bindValue().

8. Secure Credentials Management

// ConfigManager поддерживает переменные окружения
QString password = qEnvironmentVariable("DB_PASSWORD", settings.value(...).toString());

Рекомендация для продакшна:

export DB_PASSWORD="krutoy_parol_777"
./NetworkAvailabilityAnalyzer

9. Docker Isolation

  • PostgreSQL в изолированном контейнере
  • Постоянность через Docker volumes (не bind mounts)
  • Нет прямого доступа к файловой системе хоста

Устранение неполадок

Ошибки компиляции

# Проверьте установку Qt
qmake --version

# Переустановите зависимости
sudo apt install --reinstall qt6-base-dev

Приложение не запускается

# Проверьте зависимости
ldd build/NetworkAvailabilityAnalyzer

# Установите недостающие библиотеки Qt
sudo apt install qt6-base-plugins

About

Курсовая работа по программированию, третий семестр, ИБ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages