## Root Cause Analysis - Found CRITICAL RCE vulnerability in Next.js 15.0.3 (GHSA-9qr9-h5gf-34mp) - 10 vulnerabilities total including SSRF, DoS, Auth Bypass - Attack vector: exposed port 3000 + vulnerable Next.js → remote code execution ## Security Fixes - Upgraded Next.js: 15.0.3 → 15.5.9 (0 vulnerabilities) - Upgraded eslint-config-next: 15.0.3 → 15.5.9 ## Hardening (New Files) - apps/web/Dockerfile.secure: Multi-stage build, read-only FS, no shell - docker-compose.web.secure.yml: Resource limits, cap_drop ALL, localhost bind - scripts/rebuild-daarion-web-secure.sh: Local secure rebuild with Trivy scan - scripts/deploy-daarion-web-node1.sh: Production deployment to NODE1 - SECURITY-REBUILD-REPORT.md: Full incident analysis and remediation report ## Key Security Measures - restart: "no" (until verified) - ports: 127.0.0.1:3000 (localhost only, use Nginx reverse proxy) - read_only: true - cap_drop: ALL - resources.limits: 1 CPU, 512M RAM - no-new-privileges: true ## Related Incidents - Incident #1 (Jan 8): catcal, G4NQXBp miners - Incident #2 (Jan 9): softirq, vrarhpb miners - Hetzner AbuseID: 10F3971:2A Co-authored-by: Cursor Agent <agent@cursor.sh>
7.9 KiB
📊 Аналіз стану НОДА1 — 8 січня 2026
Час аналізу: 2026-01-08 21:06 UTC
Сервер: 144.76.224.179 (Ubuntu 24.04)
Uptime: 1:39 (після останнього перезавантаження)
✅ Загальний статус
Сервер: ✅ Доступний та працює
Основні сервіси: ✅ Працюють (Router, Gateway, PostgreSQL, Redis, Qdrant)
Firewall: ✅ Активний та блокує внутрішні мережі
Моніторинг: ✅ Працює (cron кожні 15 хвилин)
⚠️ Проблеми, що потребують уваги
🔴 Критичні проблеми
1. Контейнери в циклі перезапуску (DNS проблема)
Контейнери:
daarion-agents-service— RestartCount=27, ExitCode=3daarion-auth— RestartCount=27, ExitCode=3daarion-synapse— RestartCount=25, ExitCode=1
Причина:
socket.gaierror: [Errno -3] Temporary failure in name resolution
Деталі:
daarion-agents-serviceнамагається підключитися доdagi-postgres:5432daarion-authнамагається підключитися доdagi-postgres:5432- Але контейнер називається
daarion-postgres, а неdagi-postgres!
Рішення:
- Змінити
DATABASE_URLв обох контейнерах:- Замість:
postgresql://postgres:postgres@dagi-postgres:5432/daarion - На:
postgresql://postgres:postgres@daarion-postgres:5432/daarion
- Замість:
- Або створити network alias:
dagi-postgres→daarion-postgres
Файли для зміни:
- Environment variables в
docker-compose.ymlабо.env - Або через
docker network connectз alias
2. Unhealthy контейнери
Контейнери:
daarion-city-service— Up 2 hours (unhealthy)dagi-ocr-service— Up 2 hours (unhealthy)
Дії:
- Перевірити логи:
docker logs daarion-city-service --tail 50 - Перевірити логи:
docker logs dagi-ocr-service --tail 50 - Перевірити health check endpoints
🟡 Попередження
1. Високе навантаження CPU
Load Average: 18.91, 18.57, 22.53
Причина: PostgreSQL активно працює (1118% CPU — це нормально для бази даних під навантаженням)
Деталі:
- PostgreSQL контейнер: 1718.95% CPU, 2.56GB RAM
- Це нормально для активної бази даних
- Система має 20 CPU cores, тому це не критично
Рекомендація: Моніторити, але не критично.
2. Логи сканування (False Positives)
Що бачимо:
- Багато записів
BLOCKED_INTERNAL_SCANв/var/log/scan_attempts.log - Але це Kubernetes внутрішній трафік (10.42.0.x — CNI мережа k3s)
- НЕ справжнє сканування Hetzner мережі (10.126.0.0/16)
Деталі:
- Firewall правила блокуватимуть всі підключення до 10.0.0.0/8
- Kubernetes використовує 10.42.0.0/16 для своїх pod'ів
- Це створює false positives в логах
Рекомендація:
- Оновити
/root/monitor_scanning.shщоб фільтрувати Kubernetes трафік - Або додати виняток для 10.42.0.0/16 в firewall правилах (якщо потрібно)
3. Незбережені зміни в Git
Файли:
scripts/start-city-space-services.sh— modifiedscripts/stop-city-space-services.sh— modifiedscripts/stop-prod.sh— modified
Рекомендація: Зробити commit або stash змін.
✅ Що працює добре
1. Основні сервіси
- ✅
dagi-router— healthy, працює нормально - ✅
dagi-postgres(daarion-postgres) — healthy, активно працює - ✅
swapper-service— healthy - ✅
dagi-nats— healthy - ✅
dagi-vector-db-service— healthy - ✅
dagi-web-search-service— healthy - ✅
dagi-stt-service— healthy - ✅
dagi-qdrant— працює - ✅
telegram-bot-api— працює
2. Безпека
- ✅ Firewall правила активні:
- Блокування 10.0.0.0/8 (з винятками для 80/443)
- Блокування 172.16.0.0/12
- Логування заблокованих спроб
- ✅ Моніторинг активний:
/root/monitor_scanning.sh— cron кожні 15 хвилин/root/prevent_scanning.sh— firewall скрипт- Логи в
/var/log/scan_attempts.log
3. Ресурси
- ✅ RAM: 8.3GB / 62GB використано (13%)
- ✅ Disk: 365GB / 1.7TB використано (23%)
- ✅ CPU: 20 cores доступно
- ✅ Swap: 0B / 31GB використано
📋 Рекомендації
Негайні дії (високий пріоритет)
-
Виправити DNS проблему:
# Варіант 1: Змінити DATABASE_URL в docker-compose.yml # Варіант 2: Додати network alias docker network connect --alias dagi-postgres dagi-network daarion-postgres -
Перевірити unhealthy контейнери:
docker logs daarion-city-service --tail 50 docker logs dagi-ocr-service --tail 50 -
Перевірити daarion-synapse:
docker logs daarion-synapse --tail 50
Середній пріоритет
-
Оновити моніторинг скрипт:
- Фільтрувати Kubernetes трафік (10.42.0.0/16)
- Або додати виняток в firewall
-
Зберегти зміни в Git:
cd /opt/microdao-daarion git add scripts/ git commit -m "chore: update city space service scripts"
Низький пріоритет
- Моніторити навантаження CPU:
- PostgreSQL активно працює, це нормально
- Якщо load average залишиться високим після виправлення DNS — перевірити інші процеси
🔍 Детальна інформація
Контейнери (загалом: 30)
Працюють нормально: 25
Unhealthy: 2
Restarting: 3
Мережі Docker
dagi-network— основна мережа для DAGI сервісівdaarion-network— мережа для DAARION сервісівdocker_default— Dify сервіси- Інші: ocr-service, stt-service, vector-db-service, web-search-service
Cron jobs
*/5 * * * *—/opt/microdao-daarion/scripts/monitor-db-stability.sh*/15 * * * *—/root/monitor_scanning.sh
📝 Висновок
Загальний стан: 🟡 Потребує уваги
Основна проблема: DNS конфігурація для PostgreSQL — контейнери не можуть знайти базу даних через неправильне ім'я хоста.
Критичність: Середня — основні сервіси працюють, але 3 контейнери в циклі перезапуску.
Наступні кроки:
- Виправити
DATABASE_URLвdaarion-agents-serviceтаdaarion-auth - Перевірити логи unhealthy контейнерів
- Оновити моніторинг скрипт для фільтрації Kubernetes трафіку
Звіт створено: 2026-01-08 21:06 UTC
Агентом: Cursor AI (використовуючи інструкції з INFRASTRUCTURE.md)