Skip to content

OAuth\mTLS\OIDc auth microservice with a web UI. Allows working via gRPC protocol.

Notifications You must be signed in to change notification settings

Arlandaren/auth-microservice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

79 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Auth Service (Сервис Аутентификации)

Обзор

Добро пожаловать в репозиторий Auth Service! Этот сервис предоставляет функциональность аутентификации с использованием gRPC и gRPC-Gateway. Он поддерживает безопасное общение с помощью TLS-шифрования, включает метрики Prometheus для мониторинга, а также централизованное логирование с помощью Loki и Promtail. Сервис развёртывается с использованием Docker Compose, включающего дополнительные сервисы, такие как Nginx, Grafana, PostgreSQL и экспортеры метрик.


Содержание


Возможности

  • Аутентификация пользователей: Функционал регистрации и входа для пользователей и администраторов.
  • Безопасное общение: Использует TLS-шифрование для gRPC и HTTPS серверов.
  • Метрики и мониторинг: Интеграция с Prometheus для сбора метрик и Grafana для визуализации.
  • Централизованное логирование: Использует Loki и Promtail для сбора и хранения логов.
  • Фасад: Nginx в качестве обратного прокси-сервера для управления трафиком и antiDDOS щита.
  • Структурированное логирование: Использует logrus для структурированного и уровневого логирования.
  • Масштабируемость: Спроектирован с использованием Docker Compose для лёгкого развёртывания и масштабирования.
  • Соответствие стандартам: Следует лучшим практикам безопасности и организации кода.

Архитектура

Auth Service состоит из следующих компонентов:

  • gRPC сервер: Обрабатывает запросы аутентификации по gRPC.
  • gRPC-Gateway: Предоставляет HTTPS эндпоинты, переводя RESTful вызовы в gRPC.
  • Nginx: используется в качестве обратного прокси-сервера для маршрутизации и защиты трафика.
  • TLS сертификаты: Обеспечивают безопасное общение между клиентами и серверами.
  • Prometheus и Grafana: Сбор и визуализация метрик для мониторинга сервиса.
  • Loki и Promtail: Централизованное логирование и хранение логов.
  • Docker Compose: Оркестрирует сервис вместе с зависимостями, такими как PostgreSQL, Nginx, Prometheus, Grafana, Loki и др.

Предварительные требования

Перед началом убедитесь, что у вас установлено:

  • Go: Версии 1.16 или выше.
  • Docker: Для контейнеризации.
  • Docker Compose: Для оркестрации.
  • Task: Для выполнения команд task (опционально, но рекомендуется).

Начало работы

Клонирование репозитория

git clone https://github.com/Arlandaren/auth-microservice.git
cd auth_microservice

Переменные окружения

Создайте файл .env в корневой директории и заполните его следующими переменными:

# Конфигурация PostgreSQL
POSTGRES_USER=your_postgres_user
POSTGRES_PASSWORD=your_postgres_password
POSTGRES_DB=your_database_name
PG_STRING=postgres://your_postgres_user:your_postgres_password@postgres:5432/your_database_name?sslmode=disable

# Адреса сервиса
GRPC_ADDRESS=0.0.0.0:50051
HTTP_ADDRESS=0.0.0.0:8086

# Рабочее окружение
ENVIRONMENT=development

# JWT секрет
jwt_key=your_jwt_secret

Примечание: Замените значения на ваши реальные настройки.

Генерация сертификатов

Для обеспечения безопасного общения требуются TLS-сертификаты. Предоставлена Go-программа для генерации самоподписанных сертификатов.

Генерация сертификатов:

cd cmd/tls
go run generate_certificates.go
cd ..
cd ..

Это создаст следующие сертификаты в директории certificates:

  • caCertificate.pem и caCertificate.crt
  • serverCertificate.pem и serverPrivateKey.pem
  • clientCertificate.pem и clientPrivateKey.pem

Сборка и запуск с помощью Docker Compose

Убедитесь, что вы находитесь в корневой директории проекта.

Сборка и запуск сервисов:

docker-compose up -d --build

Эта команда соберёт Docker-образы и запустит сервисы, определённые в файле docker-compose.yml.

Проверка запущенных контейнеров:

docker-compose ps

Сервисные компоненты

В вашем docker-compose.yml определены следующие сервисы:

  • nginx: Обратный прокси-сервер для маршрутизации запросов к auth_service.
  • postgres: База данных PostgreSQL для хранения данных пользователей.
  • auth_service: Основной сервис аутентификации, реализующий функционал регистрации и входа.
  • prometheus: Сбор метрик от сервисов для мониторинга.
  • grafana: Визуализация метрик и создание дашбордов.
  • nginx-exporter: Экспортер метрик Nginx для Prometheus.
  • loki: Система для централизованного сбора и хранения логов.
  • promtail: Агент для сбора логов из контейнеров и передачи их в Loki.

Эндпоинты сервиса

gRPC эндпоинты

gRPC сервер auth_service слушает на адресе, указанном в GRPC_ADDRESS (по умолчанию 0.0.0.0:50051).

Определение в Proto-файле:

Определения сервисов содержатся в auth_v1.proto.

