Skip to content

EgorSinitsyn/TrainSave

Repository files navigation

TrainSafe

TrainSafe — это учебный проект, демонстрирующий микросервисный подход к разработке информационной системы с ролевым доступом, двухфакторной аутентификацией (2FA) и возможностью перехвата, аудита и выполнения SQL-запросов.

Описание

Основные задачи ПО

  1. Проверка IP-адреса клиента, от которого исходят запросы к БД. Если IP-адрес не входит в разрешенный диапазон, запросы игнорируются
  2. Генерация 2FA кода, который валиден в течение 5 минут
  3. Генерация сессии для успешно-авторизованного пользователя (после ввода 2FA с временем действия 30 мин)
  4. Проверка учетных данных пользователя
  5. Перехват, проверка и валидация SQL-запросов, исходящих от клиента
  6. Ведение реестра сессий
  7. Логирование запросов и ведение реестра логов

Структура Проекта

.
├── DB_init.py                                          # Скрипт с инициализацией БД
├── README.md                                           # Описание проекта
├── app-config.yaml                                     # K8s ConfigMap
├── client.py                                           # Клиентский интерфейс для взаимодействия с микросервисами
├── credit_train.csv                                    # Пример датасета для загрузки в БД 
├── docker-compose.yml                                  # Docker-compose файл
├── monitoring                                          # Папка с k8s манифестами Prometheus и Grafana
│         ├── cadvisor-deployment.yaml
│         └── prometheus-values.yaml
├── photos                                              # Папка с изображениями для README
│         ├── Архитектура паттерна общая2.drawio.png
│         └── Архитектура паттерна общая3.drawio.png
├── request_service                                     # Микросервис для обработки SQL-запросов
│         ├── Dockerfile
│         ├── request-service-deployment.yaml
│         ├── request-service-service.yaml
│         ├── request_service.py
│         └── requirements.txt
├── requirements.txt                                    # Требуемые библиотеки
├── server                                              # Основной микросервис с применением паттерна "Цепочка ответственности"
│         ├── Dockerfile
│         ├── requirements.txt
│         ├── server-deployment.yaml
│         ├── server-service.yaml
│         └── server.py
└── two_factor_service                                   # Микросервис для генерации 2FA кодов и их проверкой
    ├── Dockerfile
    ├── requirements.txt
    ├── two-factor-service-deployment.yaml
    ├── two-factor-service-service.yaml
    └── two_factor_service.py

Схемы взаимодействия

Диаграмма последовательности 1 (концептуальный уровень):

Архитектура паттерна 1

Диаграмма последовательности 2 (технический уровень): Архитектура паттерна 2

Реализация через Docker-compose (БД и приложение на удаленных VM): Реализация через Docker-compose

Реализация через K8s (Minikube на локальной машине, БД - на удаленной VM): Реализация через Minikube

Установка

Локальное использование

  1. Клонирование репозитория
git clone https://github.com/EgorSinitsyn/TrainSave
  1. Установка MySQL на локальную машину, убедитесь, что сервер запущен
  2. Создайте файл .env в корне проекта, поместите туда креды от СУБД MySQL. В качестве примера в репозитории уже есть .env
  3. Инициализируйте БД с нужной структурой
python DB_init.py
  1. Установка зависимостей
pip install -r requirements.txt
  1. Запуск микросервисов
python server/server.py
python request_service/request_service.py
python two_factor_service/two_factor_service.py
  1. Запуск клиентского интерфейса
python client.py

Реализация через Docker-compose

  1. Установка Docker и Docker-compose
  2. Создание образов (опционально)
docker build -t server_module ./server
docker build -t request_service_module ./request_service
docker build -t two_factor_service_module ./two_factor_service
  1. Запуск и билд контейнеров через Docker-compose
docker-compose up --build
  1. Запуск клиентского интерфейса
python client.py
  1. Взаимодейтсвие с мультиконтейнерным приложением через клиентское приложение. Скрипты микросервисов включать не нужно
  2. Если мультиконтейнерное приложение запущено на удаленном хосте, измените эндпоинты в файле client.py (см. стоки 5 - 13)

Реализация через Kubernetes (Minikube)

  1. Старт Minikube
minikube start --cpus=4 --memory=5192
  1. Проверяем запуск кластера
kubectl cluster-info
  1. Применение ConfigMap
kubectl apply -f app-config.yaml
  1. Применение деплойментов
kubectl apply -f ./server/server-deployment.yaml
kubectl apply -f ./request_service/request-service-deployment.yaml
kubectl apply -f ./two_factor_service/two-factor-service-deployment.yaml
  1. Применение сервисов
kubectl apply -f ./server/server-service.yaml
kubectl apply -f ./request_service/request-service-service.yaml
kubectl apply -f ./two_factor_service/two-factor-service-service.yaml
  1. Связываем локальный Docker с Minikube
eval $(minikube docker-env)
  1. Создаем образы (обязательно выполнить пред команду)
docker build -t server_module ./server
docker build -t request_service_module ./request_service
docker build -t two_factor_service_module ./two_factor_service
  1. Они обязательно должны отобразиться в Minikube
eval $(minikube docker-env)
docker images
  1. Стягиваем образы в Minikube
minikube image load server_module:latest                                              
minikube image load request_service_module:latest
minikube image load two_factor_service_module:latest
  1. Проверяем статус подов (должно быть running) и сервисов
kubectl get pods
kubectl get svc
  1. Проброс локального хоста в Minikube
kubectl port-forward service/server-service 6000:6000
  1. Устанавливаем Helm, Grafana и Prometheus
  2. Применяем манифест cadvisor
kubectl apply -f ./monitoring/cadvisor-deployment.yaml
  1. Применяем манифест prometheus
helm upgrade prometheus prometheus-community/prometheus -n monitoring -f monitoring/prometheus-values.yaml
  1. Получаем пароль от Grafana
kubectl get secret -n monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode
  1. Порт-форвард для prometheus и grafana
kubectl port-forward -n monitoring svc/prometheus-server 9090:80
kubectl port-forward -n monitoring svc/grafana 3000:80
  1. Заходим на дашборды Prometheus и Grafana через localhost:9090 и localhost:3000 соответственно
  2. В дашборде Prometheus все поды должны быть в статусе UP
  3. В дашборде Grafana добавляем источник данных Prometheus (Connections -> Add data source)
  4. Импортируем дашборды и мониторим кластер
  5. Запускаем клиентское приложение и взаимодействуем через localhost:6000
python client.py

About

Мультиконтейнер для обеспечения безопасности приложения при угрозе несанкционированного доступа к обучающим данным

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors