DOCS v1.0

Documentação SynexGuard

Referência técnica completa — configuração, API, guias de uso e arquitetura do sistema.

📋 Visão Geral

SynexGuard é uma plataforma completa de segurança e monitoramento para servidores Linux. O sistema é composto por três componentes:

✨ Funcionalidades Principais

  • Detecção e bloqueio automático de SSH brute-force
  • Métricas em tempo real (CPU, RAM, disco, conexões)
  • Tráfego de rede por interface
  • Motor de automações com regras personalizáveis
  • Central de alertas com severidade (critical/warning/info)
  • Análise forense — busca em todos os eventos
  • Log stream centralizado ao vivo
  • Multi-tenant — isolamento total entre clientes
  • Autenticação JWT + tokens de agente seguros
  • Painel de administração (superadmin)

🏗 Arquitetura

O fluxo de dados segue uma direção clara:

┌─────────────────────────────────────────────────────────────┐
│  Servidor Linux (N instâncias)                             │
│  ┌──────────────────────┐                                   │
│  │ 🛡 SynexGuard Agent   │  ← Go binary + systemd            │
│  │  • auth.log parser   │                                   │
│  │  • system metrics    │                                   │
│  │  • network stats     │                                   │
│  └─────────┬────────────┘                                   │
└────────────┼────────────────────────────────────────────────┘
             │ POST /api/v1/agents/heartbeat
             │ Header: X-Agent-Token: ng_xxxxx
             ▼
┌─────────────────────────────────────────────────────────────┐
│  Backend (FastAPI + Python)                                 │
│  ┌──────────────┐  ┌───────────────┐  ┌──────────────────┐ │
│  │  Routers     │  │ Automation    │  │   Data Store     │ │
│  │  (11 módulos)│→ │ Engine        │→ │   (in-memory)    │ │
│  └──────────────┘  └───────────────┘  └──────────────────┘ │
│  JWT Auth · Rate Limiting · Prometheus                      │
└─────────────────────────────┬───────────────────────────────┘
                              │ REST API + JWT Bearer
                              ▼
┌─────────────────────────────────────────────────────────────┐
│  Frontend (React + Vite + TypeScript)                       │
│  Dashboard · Servidores · Segurança · Métricas · Logs       │
│  Alertas · Automações · Forense · Tráfego · Admin           │
└─────────────────────────────────────────────────────────────┘

🔧 Stack Tecnológica

ComponenteTecnologiaVersão
AgenteGo1.21+
BackendPython + FastAPI + Uvicorn3.12+ / 0.115 / 0.32
FrontendReact + TypeScript + Vite + Tailwind CSS18.3 / 5.7 / 6.4 / 3.4
AuthJWT (HS256) via python-jose
HashingPBKDF2-HMAC-SHA256 (260k iter.)
Métricasprometheus-client
ContainerDocker + docker-compose

📦 Requisitos

Backend

Frontend

Agente

Instalação do Backend

1. Clone e entre no diretório

# Clone o repositório
git clone https://github.com/seu-usuario/synexguard.git
cd nodeguard/backend

2. Crie um ambiente virtual (recomendado)

python -m venv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate     # Windows

3. Instale dependências

pip install -r requirements.txt

4. Configure variáveis de ambiente

# Crie o arquivo .env na pasta backend/
cp .env.example .env
# Edite com suas configurações (ver seção Variáveis de Ambiente)

5. Inicie o servidor

# Desenvolvimento (com auto-reload)
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

# Produção (com workers)
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4

✅ Verificação

Acesse http://localhost:8000/health — deve retornar {"status":"ok","timestamp":"..."}

🖥 Instalação do Frontend

cd frontend
npm install
npm run dev       # Desenvolvimento — http://localhost:5173

Build para Produção

npm run build     # Gera pasta dist/

