agentsclimarketplace

Linux vm hardening

Skill gabriel-f-santos/coding-agents/skills/linux-vm-hardening

Gera cloud-init.yaml com hardening completo para VM Linux. Configura: usuário não-root sudo, SSH key-only (root prohibit-password para Coolify), UFW, fail2ban com ban progressivo, Docker, Coolify e unattended-upgrades. Suporta dois modos: SSH público restrito por IP ou SSH exclusivo via Tailscale VPN. Invocada pelo /hetzner-vm ou diretamente para qualquer VPS (DigitalOcean, AWS EC2, etc.).From its SKILL.md

Install
npx -y skills add gabriel-f-santos/coding-agents --skill linux-vm-hardening

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.2 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

Linux VM Hardening — Gerador de Cloud-Init

Gera cloud-init.yaml pronto para qualquer VM Linux. Quando invocada pelo /hetzner-vm, todos os parâmetros já estão no contexto — usar diretamente sem perguntar novamente.

Template base

!cat "${CLAUDE_SKILL_DIR}/templates/cloud-init.yaml.tpl"

Parâmetros

Se não estiverem no contexto (invocação standalone), perguntar um por vez:

ParâmetroDefaultDescrição
admin_usernamedeployUsuário não-root com sudo
ssh_public_keyConteúdo de ~/.ssh/id_ed25519.pub
ssh_port22Porta SSH (só relevante no modo público)
timezoneUTCEx: America/Sao_Paulo
ssh_modepublicpublic ou tailscale
tailscale_auth_keyObrigatório se ssh_mode=tailscale
output_path$output_pathOnde escrever o arquivo

Modo SSH — perguntar ao usuário

Como prefere acessar o servidor via SSH?

  [1] Público (padrão) — porta 22 aberta, restrita ao seu IP no firewall
  [2] Tailscale — porta 22 fechada, acesso só via VPN Tailscale

Se ssh_mode = public

Substituir {{UFW_SSH_RULES}} por:

  - ufw allow {{SSH_PORT}}/tcp comment "SSH"

Substituir {{TAILSCALE_INSTALL}} por linha vazia.

Se ssh_mode = tailscale

Invocar /tailscale-setup para guiar o usuário pelo setup completo do tailnet (conta, cliente local, ACL policy e geração do auth key).

Aguardar a conclusão — o /tailscale-setup retorna o auth key tskey-auth-.... Usar esse valor como {{TAILSCALE_AUTH_KEY}} no template.

Substituir {{UFW_SSH_RULES}} por:

  - ufw allow in on tailscale0 comment "SSH via Tailscale"
  - ufw allow 41641/udp comment "Tailscale direct WireGuard"

Substituir {{TAILSCALE_INSTALL}} por:

  # Tailscale VPN — instalar após UFW para não travar na ativação
  - curl -fsSL https://tailscale.com/install.sh | sh
  - tailscale up --auth-key={{TAILSCALE_AUTH_KEY}} --ssh --advertise-tags=tag:server

Processo

  1. Confirmar todos os parâmetros
  2. Substituir cada {{PLACEHOLDER}} com os valores reais
  3. Para {{SSH_MODE}}, {{UFW_SSH_RULES}} e {{TAILSCALE_INSTALL}}: aplicar a lógica de modo acima
  4. Escrever o YAML resultante no output_path com a ferramenta Write
  5. Confirmar: "cloud-init.yaml gerado em [path] — modo: [ssh_mode]"

Decisões de segurança

ConfiguraçãoValorPor que
PermitRootLoginprohibit-passwordCoolify exige root SSH; bloqueia senha, libera chave
PasswordAuthenticationnoElimina superfície de ataque de brute-force
AllowUsers{{ADMIN_USERNAME}} rootWhitelist — outros usuários rejeitados na autenticação
MaxAuthTries 3 + fail2banban após 3 errosBane IPs atacantes rapidamente
bantime.incrementaté 7 diasReincidentes levam ban progressivo
Swap 2GB + swappiness=10só usa em último recursoCoolify + PostgreSQL precisa de margem em VMs pequenas
UFWdeny incoming + allow explícitoDefense-in-depth além do firewall do provider
Tailscaleporta 22 fechada na internetMaior postura: SSH só via WireGuard mesh criptografado

Comparação dos modos SSH

Modo públicoModo Tailscale
Porta 22 expostaSim, filtrada por IPNão — completamente fechada
IP dinâmicoProblema (precisa atualizar tfvars)Sem problema
Time com múltiplos IPsPrecisa listar todosBasta estar no tailnet
Dependência externaNenhumaTailscale control plane
Recuperação se travadoHetzner ConsoleHetzner Console
Recomendado paraProjetos solo, IP fixoTimes, IPs dinâmicos

What ships with it: 1 file

3.5 KB alongside SKILL.md

templates/

Keep looking

Skills are one crate of 326,835. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.