service AuthService {
  rpc Login(LoginRequest) returns (LoginResponse) {}
  rpc Register(RegisterRequest) returns (RegisterResponse) {}
  rpc RegisterAdmin(RegisterAdminRequest) returns (RegisterAdminResponse) {}
}

HTTP эндпоинты

gRPC-Gateway предоставляет HTTPS эндпоинты.

-HTTPS адрес: Указан в HTTP_ADDRESS (по умолчанию 0.0.0.0:8086).

  • Эндпоинты:

    • POST /v1/auth/login
    • POST /v1/auth/register
    • POST /v1/auth/register/admin

Мониторинг и логирование

Метрики Prometheus

Метрики доступны на отдельном HTTP-сервере, работающем на порту 9000 через auth_service.

-Метрики эндпоинт: http://localhost:9000/metrics -Конфигурация Prometheus:

Файл prometheus.yml включает директивы для сбора метрик из сервисов:

scrape_configs:
  - job_name: 'auth_service'
    static_configs:
      - targets: ['auth_service:9000']

  - job_name: 'nginx'
    static_configs:
      - targets: ['nginx-exporter:9113']

Логирование с использованием Loki и Promtail

Loki используется для централизованного сбора и хранения логов, а Promtail собирает логи из контейнеров и отправляет их в Loki.

  • Конфигурация Loki хранится в файле loki-config.yaml.
  • Конфигурация Promtail хранится в файле promtail-config.yaml.
  • Контейнеры помечены меткой loki: 'true' для идентификации Promtail.

Доступ к логам: http://localhost:3100

Дашборд Grafana

-Доступ к Grafana: http://localhost:3000 -Стандартные учетные данные:

  • Логин: admin
  • Пароль: admin

-Добавление Data Sources:

1.Prometheus:

  • URL: http://prometheus:9090

2.Loki:

  • URL: http://loki:3100

-Импорт дашбордов:

Вы можете импортировать готовые дашборды или создать свои для визуализации метрик и логов.


Сервисные компоненты

Nginx

Nginx используется в качестве обратного прокси-сервера для маршрутизации и защиты трафика.

Основные функции Nginx в данном проекте:

  • TLS и mTLS: Обеспечивает безопасное соединение с использованием TLS 1.2 и 1.3, а также настроено взаимное TLS (mTLS) для проверки клиентских сертификатов.
  • Ограничение доступа:
    • Ограничение количества запросов: Настроено ограничение скорости запросов и количества соединений от одного IP-адреса для защиты от DDoS и брутфорс-атак.
    • Настройки таймаутов и буферов: Определены таймауты и размеры буферов для улучшения безопасности и производительности.
  • Обработка HTTP и gRPC-трафика:
    • Проксирование REST API запросов к auth_service по HTTPS.
    • Проксирование gRPC запросов к auth_service с поддержкой HTTP/2 и TLS.
  • Метрики Nginx:
    • Настроен сервер для доступа к метрикам Nginx через stub_status, используемый nginx-exporter для Prometheus.

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

auth_service/
|-- certificates/             # TLS сертификаты
|-- internal/
|   |-- repository/           # Взаимодействие с базой данных
|   |-- service/              # Бизнес-логика
|   |-- shared/
|       |-- config/           # Управление конфигурацией
|       |-- logger/           # Настройка логирования
|       |-- prometheus/       # Middleware для метрик Prometheus
|       |-- storage/
|           |-- dto/          # Объекты передачи данных
|           |-- postgres/     # Настройка PostgreSQL
|       |-- utils/            # Утилиты (например, загрузка TLS)
|   |-- transport/
|   |-- grpc/auth.go          # Настройка gRPC сервера
|-- pkg/
|   |-- grpc/
|       |-- auth_v1/          # Сгенерированный gRPC код из proto файлов
|-- docker-compose.yml        # Конфигурация Docker Compose (включая все сервисы)
|-- prometheus.yml            # Конфигурация Prometheus
|-- loki-config.yaml          # Конфигурация Loki
|-- promtail-config.yaml      # Конфигурация Promtail
|-- .env                      # Переменные окружения
|-- main.go                   # Точка входа в приложение
|-- Taskfile.yml                  # Команды Make (опционально)


Проверка на антивирус

Сервис проверен антивирусными сервисами.

Результат проверки можно посмотреть: VirusTotal.


Плюсы и минусы решения

Плюсы

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

  • TLS и mTLS: Использование TLS-шифрования и взаимной аутентификации (mTLS) обеспечивает высокий уровень безопасности при передаче данных между клиентом и сервером. Это защищает данные от перехвата и неавторизованного доступа.
  • Проверка клиентских сертификатов: mTLS гарантирует, что только доверенные клиенты могут подключаться к сервису, уменьшая риск несанкционированного доступа.
  • Ограничение доступа в Nginx: Настройка ограничений на количество соединений и скорости запросов помогает предотвратить DDoS-атаки и брутфорс-попытки.

