Pular para o conteúdo principal

Medidas de Segurança para VPS

Esse tutorial irá te ajudar a transformar sua VPS em um "alvo móvel" difícil de acertar é o primeiro passo para qualquer sysadmin responsável.

Como você quer restringir o acesso apenas via VPN, o script abaixo foca em configurar o firewall (UFW) para bloquear o tráfego SSH vindo da internet pública, permitindo apenas a conexão através do túnel da VPN (geralmente usando o IP da interface da VPN ou o IP estático do seu servidor VPN).

O que este script faz:

  1. Atualiza o sistema: Garante que os patches de segurança estejam em dia.

  2. Endurece o SSH: Desabilita login por senha e login do root.

  3. Configura o UFW: Bloqueia tudo, exceto o tráfego na porta da VPN e o SSH vindo da rede interna da VPN.

  4. Fail2Ban: Instala proteção contra ataques de força bruta.

Shell Script de Segurança (Ubuntu)

Bash
#!/bin/bash

# --- CONFIGURAÇÕES ---
# Mude para a sub-rede da sua VPN (ex: 10.8.0.0/24 para OpenVPN ou 192.168.2.0/24 para Wireguard)
VPN_SUBNET="10.8.0.0/24"
SSH_PORT="22"

echo "Iniciando o endurecimento da segurança da VPS..."

# 1. Atualização do Sistema
apt update && apt upgrade -y

# 2. Instalação de Ferramentas Essenciais
apt install -y ufw fail2ban

# 3. Configuração do SSH
# ATENÇÃO: Certifique-se de que sua chave pública já está em ~/.ssh/authorized_keys
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config

systemctl restart ssh

# 4. Configuração do Firewall (UFW)
# Reseta as regras
ufw --force reset
ufw default deny incoming
ufw default allow outgoing

# PERMITIR SSH APENAS VIA VPN
ufw allow from $VPN_SUBNET to any port $SSH_PORT proto tcp

# Se você estiver usando Wireguard, precisa abrir a porta do túnel (ex: 51820 UDP)
# ufw allow 51820/udp

echo "y" | ufw enable

# 5. Configuração Básica do Fail2Ban
systemctl enable fail2ban
systemctl start fail2ban

echo "Configuração concluída!"
echo "IMPORTANTE: Só tente deslogar após testar a conexão em uma nova aba."

Avisos Críticos (Não pule!)

  • A Chave Pública: Antes de rodar o script, você precisa ter copiado sua chave SSH para o servidor (ssh-copy-id usuario@ip-da-vps). Se você rodar o script e desabilitar a senha sem ter a chave lá, você ficará trancado para fora.

  • O Dilema da VPN: Para que a regra ufw allow from $VPN_SUBNET funcione, o seu servidor VPS precisa ser o cliente ou o servidor da VPN. Se você ainda não instalou a VPN, o acesso SSH será bloqueado assim que o firewall subir.

  • Porta SSH: Se você mudou a porta padrão do SSH, altere a variável SSH_PORT no script.

Estrutura de Acesso Seguro

Nesta arquitetura, o firewall atua como um porteiro que ignora qualquer batida na porta 22, a menos que o visitante venha de dentro do "túnel" seguro da VPN.


Como mudar a porta padrão do SSH

Com certeza. Vamos elevar o nível de segurança da sua VPS. Mudar a porta padrão do SSH ajuda a evitar 99% dos ataques automatizados (bots) que ficam varrendo a porta 22, e o WireGuard é atualmente a VPN mais rápida e segura para Linux.

Aqui está o passo a passo para configurar ambos:

1. Mudando a porta do SSH para 22222

Antes de ativar o firewall, precisamos garantir que o serviço SSH saiba onde ouvir.

  1. Abra o arquivo de configuração:

    sudo nano /etc/ssh/sshd_config

  2. Procure pela linha #Port 22. Remova o # e mude para Port 22222.

  3. Salve (Ctrl+O, Enter) e saia (Ctrl+X).

  4. Não reinicie o serviço ainda! Primeiro, precisamos avisar o firewall (UFW), ou você perderá o acesso.

Bash
sudo ufw allow 22222/tcp
sudo systemctl restart ssh

2. Instalando e Configurando o WireGuard (VPN)

