Самостоятельный хостинг SecureExec с Docker Compose
Одна из ключевых целей проектирования SecureExec — возможность запустить всю платформу на собственной инфраструктуре одной командой. В этой статье рассматривается production-готовое развёртывание через Docker Compose, включая TLS, защиту Elasticsearch и базовый харднинг.
Обзор архитектуры
Полное развёртывание SecureExec состоит из четырёх сервисов:
| Сервис | Образ | Назначение |
|---|---|---|
server | secureexec-server | gRPC-сервер приёма данных (порт 50051) |
backend | secureexec-backend | REST API и бэкенд веб-приложения (порт 8080) |
frontend | secureexec-frontend | Интерфейс Next.js (порт 3000) |
elasticsearch | elasticsearch:8.x | Хранилище и поиск событий |
server и backend взаимодействуют по внутренней сети Docker. Агенты обращаются только к server, а браузер — только к frontend/backend.
Конфигурация окружения
Все секреты передаются через переменные окружения. Скопируйте .env.example в .env и настройте:
# Elasticsearch
ELASTICSEARCH_PASSWORD=strong-password
# Бэкенд веб-приложения
DATABASE_URL=postgres://user:pass@postgres/secureexec
SECRET_KEY=your-jwt-secret
# gRPC-сервер — указывает на бэкенд для проверки токенов
WEBAPP_BACKEND_URL=http://backend:8080
# Опционально: TLS для gRPC-сервера
SECUREEXEC_TLS_CERT=/certs/server.crt
SECUREEXEC_TLS_KEY=/certs/server.key
Включение TLS на gRPC-сервере
Агенты подключаются непосредственно к gRPC-серверу. В production следует терминировать TLS на самом сервере (не на реверс-прокси), чтобы агенты могли проверить сертификат сервера:
# Генерация самоподписанного CA и сертификата сервера
openssl genrsa -out ca.key 4096
openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj "/CN=SecureExec CA"
openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr -subj "/CN=secureexec-server"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
Смонтируйте сертификаты в контейнер сервера и задайте переменные окружения выше. Распространите ca.crt на агенты.
Безопасность Elasticsearch
Никогда не запускайте Elasticsearch с отключённой безопасностью в production. Стек Compose включает безопасность Elasticsearch по умолчанию. server и backend используют базовую аутентификацию (пользователь elastic) для взаимодействия с Elasticsearch.
Задайте ELASTICSEARCH_PASSWORD в виде надёжного пароля. Сервер читает его из ELASTICSEARCH_PASSWORD, бэкенд — из той же переменной.
Реверс-прокси
Для веб-приложения разместите Nginx или Caddy перед фронтендом на порту 443 и проксируйте /api на бэкенд. gRPC-сервер следует открывать напрямую на порту 50051 (или другом порту) с собственным TLS-сертификатом.
Обновление
SecureExec использует файлы версий для каждого компонента (server/version, webapp/backend/version, webapp/frontend/version). При выходе новой версии:
docker compose pull
docker compose up -d
Маппинги Elasticsearch обновляются автоматически при запуске через управление шаблонами индексов.
Мониторинг
gRPC-сервер и бэкенд веб-приложения выводят структурированные JSON-логи через tracing. Направьте логи в вашу SIEM или агрегатор. Ключевые события для оповещений:
token validation failed— повторные сбои могут указывать на bruteforce-атакуelasticsearch bulk index failed— события теряютсяstream error— проблемы с подключением агента