@onovoprogramador/onp-security-vps
v0.3.0
Published
Segurança da VPS com prova mecânica: orienta a IA a criar e configurar uma VPS (via MCP do provedor ou SSH) e prova a postura — checagem interna por SSH (sshd, firewall, sockets, usuários, serviços, fail2ban, atualizações, Docker), estado do provedor impo
Maintainers
Readme
onp-security-vps
A VPS sobe segura — e a máquina prova. Uma skill para o Claude Code que orienta a IA a criar e configurar uma VPS de forma segura (via MCP do provedor ou por SSH numa VPS já no ar), prova a postura mecanicamente (de dentro por SSH, de fora por probe, e pelo estado do provedor) e impõe pelo harness: uma guarda nega a ação que enfraquece a máquina e um gate não deixa "dar por pronto" sem prova verde.
Escopo: a VPS em si — firewall, SSH, usuários, sudo, serviços, portas, TLS, banco, Docker, atualizações. Segurança do código e do deploy da aplicação não é assunto daqui.
┌──────────┐ ┌──────────────────┐ ┌────────────┐ ┌────────┐ ┌──────────┐
│ PREPARAR │ → │ PROVISIONAR / │ → │ VERIFICAR │ → │ GATE │ → │ ENTREGAR │
│ postura │ │ ENDURECER │ │ host+probe │ │ mecân. │ │ (Stop) │
│ + alvo │ │ (MCP ou SSH) │ │ +provedor │ │ │ │ │
└──────────┘ └──────────────────┘ └────────────┘ └────────┘ └──────────┘
o contrato a GUARDA barra o que sshd, firewall, exit 0 ou o harness não
da VPS enfraquece a VPS portas, TLS… não pronto deixa encerrarO problema que ela resolve
Quando uma IA configura um servidor, o risco não é esquecer um passo: é
"resolver" enfraquecendo — ufw disable porque a porta não abria,
PermitRootLogin yes porque o acesso falhou, chmod 777 porque deu
permission denied, banco em 0.0.0.0 porque "funcionou". Aqui:
- Guarda (hook PreToolUse) — intercepta MCP de VPS e
ssh host '…'. Desligar firewall, abrir banco pro mundo, liberar senha/root no SSH,chmod 777,NOPASSWD: ALL,curl | sh,--privileged,rm -rf /→ negado ou perguntado ao usuário, com a correção. Leitura e endurecimento passam. - Checagem interna por SSH — um script de leitura (
sshd -T, ufw/nft/ iptables,ss,ps, usuários, sudoers, fail2ban, atualizações, permissões, Docker, NTP) vira achados com código e correção. Sucesso = prova de propriedade. - Estado do provedor — o JSON que a IA leu pelo MCP (firewall, VM) é avaliado contra a postura: banco pro mundo, porta fora da postura, VM sem firewall, não sincronizado.
- Probe de fora — portas alcançáveis x postura, TLS, HTTP→HTTPS. Só na VPS que é sua (guarda de propriedade).
- Gate + Stop —
onp-sec gatecombina tudo → exit code e prova. Cada mudança na VPS (PostToolUse) invalida a prova; o Stop não deixa encerrar a sessão com o gate vermelho. - Ledger de credenciais — senha de root, chave privada, token do provedor que apareceu no chat bloqueia até rotacionar; senha passada por MCP entra sozinha; SessionStart martela.
- Playbooks — ordem certa para provisionar via MCP (Hostinger e equivalentes) e para endurecer por SSH sem se trancar fora.
Instalação (a skill é autossuficiente)
Motor embarcado (Node ≥ 18, zero dependências). Na pasta do projeto:
npx @onovoprogramador/onp-security-vps init --agents claude # (quando publicado)Cria .vpssec/ (postura = contrato, alvos, ledger), onpsec.config.json,
protege o .gitignore e instala a skill em .claude/skills/onp-security-vps/
(--global → ~/.claude/skills/). Manual:
git clone --depth 1 https://github.com/onovoprogramador/onp-security-vps.git /tmp/onp-sec
mkdir -p .claude/skills && cp -r /tmp/onp-sec/skills/onp-security-vps .claude/skills/Guarda e gate como hooks do Claude Code:
node .claude/skills/onp-security-vps/scripts/onp-sec.mjs install-hooks # neste projeto
node .claude/skills/onp-security-vps/scripts/onp-sec.mjs install-hooks --global # em todosInstala PreToolUse (guarda), PostToolUse (registro), Stop (gate de
encerramento) e SessionStart (lembrete), autotesta e diz o que gravou.
Remover: --remove; ver: --status.
Como usar
"Cria uma VPS na Hostinger pra mim e deixa segura."
"Endurece esse servidor que já está no ar."
"Libera a porta 8080." → a guarda pergunta: está na postura?
"Desliga o firewall que não tá dando." → a guarda nega, com a correção.Comandos internos (onp-sec = node <skill>/scripts/onp-sec.mjs):
onp-sec init [--agents claude] # .vpssec/ + skill
onp-sec install-hooks [--global|--remove|--status] # guarda + gate no Claude Code
onp-sec alvo add <host> --vm-id <id> --atestar mcp --usuario root
onp-sec host <host> # checagem interna por SSH (atesta)
onp-sec estado importar firewall <json> # o que o MCP devolveu
onp-sec probe <host> # de fora
onp-sec gate --alvo <host> # 0 = VPS na postura
onp-sec checar "ufw allow 8080/tcp" # o que a guarda faria
onp-sec lint-script pos-instalacao.sh # script de endurecimento
onp-sec segredo expor|rotacionado|list # ledger
onp-sec rules | explain <CÓDIGO> | statusO que é verificado e por qual via
| Via | O que | Determinístico? |
|---|---|---|
| Host (SSH, onp-sec host) | sshd (senha/root/porta/opções), firewall do host e regras, sockets em 0.0.0.0, banco local, UID 0, sudo NOPASSWD, serviços como root, fail2ban, atualizações, permissões, Docker, NTP | sim |
| Provedor (MCP → JSON) | regras do firewall x postura, banco pro mundo, VM sem firewall, sincronizado | sim |
| Probe (de fora) | portas alcançáveis, TLS, HTTP→HTTPS, banco/painel exposto | sim |
| Guarda (ação da IA) | firewall off, portas, SSH, permissões, curl|sh, Docker, destrutivo, script pós-instalação | sim, antes de rodar |
| Ledger | credenciais expostas | sim |
| Manual | banco sem autenticação/credencial padrão | você confirma |
Desenvolvimento
npm test # postura, host (fixtures), estado, guarda, gate, hooks e CLI ponta a ponta — sem rede
node tools/build-skill.mjs # regenera o motor embarcado (o teste de sync acusa drift)src/ é a fonte única; skills/onp-security-vps/scripts/ é gerado. O
código do antigo scanner de deploy está em attic/ (fora do escopo).
Requisitos
Node.js ≥ 18. Para a checagem interna, ssh com acesso por chave à VPS
(~/.ssh/config, agent ou --identidade). Sem nmap, sem Python.
Segurança e escopo
O probe ativo só roda contra a VPS que você controla e atesta (VM da sua conta no MCP, acesso SSH comprovado, ou declaração). A checagem por SSH usa a sua chave e só executa comandos de leitura. Esta ferramenta blinda a sua VPS — não sonda host de terceiro.
Licença
MIT © Vitor Manoel — O Novo Programador