Usaremos um script de instalação automatizada que é o padrão da comunidade para evitar erros manuais de criptografia.

Passo A: Instalação

Execute o comando abaixo para baixar e rodar o instalador seguro:

Bash
wget https://git.io/wireguard -O wireguard-install.sh && bash wireguard-install.sh

O script fará algumas perguntas:

  • IPv4/IPv6: Pode manter o padrão detectado.

  • Porta UDP: O padrão é 51820. Lembre-se dela.

  • Client name: Escolha um nome (ex: meu-pc ou celular).

  • DNS: Recomendo Google (8.8.8.8) ou Cloudflare (1.1.1.1).

Passo B: Liberar a VPN no Firewall

O WireGuard usa o protocolo UDP. Você precisa liberar a porta dele no UFW:

Bash
sudo ufw allow 51820/udp

3. Ajustando o Script de Segurança (O "Grand Finale")

Agora que você tem a VPN rodando e o SSH na porta nova, vamos atualizar as regras do firewall para que o SSH só aceite conexões vindas de dentro da VPN.

O WireGuard geralmente usa a sub-rede 10.7.0.0/24. Vamos restringir o SSH:

Bash
# 1. Bloqueia o acesso SSH vindo de qualquer lugar da internet (porta 22222)
sudo ufw deny 22222/tcp

# 2. Permite o SSH apenas para quem estiver conectado na VPN
# (Substitua 10.7.0.0/24 se o seu WireGuard usar outra faixa)
sudo ufw allow from 10.7.0.0/24 to any port 22222 proto tcp

# 3. Garante que a porta da VPN continue aberta para o mundo
sudo ufw allow 51820/udp

# 4. Aplica as mudanças
sudo ufw reload

Como você se conecta agora?

  1. No seu PC local: Instale o cliente WireGuard.

  2. Importe o arquivo: O script de instalação criou um arquivo .conf na sua pasta /root ou /home. Baixe esse arquivo para o seu PC (via SCP ou apenas copiando o texto).

  3. Ligue a VPN: No cliente WireGuard, clique em "Ativar".

  4. Acesse a VPS: Agora você usará o IP interno da VPN da VPS (geralmente 10.7.0.1):

    ssh usuario@10.7.0.1 -p 22222

Nota de Segurança: Se você tentar conectar pelo IP público da VPS sem a VPN ligada, a conexão será sumariamente descartada pelo firewall. É exatamente isso que queremos.


Como usar o OpenVPN?

Com certeza. Vamos elevar o nível de segurança da sua VPS. Mudar a porta padrão do SSH ajuda a evitar 99% dos ataques automatizados (bots) que ficam varrendo a porta 22, e o WireGuard é atualmente a VPN mais rápida e segura para Linux.

Aqui está o passo a passo para configurar ambos:

1. Mudando a porta do SSH para 22222

Antes de ativar o firewall, precisamos garantir que o serviço SSH saiba onde ouvir.

  1. Abra o arquivo de configuração:

    sudo nano /etc/ssh/sshd_config

  2. Procure pela linha #Port 22. Remova o # e mude para Port 22222.

  3. Salve (Ctrl+O, Enter) e saia (Ctrl+X).

  4. Não reinicie o serviço ainda! Primeiro, precisamos avisar o firewall (UFW), ou você perderá o acesso.

Bash

2. Instalando e Configurando o WireGuard (VPN)

Usaremos um script de instalação automatizada que é o padrão da comunidade para evitar erros manuais de criptografia.

Passo A: Instalação

Execute o comando abaixo para baixar e rodar o instalador seguro:

Bash

O script fará algumas perguntas:

  • IPv4/IPv6: Pode manter o padrão detectado.

  • Porta UDP: O padrão é 51820. Lembre-se dela.

  • Client name: Escolha um nome (ex: meu-pc ou celular).

  • DNS: Recomendo Google (8.8.8.8) ou Cloudflare (1.1.1.1).

Passo B: Liberar a VPN no Firewall

O WireGuard usa o protocolo UDP. Você precisa liberar a porta dele no UFW:

Bash

3. Ajustando o Script de Segurança (O "Grand Finale")

