Port Knocking: Esconder Portas do Servidor e Aumentar Segurança

11 min de leitura Segurança Linux
Port Knocking: Esconder Portas do Servidor e Aumentar Segurança

O Que É Port Knocking e Por Que Ele Importa

Em ambientes de servidores Linux expostos à internet, a superfície de ataque é um dos maiores preocupações para administradores de sistemas e desenvolvedores. A maioria das tentativas de invasão automatizada não mira diretamente em vulnerabilidades específicas de software, mas sim em serviços que estão escutando portas públicas padrão, como a porta 22 para SSH ou a porta 3306 para MySQL. Ferramentas como Fail2ban e CrowdSec são excelentes para bloquear IPs maliciosos após várias tentativas falhas, mas elas reagem a um ataque já em andamento.

O port knocking é uma técnica de segurança de rede que visa tornar os serviços invisíveis até que o cliente legítimo realize uma sequência específica de conexões. Basicamente, o servidor mantém todas as portas fechadas (drop) para tráfego não autenticado. O administrador envia pacotes TCP ou UDP para uma série predefinida de portas "fechadas". Se a sequência estiver correta e em tempo hábil, o firewall dinamicamente abre a porta do serviço protegido (como o SSH) apenas para o endereço IP que fez o knock.

Este método oferece um nível adicional de hardening VPS, reduzindo drasticamente o ruído nos logs e a quantidade de tentativas de brute force visíveis. Ao esconder as portas, você impede que scanners automáticos identifiquem quais serviços estão rodando no seu servidor. Neste tutorial, vamos configurar o port knocking utilizando UFW (Uncomplicated Firewall) como base, garantindo uma camada extra de proteção antes mesmo de considerar chaves SSH ou criptografia.

Pré-requisitos e Preparação do Ambiente

Antes de implementar qualquer medida de segurança avançada, é crucial garantir que você tenha acesso root ou sudo ao seu servidor. Além disso, o port knocking pode ser complexo para usuários iniciantes; se você errar a sequência, ficará bloqueado fora do próprio servidor. Por isso, recomendamos fortemente o uso de SSH keys como método principal de autenticação e manter uma sessão SSH aberta em outro terminal ou janela enquanto configura o sistema.

Vamos utilizar o Ubuntu Server como exemplo, pois ele vem com o UFW pré-instalado e configurável. Se você estiver usando Debian, CentOS ou outra distribuição, os conceitos são os mesmos, mas os comandos de instalação podem variar (por exemplo, yum ou apt). Certifique-se também de que seu servidor possui uma conexão estável com a internet para realizar o download dos pacotes necessários.

O fluxo lógico da nossa configuração será:

  • Instalar as dependências necessárias (knockd e ufw).
  • Configurar o UFW para bloquear tudo, exceto o que for explicitamente permitido.
  • Configurar o serviço knockd para monitorar os pacotes de knock.
  • Testar a conexão e garantir que o acesso SSH esteja funcionando.

Passo 1: Instalação do Knockd e UFW

O primeiro passo é garantir que as ferramentas necessárias estejam instaladas no seu sistema. O knockd é um daemon que escuta o tráfego de rede em interfaces especificadas e executa comandos definidos pelo usuário quando recebe pacotes com seqüências específicas. O UFW servirá como nosso firewall principal.

sudo apt update
sudo apt install knockd ufw -y

Com os pacotes instalados, vamos habilitar o UFW. Se você ainda não configurou regras básicas, é importante definir a política padrão para DROP (bloquear) e garantir que o SSH e o Ping sejam permitidos inicialmente, antes de aplicar o port knocking, para evitar se bloquear acidentalmente.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow ping
sudo ufw enable

Ao executar sudo ufw enable, o sistema pedirá confirmação. Digite y e pressione Enter. Agora, seu servidor está protegido por um firewall básico, mas ainda não estamos usando port knocking.

Passo 2: Configurando as Regras do Knockd

A configuração principal do knockd reside no arquivo /etc/knockd.conf. Este arquivo define a sequência de portas, o tipo de protocolo (TCP ou UDP), e os comandos que devem ser executados quando a sequência é detectada.

Abra o arquivo de configuração com seu editor de texto favorito:

sudo nano /etc/knockd.conf

No início do arquivo, você verá uma seção [options]. Aqui, definimos onde o log será salvo e a interface de rede que será monitorada. Em servidores com múltiplas interfaces, é crucial especificar a correta (geralmente eth0 ou ens33). Para fins deste tutorial, vamos usar UseSyslog para facilitar o diagnóstico.

[options]
    UseSyslog
    interface = eth0

Agora, definamos a sequência de knock. Vamos escolher três portas aleatórias e altas que não estão em uso pelo sistema, por exemplo: 7000, 8000 e 9000. A seção [openSSH] será responsável por abrir a porta SSH quando a sequência for detectada.

[openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 5
    command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags = syn

Vamos analisar cada diretiva:

  • sequence: A lista de portas que devem ser "batedas" na ordem. Neste caso, 7000, depois 8000, depois 9000.
  • seq_timeout: O tempo máximo em segundos para completar a sequência. Se o cliente demorar mais de 5 segundos entre as portas, a tentativa será cancelada.
  • command: O comando executado quando a sequência é bem-sucedida. Aqui, usamos iptables diretamente para permitir que o IP do cliente (%IP%) acesse a porta 22 (SSH). Isso é mais rápido e direto do que chamar um script externo.
  • tcpflags: Especifica quais flags TCP devem estar presentes. syn indica uma nova conexão, o que é padrão para port knocking.

É altamente recomendável adicionar uma seção de fechamento, embora não seja estritamente necessária se você confiar na timeout das regras do firewall. No entanto, para um hardening rigoroso, podemos configurar uma seção [closeSSH] que fecha a porta após um tempo de inatividade ou através de um script separado. Para simplificar este tutorial, vamos nos basear no fato de que o UFW rejeitará conexões subsequentes se não houver uma regra ativa, mas note que a regra iptables adicionada permanece até ser removida manualmente ou reiniciar o serviço.

Para evitar vazamentos permanentes, muitos administradores preferem usar um script shell como comando. Por exemplo:

command = /bin/bash /etc/knockd/open_ssh.sh %IP%

Onde open_ssh.sh adiciona a regra iptables e agenda sua remoção após alguns minutos. Mas, para manter o tutorial direto, a abordagem com iptables inline é funcional e imediata.

Passo 3: Configurando o UFW para Bloquear as Portas de Knock

Agora que o knockd sabe como reagir, precisamos garantir que o UFW bloqueie essas portas por padrão. Se o UFW permitir acesso a elas, o port knocking perde o sentido, pois qualquer um poderá conectar nessas portas.

sudo ufw deny 7000/tcp
sudo ufw deny 8000/tcp
sudo ufw deny 9000/tcp

Com essas regras aplicadas, qualquer tentativa de conexão às portas 7000, 8000 e 9000 será rejeitada pelo firewall, a menos que o knockd tenha inserido uma regra temporária no iptables (que pode estar em uma chain diferente ou ser tratada antes, dependendo da ordem das regras). É importante notar que o knockd usa iptables diretamente, contornando as regras do UFW para a origem específica. Isso cria um efeito de "porta dos fundos" segura.

Passo 4: Iniciando e Ativando o Serviço Knockd

Com a configuração pronta, precisamos iniciar o serviço e garantir que ele rode na inicialização do sistema.

sudo systemctl start knockd
sudo systemctl enable knockd

Verifique se o serviço está rodando sem erros:

sudo systemctl status knockd

Se houver algum erro, verifique os logs do sistema para diagnóstico. O knockd registra suas atividades no syslog.

Passo 5: Testando a Conexão com Port Knocking

Agora vem o momento da verdade. Você não conseguirá conectar via SSH diretamente. Se tentar ssh user@seu-ip, a conexão será negada ou ficará pendente, dependendo da configuração do firewall.

Para se conectar, você deve "bater" nas portas na ordem correta antes de tentar o SSH. Você pode usar ferramentas como nmap, nc (netcat) ou até mesmo o knock cliente se estiver instalado.

Vamos usar o knock cliente, que é a forma mais elegante. Instale-o se necessário:

sudo apt install knockd-client -y

Agora, execute o comando de knock, substituindo os números das portas pelas que você configurou e o IP do seu servidor:

knock -v 192.0.2.1 7000 8000 9000

O sinalizador -v mostra verbose, permitindo ver se os pacotes estão sendo enviados. Se tudo correr bem, o comando retornará rapidamente.

Imediatamente após executar o knock, tente conectar via SSH:

ssh [email protected]

Se a configuração estiver correta, a conexão será estabelecida normalmente. Você pode verificar os logs em /var/log/syslog para ver as entradas do knockd confirmando a sequência e a adição da regra iptables.

Boas Práticas e Mitigação de Riscos

Ao implementar port knocking, é fundamental considerar algumas práticas de segurança adicionais para garantir que seu servidor permaneça resiliente.

1. Uso de SSH Keys: O port knocking esconde o serviço, mas não autentica o usuário. Sempre desative a autenticação por senha no /etc/ssh/sshd_config (PasswordAuthentication no) e use chaves SSH robustas. Isso impede que, mesmo com a porta aberta, invasores tentem bruteforce de senhas.

2. Monitoramento de Invasão: Continue utilizando ferramentas como CrowdSec ou Fail2ban. Embora o port knocking reduza as tentativas visíveis, ele não impede ataques DDoS direcionados à infraestrutura de rede ou outras portas abertas (como HTTP/HTTPS). O CrowdSec pode analisar logs do sistema e adicionar camadas de inteligência comportamental para mitigar ameaças complexas.

3. Backup de Acesso: Como mencionado, se você errar a sequência ou o serviço falhar, ficará sem acesso. Mantenha um console de recuperação (recovery console) disponível na sua interface de gerenciamento de nuvem (AWS EC2 Instance Connect, DigitalOcean Console, etc.) como plano B. Nunca dependa exclusivamente de uma única camada de segurança para acesso administrativo.

4. Hardening VPS Completo: O port knocking é apenas uma peça do quebra-cabeça. Certifique-se de manter o sistema atualizado (sudo apt upgrade), desabilitar contas de usuário desnecessárias e revisar regularmente as regras de firewall.

Conclusão

O port knocking é uma técnica poderosa para aumentar a segurança de servidores Linux expostos à internet. Ao esconder portas do servidor, você reduz a visibilidade dos seus serviços e dificulta a vida de bots automatizados que varrem a internet em busca de vulnerabilidades.

Neste tutorial, demonstramos como configurar o knockd com o UFW, criando uma sequência segura para liberar acesso SSH. Embora a configuração inicial exija atenção aos detalhes, os benefícios em termos de privacidade e redução de ataques são significativos.

Lembre-se: segurança é um processo contínuo. Combine port knocking com SSH keys, monitoramento ativo e práticas de hardening para criar uma defesa em profundidade robusta para sua infraestrutura. Teste sempre em um ambiente de homologação antes de aplicar em produção, e mantenha seus logs sob vigilância constante.

Ao seguir estas etapas, você estará dando um passo importante na proteção do seu VPS contra ameaças comuns, garantindo que apenas clientes legítimos, com o conhecimento correto da sequência secreta, possam interagir com seus serviços críticos.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000