# Servir com Nginx:
server {
    listen 80;
    root /path/to/frontend/dist;
    location / { try_files $uri /index.html; }
    location /api/ { proxy_pass http://127.0.0.1:8000; }
}

🔗 Proxy de Desenvolvimento

O Vite já está configurado para fazer proxy de /api para http://localhost:8000 automaticamente via vite.config.ts.

🐳 Deploy com Docker

# Na raiz do projeto
docker compose up --build -d

# Ver logs
docker compose logs -f

# Parar
docker compose down

🛡 Instalação do Agente

O agente é instalado nos servidores Linux que você deseja monitorar. Primeiro, gere um token no painel.

One-liner (recomendado)

curl -fsSL https://synex-guard.io/install-agent.sh | bash -s -- \
  --token SEU_TOKEN_AQUI \
  --api-url http://seu-backend:8000

Verificar status

sudo systemctl status synexguard-agent
sudo journalctl -u synexguard-agent -f  # logs em tempo real

Reiniciar / Parar

sudo systemctl restart synexguard-agent
sudo systemctl stop synexguard-agent

Arquivo de configuração

# /etc/synexguard/agent.yaml
api_url: "http://seu-backend:8000"
token: "ng_xxxxxxxxxxxxxxxxxxxxxxxxxx"
heartbeat_interval: 30   # segundos
log_file: "/var/log/auth.log"

📝 Variáveis de Ambiente

Crie um arquivo .env na pasta backend/. Todas as variáveis são opcionais (possuem defaults).

VariávelTipoDefaultDescrição
APP_NAMEstr"Node Guardian Core API"Nome da aplicação
JWT_SECRETstr"change_me_in_production"Chave secreta para assinatura JWT
JWT_ALGORITHMstrHS256Algoritmo JWT
ACCESS_TOKEN_EXPIRE_MINUTESint60Validade do token JWT (minutos)
API_RATE_LIMIT_PER_MINUTEint120Limite de requests por minuto por IP
DATABASE_URLstrpostgresql+psycopg://...URL de conexão ao banco (futuro)
REDIS_URLstrredis://localhost:6379/0URL do Redis (futuro)

Notificações (opcionais)

VariávelDescrição
DISCORD_WEBHOOK_URLURL do webhook Discord
SLACK_WEBHOOK_URLURL do webhook Slack
TELEGRAM_BOT_TOKENToken do bot Telegram
TELEGRAM_CHAT_IDID do chat Telegram
SMTP_HOSTServidor SMTP para emails
SMTP_PORTPorta SMTP (default: 587)
SMTP_USERUsuário SMTP
SMTP_PASSSenha SMTP
SMTP_FROMEndereço remetente

⚠️ Segurança

Altere JWT_SECRET para uma string aleatória forte em produção! O default é inseguro. Use: python -c "import secrets; print(secrets.token_hex(32))"

🔒 Autenticação

JWT (Usuários)

O sistema usa OAuth2 Bearer Token com JWT assinado via HS256. O payload do token contém:

{
  "sub": "user@email.com",
  "uid": 1,
  "role": "user",
  "nome": "João Silva",
  "exp": 1739540400
}

Hashing de Senhas

Algoritmo: PBKDF2-HMAC-SHA256 com 260.000 iterações e salt aleatório de 16 bytes (hex). Formato armazenado: salt$hex_digest.

Tokens de Agente

Formato: ng_ + 28 caracteres hex aleatórios. Enviados via header X-Agent-Token. Cada token é vinculado a um usuário específico.

Conta Superadmin

🔑 Credenciais Padrão

O sistema cria automaticamente no primeiro boot:

Email: admin@synex-guard.io
Senha: admin123

Altere a senha imediatamente após o primeiro login!

📢 Notificações

O sistema suporta notificações via múltiplos canais. Configure as variáveis de ambiente correspondentes:

Automações

O motor de automações executa regras em tempo real a cada evento recebido. O sistema vem com 5 regras globais pré-configuradas:

RegraCondiçãoAçãoStatus
SSH Brute-Force Auto Ban≥ 5 falhas SSH em 5 minBanir IP por 24h🟢 Ativo
Port Scan DetectionPort scan detectadoBanir IP por 48h + Alerta🟢 Ativo
CPU Critical AlertCPU > 95%Alerta crítico🟢 Ativo
Disk Space WarningDisco > 85%Alerta warning🔴 Inativo
DDoS Mitigation> 1000 conns/min do mesmo IPRate limit + Banir IP 1h🟢 Ativo

Regras podem ser ativadas/desativadas pelo painel. Clientes também podem criar regras personalizadas via API.

Como funciona o brute-force detection

  1. O agente parseia /var/log/auth.log e envia tentativas de login via heartbeat.
  2. O backend registra cada tentativa e gera um evento ssh_login_failed.
  3. O motor de automações verifica: se o IP teve ≥ 5 falhas em janela de 5 minutos → executa ban automático + alerta crítico.

🔑 API — Auth

Prefixo: /api/v1/auth

POST /auth/register Público Criar nova conta

Request Body

{
  "nome": "João Silva",
  "email": "joao@empresa.com",
  "password": "minhasenhaforte"
}

Response 200

{
  "id": 2,
  "nome": "João Silva",
  "email": "joao@empresa.com",
  "role": "user",
  "avatar_url": null,
  "criado_em": "2026-02-13T14:00:00Z"
}

Erros: 409 se email já existe.

POST /auth/token Público Login (obter JWT)

Request Body

{
  "email": "joao@empresa.com",
  "password": "minhasenhaforte"
}

Response 200

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer"
}

