# Configuração de VPS Hetzner

> Do servidor vazio a uma máquina pronta para produção e segura. Escolha como deseja configurar o seu servidor.

:::tabs
=== Automático (IA)
### Configuração automática via IA
Conceda ao seu assistente de IA acesso a este repositório. Ele executará automaticamente todas as verificações, configurará a segurança e gerará um arquivo com todos os acessos (credentials guide) no seu computador.

[Abrir Repositório GitHub](https://github.com/orlovvugorivzai/vps-hetzner-setup-by-orlov)

=== Manual
### Preparação das variáveis
Nos comandos abaixo, você precisará substituir os valores entre chaves pelos seus próprios dados:

- `{username}` — nome do seu usuário comum (ex.: `dev`)
- `{nickname}` — apelido curto do servidor para conveniência (ex.: `hetzner-main`)
- `{SERVER_IP}` — endereço IP público do seu novo servidor

:::

## 1. Criação da chave SSH (Localmente)
Executado no **seu computador** (Mac ou Linux) ANTES de conectar-se ao servidor.

```bash
ssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""
cat ~/.ssh/{nickname}_key.pub
```

Copie a saída do segundo comando (ela começa com `ssh-ed25519 ...`). Esta é sua chave pública.

## 2. Acesso como Root
Conecte-se ao servidor usando a senha que a Hetzner enviou por e-mail.

> [!WARNING]
> A Hetzner pode solicitar a alteração da senha. Digite a senha atual e depois a nova senha temporária duas vezes. Se a conexão for interrompida após isso, basta reconectar-se usando a nova senha.

```bash
ssh root@{SERVER_IP}
```

## 3. Atualização do sistema
Atualize todos os pacotes em modo não interativo (sem pop-ups do grub).

```bash
apt update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt upgrade -y
```

## 4. Criação de usuário com sudo
Trabalhar como root é perigoso. Criamos um usuário comum e concedemos a ele privilégios administrativos.

```bash
useradd -m -s /bin/bash {username}
echo "{username}:YOUR_SECURE_PASSWORD" | chpasswd
usermod -aG sudo {username}
```

## 5. Implantação da chave SSH
Gravaremos a chave pública que você copiou na Etapa 1 no servidor.

```bash
mkdir -p /home/{username}/.ssh
echo "{PUBLIC_KEY_CONTENT}" > /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.ssh
```

## 6. Verificação de login
> [!IMPORTANT]
> **CHECKPOINT OBRIGATÓRIO**
> Não feche a sessão root! Abra uma nova janela de terminal no seu PC e tente entrar usando a chave. Somente após o login bem-sucedido você deve prosseguir.

Verifique se o `sudo` funciona (o sistema deve solicitar a senha definida na Etapa 4 e exibir "root"):

```bash
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}
sudo whoami
```

## 7. Firewall (UFW)
Execute todos os comandos seguintes como seu novo usuário (com sudo). Configuramos a política "bloquear tudo que entra, exceto SSH, HTTP e HTTPS".

```bash
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status
```

## 8. Proteção do kernel (sysctl)
Aplicamos parâmetros para proteção contra ataques de rede.

```bash
sudo tee /etc/sysctl.d/99-security.conf << 'EOF'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-security.conf
```

## 9. Pacotes básicos e horário
O horário preciso é crítico para logs, certificados SSL e fail2ban.

```bash
sudo apt install -y chrony curl wget git unzip net-tools
sudo systemctl enable chrony
```

## 10. Configuração local do SSH
Configuração de um atalho **no seu PC local**, para que futuramente você possa conectar-se com o comando curto `ssh {nickname}`.

```bash
mkdir -p ~/.ssh && touch ~/.ssh/config && chmod 600 ~/.ssh/config
cat >> ~/.ssh/config << 'EOF'

Host {nickname}
    HostName {SERVER_IP}
    User {username}
    IdentityFile ~/.ssh/{nickname}_key
    IdentitiesOnly yes
EOF
```

## 11. Verificação de segurança
Verifique se o comando curto funciona a partir do PC local e se as proteções básicas estão ativas.

```bash
ssh {nickname}
sudo ufw status
sysctl net.ipv4.tcp_syncookies
```

## 12. Bloqueio final
Instalamos proteção contra brute-force (fail2ban) e bloqueamos permanentemente o login direto como root.

```bash
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo tee /etc/ssh/sshd_config.d/99-hardening.conf << 'EOF'
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
EOF
sudo sshd -t && sudo systemctl restart ssh
```