2. Масштабируемость и Производительность

  • Docker Compose: Использование Docker Compose упрощает развёртывание и масштабирование сервисов, обеспечивая консистентную среду для разработки и продакшена.
  • Nginx: Использование Nginx в качестве обратного прокси повышает производительность и позволяет эффективно управлять трафиком, распределяя нагрузку между сервисами.
  • gRPC и HTTP/2: Использование gRPC поверх HTTP/2 улучшает производительность за счёт асинхронности и сжатия данных.

3. Мониторинг и Логирование

  • Prometheus и Grafana: Интеграция с Prometheus для сбора метрик и Grafana для визуализации позволяет эффективно мониторить работу сервисов и быстро реагировать на проблемы.
  • Loki и Promtail: Централизованное логирование облегчает отладку и отслеживание событий в системе, обеспечивая быстрый доступ к логам всех сервисов.

4. Структурированная Архитектура

  • Модульность: Разделение на микросервисы с чётко определёнными обязанностями упрощает поддержку и расширение системы.
  • Использование современных технологий: Применение Go, gRPC, Docker и других современных инструментов обеспечивает актуальность и эффективность решения.

5. Соответствие Лучшим Практикам

  • Структурированное логирование: Использование logrus для логирования обеспечивает консистентность и удобство в анализе логов.
  • Кодовая База: Сервис следует паттернам и стандартам Go, что облегчает чтение и поддержку кода.

Минусы

1. Сложность Настройки

  • Высокий Порог Входа: Из-за использования множества технологий (TLS/mTLS, Docker, gRPC, Prometheus, Loki и т.д.) первоначальная настройка и освоение могут занять значительное время.
  • Сложность Конфигурации Nginx: Правильная настройка Nginx для поддержки mTLS, gRPC и ограничений доступа требует глубокого понимания его конфигурации и может стать источником ошибок.

2. Поддержка и Обслуживание

  • Необходимость Поддерживать Сертификаты: mTLS требует управления сертификатами, включая их генерацию, обновление и распространение среди клиентов, что добавляет административную нагрузку.
  • Обновления и Совместимость: При обновлении компонентов (например, обновление версий Docker, Nginx, Prometheus) могут возникнуть проблемы с совместимостью, требующие дополнительных усилий для их разрешения.

3. Ресурсозатратность

  • Использование Множества Контейнеров: Запуск множества сервисов в Docker может потребовать значительных системных ресурсов, что необходимо учитывать при планировании инфраструктуры.
  • Перегрузка При Малых Нагрузках: Для небольших проектов данное решение может быть избыточным и усложнять систему без существенной выгоды.

4. Сложность Отладки

  • Многоуровневая Архитектура: Ошибки могут возникать на различных уровнях (сертификаты, конфигурация Nginx, микросервисы), что усложняет процесс отладки и требует опыта в различных областях.
  • Логи: Несмотря на централизованное логирование, объём логов от множества сервисов может быть большим, что затруднит поиск конкретных проблем без правильной настройки фильтров и поиска.

5. Требования к Безопасности

  • Самоподписанные Сертификаты: Использование самоподписанных сертификатов может быть небезопасным в продакшене и требует замены на сертификаты от доверенных центров сертификации.
  • Настройки по Умолчанию: Если не скорректировать некоторые настройки (например, allow all в Nginx), система может быть уязвима для атак.

Интеграция с Posty

Дополнительный сервис Posty демонстрирует возможности Auth Service, предоставляя функциональность создания и управления постами и комментариями.

Установка Posty

  1. Клонируйте репозиторий Posty:

    git clone https://github.com/Arlandaren/Posty.git
    cd vtb-api-hackathon-client
  2. Следуйте инструкциям в README Posty для установки и запуска.

Интеграция фронтенда

Фронтенд Posty интегрирован с Auth Service для управления аутентификацией пользователей. Основные изменения:

  • Использование JWT токенов для авторизации запросов.
  • Перенаправление пользователей на страницы входа/регистрации при отсутствии токена.

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

  1. Запустите Auth Service и Posty.
  2. Перейдите на http://localhost:3002 для доступа к фронтенду Posty.
  3. Зарегистрируйтесь или войдите в систему.
  4. Управляйте постами и комментариями, используя интегрированные возможности аутентификации.

Фронтенд для Auth Service

Фронтенд для Auth Service предоставляет интерфейс для регистрации, входа и управления пользователями.

Установка

  1. Перейдите в директорию фронтенда:

    cd frontend
  2. Установите зависимости:

    npm install
  3. Запустите приложение:

    npm start

Приложение будет доступно по адресу http://localhost:3001.

Компоненты

  • Login: форма для входа пользователей.
  • Register: форма для регистрации новых пользователей.
  • Dashboard: панель управления для аутентифицированных пользователей.
  • PrivateRoute: защищенные маршруты, доступные только аутентифицированным пользователям.

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

  1. Перейдите на http://localhost:3001.
  2. Зарегистрируйтесь или войдите в систему.
  3. Получите доступ к защищенным маршрутам через панель управления.

Контакты

Если у вас есть вопросы или нужна поддержка, пожалуйста, свяжитесь с нами по telegram.

About

OAuth\mTLS\OIDc auth microservice with a web UI. Allows working via gRPC protocol.

Resources

Stars

Watchers

Forks

Packages

No packages published