Erros: 401 credenciais inválidas · 403 conta desativada.

GET /auth/me JWT Perfil do usuário logado

Response 200

{
  "id": 2,  "nome": "João Silva",  "email": "joao@empresa.com",
  "role": "user",  "avatar_url": null
}
PUT /auth/me JWT Atualizar perfil

Request Body

{
  "nome": "João M. Silva",
  "email": "joao.novo@empresa.com",
  "avatar_url": "https://..."
}

Todos os campos são opcionais. Erros: 409 se email já em uso.

PUT /auth/me/password JWT Alterar senha

Request Body

{
  "current_password": "senhaatual",
  "new_password": "novaSenhaForte123"
}

Erros: 400 se senha atual incorreta.

📡 API — Agents

Prefixo: /api/v1/agents

POST /agents/heartbeat X-Agent-Token Enviar heartbeat do agente

Este é o endpoint principal do agente. Envia métricas, login attempts e eventos a cada 30s.

Header

X-Agent-Token: ng_a1b2c3d4e5f6...

Request Body (HeartbeatPayload)

{
  "hostname": "srv-prod-01",
  "ip_publico": "203.0.113.10",
  "os_info": "Ubuntu 22.04.3 LTS",
  "cpu": 32.5,
  "ram": 61.2,
  "disk": 49.8,
  "uptime": "45d 12h 30m",
  "conns": 120,
  "open_ports": [22, 80, 443, 3306],
  "interfaces": [
    { "name": "eth0", "bytes_in": 134217728, "bytes_out": 89128960,
      "packets_in": 142000, "packets_out": 98000, "status": "up" }
  ],
  "login_attempts": [
    { "user": "root", "ip": "203.0.113.14", "method": "SSH", "success": false }
  ],
  "events": [
    { "tipo": "port_scan", "severidade": "critical",
      "mensagem": "Port scan from 192.0.2.50", "origem_ip": "192.0.2.50" }
  ]
}

Response 200

{
  "status": "ok",
  "server_id": 1,
  "events_processed": 1,
  "login_attempts_processed": 1
}

Processamento automático: Ao receber o heartbeat, o backend atualiza métricas do servidor, verifica regras de CPU/disco, registra login attempts (que disparam detecção de brute-force), e processa eventos (que disparam regras de automação).

GET /agents JWT Listar agentes/servidores do usuário

Response 200

{ "items": [ { "id": 1, "hostname": "srv-prod-01", ... } ] }

🖥 API — Servers

Prefixo: /api/v1/servers

GET /servers JWT Listar servidores

Response 200

{
  "items": [{
    "id": 1, "hostname": "srv-prod-01", "ip_publico": "203.0.113.10",
    "os_info": "Ubuntu 22.04", "cpu": 32.5, "ram": 61.2, "disk": 49.8,
    "uptime": "45d 12h", "conns": 120, "open_ports": [22,80,443],
    "status": "online", "ultimo_heartbeat": "2026-02-13T14:23:00Z"
  }]
}
GET /servers/stats JWT Estatísticas do Dashboard

Response 200

{
  "ataques_detectados": 12,
  "ips_banidos": 3,
  "servidores_online": 4,
  "servidores_total": 5,
  "alertas_ativos": 2,
  "cpu_medio": 29.3,
  "ram_medio": 57.1,
  "disco_medio": 45.8
}

📋 API — Events

Prefixo: /api/v1/events

GET /events JWT Listar eventos

Query Parameters

ParamTipoDefaultDescrição
limitint50Máximo de resultados (1-500)
tipostrFiltrar por tipo (ex: ssh_login_failed)
severidadestrFiltrar por severidade (critical, warning, info)

Response 200

{
  "items": [{
    "id": 42, "hostname": "srv-prod-01",
    "tipo": "ssh_login_failed", "severidade": "warning",
    "mensagem": "Failed login as 'root' from 203.0.113.14",
    "origem_ip": "203.0.113.14",
    "criado_em": "2026-02-13T14:23:01Z"
  }],
  "total": 42
}

🛡 API — Security

Prefixo: /api/v1/security

GET /security/login-attempts JWT Tentativas de login

Query: limit (int, 1-500, default 50)

Response 200