Agora que você tem a VPN rodando e o SSH na porta nova, vamos atualizar as regras do firewall para que o SSH só aceite conexões vindas de dentro da VPN.

O WireGuard geralmente usa a sub-rede 10.7.0.0/24. Vamos restringir o SSH:

Bash

Como você se conecta agora?

  1. No seu PC local: Instale o cliente WireGuard.

  2. Importe o arquivo: O script de instalação criou um arquivo .conf na sua pasta /root ou /home. Baixe esse arquivo para o seu PC (via SCP ou apenas copiando o texto).

  3. Ligue a VPN: No cliente WireGuard, clique em "Ativar".

  4. Acesse a VPS: Agora você usará o IP interno da VPN da VPS (geralmente 10.7.0.1):

    ssh usuario@10.7.0.1 -p 22222

Nota de Segurança: Se você tentar conectar pelo IP público da VPS sem a VPN ligada, a conexão será sumariamente descartada pelo firewall. É exatamente isso que queremos.

Comentários

Postagens mais visitadas deste blog

UML e comunicação entre Componentes

(conteúdo gerado com I.A.) Antes de abordarmos o conceito de Componentes, vale a pena analisar como um programador iniciante costuma estruturar uma aplicação. Geralmente, a escolha é construir um monólito tradicional, agrupando todas as classes de domínio (como Categoria, Produto, Compra, Venda, Pagamento, etc.) em uma única pasta de Entidades. Da mesma forma, criam-se pacotes globais para Repositórios, Serviços e Controllers. O grande problema dessa abordagem é que ela gera um forte acoplamento entre as classes e as camadas do sistema. À medida que a aplicação cresce, isso desencadeia uma série de dificuldades: Manutenção e modelagem complexas: As responsabilidades se misturam. Rapidamente, o código passa a ter diversos trechos onde as classes assumem funções que não deveriam ter, tornando a evolução do sistema confusa. Escalabilidade ineficiente: Para escalar o backend, é necessário replicar a aplicação inteira e todo o banco de dados. Além de consumir mais recursos, isso traz o ri...

Quando escolher Flask ou Quart no Python

Atualmente , considerando o suporte assíncrono já presente no Flask, a escolha entre Flask e Quart para uma API Server depende de vários fatores técnicos. Vejamos alguns critérios: Fonte:  https://pt.stackoverflow.com/questions/51268/qual-a-diferen%C3%A7a-entre-comunica%C3%A7%C3%A3o-ass%C3%ADncrona-e-s%C3%ADncrona Suporte Assíncrono : Flask : O Flask oferece suporte assíncrono por meio de extensões de terceiros, como  flask[async] . No entanto, seu desempenho assíncrono é inferior aos frameworks nativamente assíncronos. Quart : O Quart é uma reimplantação do Flask baseada no padrão ASGI (Asynchronous Server Gateway Interface). Ele utiliza E/S assíncrona em todo o código e é mais adequado para bases de código predominantemente assíncronas. Desempenho : Flask : Como aplicação WSGI, o Flask usa um único worker para cada ciclo de solicitação/resposta. Quando uma solicitação chega a uma visualização assíncrona, o Flask inicia um loop de eventos em uma thread, executa a função da vi...

Metodo para criar relacionamento entre tabelas sem dar erro cíclico EFCore

Quando estamos modelando o banco de dados no Entity Framework Core (ou em qualquer outra ferramenta) é muito comum criarmos o erro cíclico. Este erro ocorre devido ao banco de dados não conseguir determinar onde o relacionamento termina, causando um erro de loop. Vejamos uma situação real onde foi gerado esse problema: Um Professor leciona em várias Turmas, Um Professor leciona uma ou mais Disciplinas, Um Professor leciona determinadas Disciplinas em determinadas Turmas, Uma Turma tem muitos Professores, Em todas as Turmas tem 9 Disciplinas. Em todas as turmas podem ter até 9 Professores. Só por essa descrição já é possível perceber que os relacionamentos podem ser complexos de entender. E tem-se também o problema da navegação em via dupla: Professor-Turmas, Turma-Professores. Então, como modelar essas tabelas sem que o banco entre em loop? Para resolver esse problema no Entity Framework Core e evitar o erro de "Multiple Cascade Paths" (caminhos múltiplos de cascata) comum n...