## 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>
222 lines
7.9 KiB
Markdown
222 lines
7.9 KiB
Markdown
# 📊 Аналіз стану НОДА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=3
|
||
- `daarion-auth` — RestartCount=27, ExitCode=3
|
||
- `daarion-synapse` — RestartCount=25, ExitCode=1
|
||
|
||
**Причина:**
|
||
```
|
||
socket.gaierror: [Errno -3] Temporary failure in name resolution
|
||
```
|
||
|
||
**Деталі:**
|
||
- `daarion-agents-service` намагається підключитися до `dagi-postgres:5432`
|
||
- `daarion-auth` намагається підключитися до `dagi-postgres:5432`
|
||
- **Але контейнер називається `daarion-postgres`, а не `dagi-postgres`!**
|
||
|
||
**Рішення:**
|
||
1. Змінити `DATABASE_URL` в обох контейнерах:
|
||
- Замість: `postgresql://postgres:postgres@dagi-postgres:5432/daarion`
|
||
- На: `postgresql://postgres:postgres@daarion-postgres:5432/daarion`
|
||
2. Або створити 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` — modified
|
||
- `scripts/stop-city-space-services.sh` — modified
|
||
- `scripts/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 використано
|
||
|
||
---
|
||
|
||
## 📋 Рекомендації
|
||
|
||
### Негайні дії (високий пріоритет)
|
||
|
||
1. **Виправити DNS проблему:**
|
||
```bash
|
||
# Варіант 1: Змінити DATABASE_URL в docker-compose.yml
|
||
# Варіант 2: Додати network alias
|
||
docker network connect --alias dagi-postgres dagi-network daarion-postgres
|
||
```
|
||
|
||
2. **Перевірити unhealthy контейнери:**
|
||
```bash
|
||
docker logs daarion-city-service --tail 50
|
||
docker logs dagi-ocr-service --tail 50
|
||
```
|
||
|
||
3. **Перевірити daarion-synapse:**
|
||
```bash
|
||
docker logs daarion-synapse --tail 50
|
||
```
|
||
|
||
### Середній пріоритет
|
||
|
||
4. **Оновити моніторинг скрипт:**
|
||
- Фільтрувати Kubernetes трафік (10.42.0.0/16)
|
||
- Або додати виняток в firewall
|
||
|
||
5. **Зберегти зміни в Git:**
|
||
```bash
|
||
cd /opt/microdao-daarion
|
||
git add scripts/
|
||
git commit -m "chore: update city space service scripts"
|
||
```
|
||
|
||
### Низький пріоритет
|
||
|
||
6. **Моніторити навантаження 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 контейнери в циклі перезапуску.
|
||
|
||
**Наступні кроки:**
|
||
1. Виправити `DATABASE_URL` в `daarion-agents-service` та `daarion-auth`
|
||
2. Перевірити логи unhealthy контейнерів
|
||
3. Оновити моніторинг скрипт для фільтрації Kubernetes трафіку
|
||
|
||
---
|
||
|
||
**Звіт створено:** 2026-01-08 21:06 UTC
|
||
**Агентом:** Cursor AI (використовуючи інструкції з INFRASTRUCTURE.md)
|