Добро пожаловать в репозиторий 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 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 сервер 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) {}
}
gRPC-Gateway предоставляет HTTPS эндпоинты.
-HTTPS адрес: Указан в HTTP_ADDRESS
(по умолчанию 0.0.0.0:8086
).
-
Эндпоинты:
POST /v1/auth/login
POST /v1/auth/register
POST /v1/auth/register/admin
Метрики доступны на отдельном 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.
- Конфигурация Loki хранится в файле
loki-config.yaml
. - Конфигурация Promtail хранится в файле
promtail-config.yaml
. - Контейнеры помечены меткой
loki: 'true'
для идентификации Promtail.
Доступ к логам: http://localhost:3100
-Доступ к Grafana: http://localhost:3000
-Стандартные учетные данные:
- Логин:
admin
- Пароль:
admin
-Добавление Data Sources:
1.Prometheus:
- URL:
http://prometheus:9090
2.Loki:
- URL:
http://loki:3100
-Импорт дашбордов:
Вы можете импортировать готовые дашборды или создать свои для визуализации метрик и логов.
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.
- Проксирование REST API запросов к
- Метрики Nginx:
- Настроен сервер для доступа к метрикам Nginx через
stub_status
, используемыйnginx-exporter
для Prometheus.
- Настроен сервер для доступа к метрикам Nginx через
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.
- TLS и mTLS: Использование TLS-шифрования и взаимной аутентификации (mTLS) обеспечивает высокий уровень безопасности при передаче данных между клиентом и сервером. Это защищает данные от перехвата и неавторизованного доступа.
- Проверка клиентских сертификатов: mTLS гарантирует, что только доверенные клиенты могут подключаться к сервису, уменьшая риск несанкционированного доступа.
- Ограничение доступа в Nginx: Настройка ограничений на количество соединений и скорости запросов помогает предотвратить DDoS-атаки и брутфорс-попытки.
- Docker Compose: Использование Docker Compose упрощает развёртывание и масштабирование сервисов, обеспечивая консистентную среду для разработки и продакшена.
- Nginx: Использование Nginx в качестве обратного прокси повышает производительность и позволяет эффективно управлять трафиком, распределяя нагрузку между сервисами.
- gRPC и HTTP/2: Использование gRPC поверх HTTP/2 улучшает производительность за счёт асинхронности и сжатия данных.
- Prometheus и Grafana: Интеграция с Prometheus для сбора метрик и Grafana для визуализации позволяет эффективно мониторить работу сервисов и быстро реагировать на проблемы.
- Loki и Promtail: Централизованное логирование облегчает отладку и отслеживание событий в системе, обеспечивая быстрый доступ к логам всех сервисов.
- Модульность: Разделение на микросервисы с чётко определёнными обязанностями упрощает поддержку и расширение системы.
- Использование современных технологий: Применение Go, gRPC, Docker и других современных инструментов обеспечивает актуальность и эффективность решения.
- Структурированное логирование: Использование
logrus
для логирования обеспечивает консистентность и удобство в анализе логов. - Кодовая База: Сервис следует паттернам и стандартам Go, что облегчает чтение и поддержку кода.
- Высокий Порог Входа: Из-за использования множества технологий (TLS/mTLS, Docker, gRPC, Prometheus, Loki и т.д.) первоначальная настройка и освоение могут занять значительное время.
- Сложность Конфигурации Nginx: Правильная настройка Nginx для поддержки mTLS, gRPC и ограничений доступа требует глубокого понимания его конфигурации и может стать источником ошибок.
- Необходимость Поддерживать Сертификаты: mTLS требует управления сертификатами, включая их генерацию, обновление и распространение среди клиентов, что добавляет административную нагрузку.
- Обновления и Совместимость: При обновлении компонентов (например, обновление версий Docker, Nginx, Prometheus) могут возникнуть проблемы с совместимостью, требующие дополнительных усилий для их разрешения.
- Использование Множества Контейнеров: Запуск множества сервисов в Docker может потребовать значительных системных ресурсов, что необходимо учитывать при планировании инфраструктуры.
- Перегрузка При Малых Нагрузках: Для небольших проектов данное решение может быть избыточным и усложнять систему без существенной выгоды.
- Многоуровневая Архитектура: Ошибки могут возникать на различных уровнях (сертификаты, конфигурация Nginx, микросервисы), что усложняет процесс отладки и требует опыта в различных областях.
- Логи: Несмотря на централизованное логирование, объём логов от множества сервисов может быть большим, что затруднит поиск конкретных проблем без правильной настройки фильтров и поиска.
- Самоподписанные Сертификаты: Использование самоподписанных сертификатов может быть небезопасным в продакшене и требует замены на сертификаты от доверенных центров сертификации.
- Настройки по Умолчанию: Если не скорректировать некоторые настройки (например,
allow all
в Nginx), система может быть уязвима для атак.
Дополнительный сервис Posty демонстрирует возможности Auth Service, предоставляя функциональность создания и управления постами и комментариями.
-
Клонируйте репозиторий Posty:
git clone https://github.com/Arlandaren/Posty.git cd vtb-api-hackathon-client
-
Следуйте инструкциям в README Posty для установки и запуска.
Фронтенд Posty интегрирован с Auth Service для управления аутентификацией пользователей. Основные изменения:
- Использование JWT токенов для авторизации запросов.
- Перенаправление пользователей на страницы входа/регистрации при отсутствии токена.
- Запустите Auth Service и Posty.
- Перейдите на
http://localhost:3002
для доступа к фронтенду Posty. - Зарегистрируйтесь или войдите в систему.
- Управляйте постами и комментариями, используя интегрированные возможности аутентификации.
Фронтенд для Auth Service предоставляет интерфейс для регистрации, входа и управления пользователями.
-
Перейдите в директорию фронтенда:
cd frontend
-
Установите зависимости:
npm install
-
Запустите приложение:
npm start
Приложение будет доступно по адресу http://localhost:3001
.
- Login: форма для входа пользователей.
- Register: форма для регистрации новых пользователей.
- Dashboard: панель управления для аутентифицированных пользователей.
- PrivateRoute: защищенные маршруты, доступные только аутентифицированным пользователям.
- Перейдите на
http://localhost:3001
. - Зарегистрируйтесь или войдите в систему.
- Получите доступ к защищенным маршрутам через панель управления.
Если у вас есть вопросы или нужна поддержка, пожалуйста, свяжитесь с нами по telegram.