Files
microdao-daarion/NODE1-ANALYSIS-2026-01-08.md
Apple d77a4769c6 🔒 security(daarion-web): Hardening after crypto-mining incidents
## 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>
2026-01-09 02:08:13 -08:00

222 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📊 Аналіз стану НОДА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)