# Ligbox Infrastructure Constitution Constituição de governança para toda a infraestrutura Ligbox / Ibytera no cluster Proxmox `big1`. Aplica-se a VMs, CTs, rede, segurança, deploys e integrações (mail, ops, portal). --- ## Core Principles ### I. Network Segmentation — vmbr1 como LAN L2 pura A rede interna das VMs (`10.10.10.0/24`) deve ser servida por **vmbr1**, bridge **sem IPv4 no host Proxmox**: - `bridge-ports none` — isolada do hardware - Host **não** actua como gateway na vmbr1 - Gateway das VMs: **pfSense LAN** (`10.10.10.1`) - Documentação de referência: `docs/network/INTERFACES_PROXMOX.md` **Drift conhecido (2026-06-08):** VMs operam em `vmbr4000` (Hetzner vSwitch, host `10.10.10.254`). Migração para vmbr1 requer plano aprovado — não improvisar. ### II. Proxmox Interfaces — alteração tripla obrigatória O ficheiro `/etc/network/interfaces` do host Proxmox é **crítico e imutável sem aprovação**: 1. Descrever intenção real e diff completo antes de qualquer alteração 2. Obter confirmação explícita do Roger **três vezes** 3. Verificar iptables antes e depois; limpar duplicatas; nunca `ifreload` múltiplo sem limpeza Ordem das regras importa (FIFO). Destino WAN pfSense = `10.0.0.2`, **nunca** LAN `10.10.10.1` em DNAT. ### III. Anti-Scan Hetzner — regras obrigatórias (NON-NEGOTIABLE) Quatro linhas de proteção FORWARD devem estar activas na secção vmbr1: ``` post-up iptables -I FORWARD -s 10.10.10.0/24 ! -d 10.10.10.0/24 -j DROP post-up iptables -I FORWARD -s 10.10.10.0/24 ! -d 10.10.10.0/24 -p udp --dport 53 -j ACCEPT ``` **Proibido:** `POSTROUTING MASQUERADE` genérico para `10.10.10.0/24` (causa abuse reports). Verificação obrigatória: após qualquer alteração de rede e **diariamente**. ### IV. Separation of Concerns — Mail vs Ops | VM | Papel | Restrição | |----|-------|-----------| | **112** | Carbonio mail + portal onboard | Não misturar workloads de ops/monitoring | | **113** | PMG mail gateway | Filtro SMTP apenas | | **122** | Ligbox Ops Platform | API, desk, workers — **sem mail stack** | Comunicação entre 112 e 122 via API/webhook na LAN (`10.10.10.x`), nunca exposição directa à internet. ### V. Security Baseline — toda VM exposta Toda VM/CT com SSH (LAN ou WAN) deve ter: - **fail2ban** activo com jail `sshd` (bantime ≥ 3600s, maxretry ≤ 5) - `PasswordAuthentication` verificado com `sshd -T` (não confiar só no ficheiro principal) - Ficheiros `sshd_config.d/*.conf` verificados (sobrescrevem config principal) - Portas de serviço bindadas à LAN quando possível (`10.10.10.x`, não `0.0.0.0`) ### VI. pfSense API — acesso validado - URL produção: `https://firewall.itecnologys.com/api/v2/` (via Traefik) - Fallback directo: `https://10.10.10.1:10443/api/v2/` - Autenticação: **Basic Auth** (`-u user:password`), nunca headers customizados - Após alterações NAT/firewall: `POST /api/v2/firewall/apply` - DNAT externo → pfSense WAN (`10.0.0.2`), portas SSH VMs via pfSense (2501–2522) ### VII. Spec-Driven Development — Spec Kit obrigatório Todo trabalho de feature segue o fluxo Spec Kit **antes** de implementação: ``` /speckit.constitution → /speckit.specify → /speckit.clarify → /speckit.checklist → /speckit.plan → /speckit.tasks → /speckit.analyze → /speckit.implement ``` - Constitution (este ficheiro) precede qualquer feature - Specs em `specs/` com branch `NNN-nome-feature` - Não implementar sem `plan.md` + `tasks.md` validados - Backlog livre migra para specs numeradas ### VIII. Documentation First — Obsidian + repo - Inventário VMs: `obsidian-infra/docs/TABELA_VMS_*.md` — actualizar após cada VM nova - Decisões arquitecturais: `docs/decisions/DECISAO_*.md` - Chat bruto / sessões: `obsidian-infra/` (vault principal) - Código deployável: `/opt//` na VM + sync para `workspace/projects/` ### IX. Simplicity — YAGNI no MVP - Preferir SQLite a Postgres para ops MVP (VM122) - Docker compose mínimo (api + worker + redis + frontend) - Adiar: SOC, Wazuh centralizado, 7 agents, Postgres cluster - Cada feature justifica complexidade adicional --- ## Security Requirements | Requisito | Implementação | |-----------|---------------| | SSH externo | pfSense NAT `95.216.14.146:PORTA` → VM:22 | | SSH interno | `root@10.10.10.x` a partir do host ou LAN | | Webhook secrets | Rotação obrigatória em produção (não usar defaults dev) | | Credenciais | Nunca commitar em git; usar `.env` local | | Cloudflare API | Tokens com scope mínimo (zone DNS, não account-wide) | | Tailscale/scanning | Monitorar regras FORWARD; bloquear vazamento LAN→WAN | --- ## Infrastructure Inventory (referência rápida) | Componente | IP / Porta | Notas | |------------|-----------|-------| | Proxmox host | 95.216.14.162 | vmbr0 | | pfSense LAN | 10.10.10.1 | VM100, gateway VMs | | pfSense WAN | 10.0.0.2 | Destino DNAT | | VM112 mail | 10.10.10.112:2512 | Carbonio + portal | | VM113 PMG | 10.10.10.113:2513 | Mail gateway | | VM122 ops | 10.10.10.122:2522 | Ligbox Ops MVP | | CT119 qtm | 10.10.10.119 | Não migrar — reservado | | Traefik | CT114 / VM105 | `firewall.itecnologys.com` | --- ## Development Workflow 1. **Constitution** — verificar compliance antes de iniciar feature 2. **Specify** — requisitos (o quê / porquê, sem tech stack) 3. **Clarify + Checklist** — obrigatório para produção 4. **Plan + Tasks** — arquitectura e passos executáveis 5. **Analyze** — consistência cross-artifact antes de implementar 6. **Implement** — código + deploy + verificação 7. **Validate** — testes, fail2ban, iptables, health endpoints 8. **Document** — actualizar inventário VMs e decisões ### Quality gates (bloqueantes) - [ ] Constitution compliance verificada - [ ] fail2ban activo na VM alvo - [ ] Sem alteração não aprovada em `/etc/network/interfaces` - [ ] Regras anti-scan Hetzner verificadas - [ ] Health check da feature OK - [ ] Inventário VMs actualizado --- ## Governance - Esta constitution **supera** backlog informal, prompts ad-hoc e decisões não documentadas - Emendas requerem: proposta escrita, aprovação Roger, bump de versão, data de ratificação - Toda PR / sessão de implementação deve verificar compliance com esta constitution - Drift de infra (ex.: vmbr1 com IP, VMs em vmbr4000) deve ser documentado em `docs/network/` até resolução - Complexidade adicional (novo serviço, nova VM, nova bridge) requer spec dedicada — não improvisar **Version**: 1.0.0 | **Ratified**: 2026-06-08 | **Last Amended**: 2026-06-08