{
  "items": [{
    "id": 1, "hostname": "srv-prod-01",
    "user": "root", "origem_ip": "203.0.113.14",
    "method": "SSH", "success": false,
    "criado_em": "2026-02-13T14:23:01Z"
  }],
  "stats": {
    "total": 342,
    "blocked": 338,   // falhas
    "suspicious": 4  // sucesso como root/admin
  }
}
GET /security/banned-ips JWT Listar IPs banidos

Response 200

{
  "items": [{
    "id": 1, "ip": "203.0.113.14", "hostname": "srv-prod-01",
    "motivo": "SSH brute-force (5 tentativas)",
    "origem": "Automático", "expira": "24h", "ativo": true
  }]
}
POST /security/banned-ips JWT Banir IP manualmente

Request Body

{
  "servidor_id": 1,
  "ip": "192.0.2.100",
  "motivo": "Atividade suspeita",
  "origem": "Manual"
}
DELETE /security/banned-ips/{ip} JWT Desbanir IP

Path param: o endereço IP a desbanir. Erros: 404 se não encontrado.

Response 200

{ "unbanned": "192.0.2.100" }

📊 API — Metrics

Prefixo: /api/v1/metrics

GET /metrics JWT Métricas de servidores

Response 200

{
  "items": [{
    "servidor_id": 1, "hostname": "srv-prod-01",
    "cpu": 32.5, "ram": 61.2, "disk": 49.8,
    "conns": 120, "open_ports": 4
  }]
}

Retorna apenas servidores com status "online". open_ports é a contagem (não a lista).

📈 Prometheus

Métricas Prometheus estão disponíveis em GET /metrics/prometheus (sem autenticação). Inclui node_guardian_http_requests_total e node_guardian_active_alerts.

🌐 API — Traffic

Prefixo: /api/v1/traffic

GET /traffic JWT Tráfego de rede

Response 200

{
  "items": [{
    "hostname": "srv-prod-01", "interface": "eth0",
    "bytes_in": 134217728, "bytes_out": 89128960,
    "packets_in": 142000, "packets_out": 98000,
    "status": "up"
  }],
  "total_in": 134217728,
  "total_out": 89128960
}

🔔 API — Alerts

Prefixo: /api/v1/alerts

GET /alerts JWT Listar alertas

Query Parameters

ParamTipoDefaultDescrição
statusstrFiltrar: ativo ou resolvido
limitint50Máximo de resultados (1-500)

Response 200

{
  "items": [{
    "id": 1, "hostname": "srv-prod-01",
    "titulo": "SSH Brute-Force detectado de 203.0.113.14",
    "severidade": "critical",
    "mensagem": "IP fez 5 tentativas em 5 min",
    "status": "ativo",
    "criado_em": "2026-02-13T14:22:49Z"
  }],
  "total": 1
}
PUT /alerts/{alert_id}/resolve JWT Resolver alerta

Path param: alert_id (int). Erros: 404 se não encontrado ou não pertence ao usuário.

Response 200

{ "resolved": true }

API — Automations

Prefixo: /api/v1/automations

GET /automations JWT Listar regras

Retorna regras globais (usuario_id=null) + regras do usuário logado.

Response 200

{
  "items": [{
    "id": 1, "nome": "SSH Brute-Force Auto Ban",
    "condicao": "ssh_login_failed >= 5 in 5min",
    "acao": "Banir IP por 24h",
    "ativo": true
  }]
}
POST /automations/rules JWT Criar regra personalizada

Request Body (RuleIn)

{
  "nome": "My Custom Rule",
  "condicao": "ssh_login_failed >= 3 in 2min",
  "condicao_tipo": "ssh_login_failed",
  "condicao_threshold": 3,
  "acao": "Banir IP por 48h",
  "acao_type": "ban_ip",
  "acao_duration": "48h"
}
PUT /automations/{rule_id}/toggle JWT Ativar/desativar regra

Response 200

{ "toggled": true }

🔑 API — Tokens

Prefixo: /api/v1/tokens

GET /tokens JWT Listar tokens de agente

Response 200

[{
  "id": 1,
  "nome": "Servidor Produção",
  "descricao": "Token para srv-prod-01",
  "token": "ng_a1b2...d4e5",
  "ativo": true,
  "ultimo_uso": "2026-02-13T14:23:00Z",
  "criado_em": "2026-02-12T10:00:00Z",
  "install_command": "curl -sSL ... | sudo bash -s -- --token ng_..."
}]
POST /tokens JWT Criar novo token

Request Body

{
  "nome": "Servidor Produção",
  "descricao": "Token para srv-prod-01"
}

Response 201

Retorna o token completo incluindo install_command com o one-liner de instalação.

DELETE /tokens/{token_id} JWT Revogar token

