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

7.9 KiB
Raw Blame History

📊 Аналіз стану НОДА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-postgresdaarion-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 проблему:

    # Варіант 1: Змінити DATABASE_URL в docker-compose.yml
    # Варіант 2: Додати network alias
    docker network connect --alias dagi-postgres dagi-network daarion-postgres
    
  2. Перевірити unhealthy контейнери:

    docker logs daarion-city-service --tail 50
    docker logs dagi-ocr-service --tail 50
    
  3. Перевірити daarion-synapse:

    docker logs daarion-synapse --tail 50
    

Середній пріоритет

  1. Оновити моніторинг скрипт:

    • Фільтрувати Kubernetes трафік (10.42.0.0/16)
    • Або додати виняток в firewall
  2. Зберегти зміни в Git:

    cd /opt/microdao-daarion
    git add scripts/
    git commit -m "chore: update city space service scripts"
    

Низький пріоритет

  1. Моніторити навантаження 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)