Marca o token como inativo. O agente usando este token deixará de ser aceite. Erros: 404 se não pertence ao usuário.

👑 API — Admin

Prefixo: /api/v1/adminTodos os endpoints requerem role superadmin.

GET /admin/stats Superadmin Estatísticas globais
{
  "total_users": 15,
  "active_users": 12,
  "inactive_users": 3,
  "total_tokens": 28,
  "active_tokens": 22
}
GET /admin/users Superadmin Listar todos os usuários

Retorna todos os usuários com total_tokens e active_tokens por usuário.

PUT /admin/users/{user_id} Superadmin Ativar/desativar usuário
{ "ativo": false }

Erros: 403 não é possível desativar superadmin.

DELETE /admin/users/{user_id} Superadmin Excluir usuário

Remove o usuário e todos os seus tokens. Erros: 403 não é possível excluir superadmin.

GET /admin/tokens Superadmin Todos os tokens do sistema

Lista todos os tokens com campos extras: owner_nome e owner_email.

GET /admin/servers Superadmin Todos os servidores do sistema

Lista todos os servidores com campos extras: owner_nome e owner_email.

Tabela de Autenticação

MétodoHeaderUsado por
JWT BearerAuthorization: Bearer <token>Todos os endpoints de usuário
X-Agent-TokenX-Agent-Token: ng_...POST /agents/heartbeat
SuperadminAuthorization: Bearer <token> (role=superadmin)Todos os /admin/*
Público/auth/register, /auth/token, /health

👤 Guia do Cliente

1. Criar Conta

Acesse o painel (ex: http://localhost:5173/login) e clique em "Criar conta". Preencha nome, email e senha.

2. Fazer Login

Use email e senha. O sistema retorna um token JWT válido por 60 minutos (configurável).

3. Gerar Token de Agente

No menu lateral → 🔑 Tokens"Novo Token". Dê um nome descritivo e copie o token/comando de instalação.

⚠️ O token só é exibido uma vez na criação. Guarde-o com segurança.

4. Instalar o Agente

Execute o one-liner no servidor Linux:

curl -fsSL https://synex-guard.io/install-agent.sh | bash -s -- --token SEU_TOKEN --api-url http://backend:8000

5. Verificar Conexão

Na seção 🖥 Servidores, seu servidor aparecerá como Online em ~30 segundos.

6. Navegar pelos Módulos

MóduloDescriçãoAuto-refresh
DashboardResumo: ataques, IPs banidos, servidores, métricas médias10s
ServidoresLista completa de servidores com CPU/RAM/disco10s
SegurançaTentativas de login SSH em tempo real
IPs BanidosGerenciar bloqueios (desbloquear manualmente)
TráfegoThroughput por interface de rede
MétricasCPU/RAM/Disco por servidor com barras visuais10s
AutomaçõesAtivar/desativar regras de resposta automática
AlertasVisualizar e resolver alertas
ForenseBuscar eventos por IP, hostname ou tipo
LogsStream centralizado de logs ao vivo5s

7. Configurações

Em ⚙ Configurações altere nome, email, avatar e senha da sua conta.

🔧 Guia do Administrador

1. Primeiro Acesso

Login com admin@synex-guard.io / admin123. Altere a senha em Configurações.

2. Painel Admin

O menu 👑 Admin (visível só para superadmins) permite:

3. Deploy em Produção

  1. Configure JWT_SECRET com valor forte e único.
  2. Use --workers 4 no uvicorn para múltiplos workers.
  3. Coloque um reverse proxy (Nginx/Caddy) na frente.
  4. Use HTTPS (Let's Encrypt) para o domínio público.
  5. Faça build do frontend (npm run build) e sirva via Nginx.

4. Checklist de Segurança

  • ✅ Alterar senha do superadmin
  • ✅ Alterar JWT_SECRET
  • ✅ Usar HTTPS em produção
  • ✅ Configurar firewall no servidor do backend
  • ✅ Ajustar API_RATE_LIMIT_PER_MINUTE
  • ✅ Monitorar logs do uvicorn

5. Monitoramento do Agente

# Status do serviço
sudo systemctl status node-guardian-agent

# Logs em tempo real
sudo journalctl -u node-guardian-agent -f

# Reiniciar
sudo systemctl restart synexguard-agent

🐛 Troubleshooting

O servidor não aparece como Online

Erro 401 no heartbeat

Erro 403 ao fazer login

Frontend não carrega dados

Automações não disparam

Métricas aparecem zeradas

© 2026 SynexGuard — Documentação v1.0 · Landing Page · Acessar Painel