Como usar o Port Knocking no Linux (e por que você não deveria)

Publicados: 2022-01-29
Mão batendo em uma porta fechada.
Photographee.eu/Shutterstock

A batida de porta é uma maneira de proteger um servidor fechando as portas do firewall — mesmo aquelas que você sabe que serão usadas. Essas portas são abertas sob demanda se — e somente se — a solicitação de conexão fornecer a batida secreta.

A batida de porta é uma “batida secreta”

Na década de 1920, quando a proibição estava em pleno andamento, se você quisesse entrar em um bar clandestino, você tinha que saber a batida secreta e bater corretamente para entrar.

Bater à porta é um equivalente moderno. Se você deseja que as pessoas tenham acesso a serviços em seu computador, mas não deseja abrir seu firewall para a Internet, você pode usar a batida de porta. Ele permite fechar as portas do firewall que permitem conexões de entrada e abri-las automaticamente quando um padrão pré-estabelecido de tentativas de conexão é feito. A sequência de tentativas de conexão atua como a batida secreta. Outra batida secreta fecha a porta.

Port knocking é uma novidade, mas é importante saber que é um exemplo de segurança através da obscuridade, e esse conceito é fundamentalmente falho. O segredo de como acessar um sistema é seguro porque somente quem está em um grupo específico o conhece. Mas uma vez que esse segredo é revelado - seja porque é revelado, observado, adivinhado ou elaborado - sua segurança é anulada. É melhor proteger seu servidor de outras maneiras mais fortes, como exigir logins baseados em chave para um servidor SSH.

Propaganda

As abordagens mais robustas para a segurança cibernética são multicamadas, portanto, talvez a batida de porta deva ser uma dessas camadas. Quanto mais camadas, melhor, certo? No entanto, você pode argumentar que a batida de porta não adiciona muito (se alguma coisa) a um sistema seguro e protegido adequadamente.

A segurança cibernética é um tópico vasto e complicado, mas você não deve usar a batida de porta como sua única forma de defesa.

RELACIONADO: Como criar e instalar chaves SSH do shell do Linux

Instalando batido

Para demonstrar a batida de porta, vamos usá-la para controlar a porta 22, que é a porta SSH. Usaremos uma ferramenta chamada knockd. Use apt-get para instalar este pacote em seu sistema se você usa Ubuntu ou outra distribuição baseada em Debian. Em outras distribuições Linux, use a ferramenta de gerenciamento de pacotes da sua distribuição Linux.

Digite o seguinte:

 sudo apt-get install knockd 

Você provavelmente já tem o firewall iptables instalado em seu sistema, mas pode ser necessário instalar o pacote iptables-persistent . Ele lida com o carregamento automático de regras iptable salvas.

Digite o seguinte para instalá-lo:

 sudo apt-get install iptables-persistent 

Quando a tela de configuração do IPV4 aparecer, pressione a barra de espaço para aceitar a opção “Sim”.

Pressione a barra de espaço para aceitar a opção "Sim" na tela IPV4 persistente do iptables.

Pressione a barra de espaço novamente na tela de configuração do IPv6 para aceitar a opção “Sim” e seguir em frente.

Pressione a barra de espaço para aceitar a opção "Sim" na tela de configuração do IPv6.

Propaganda

O comando a seguir diz ao iptables para permitir que as conexões estabelecidas e em andamento continuem. Agora, emitiremos outro comando para fechar a porta SSH.

Se alguém estiver conectado por SSH quando emitimos este comando, não queremos que ele seja cortado:

 sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT 

Este comando adiciona uma regra ao firewall, que diz:

  • -A : anexa a regra à tabela de regras de firewall. Ou seja, adicione-o ao fundo.
  • INPUT : Esta é uma regra sobre conexões de entrada.
  • -m conntrack : As regras de firewall agem sobre o tráfego de rede (pacotes) que correspondem aos critérios da regra. O parâmetro -m faz com que o iptables use módulos extras de correspondência de pacotes - neste caso, o chamado conntrack funciona com os recursos de rastreamento de conexão de rede do kernel.
  • –cstate ESTABLISHED,RELATED : Especifica o tipo de conexão ao qual a regra será aplicada, ou seja, conexões ESTABLISHED e RELATED. Uma conexão estabelecida é aquela que já está em andamento. Uma conexão relacionada é aquela que é feita devido a uma ação de uma conexão estabelecida. Talvez alguém conectado queira baixar um arquivo; que pode acontecer em uma nova conexão iniciada pelo host.
  • -j ACCEPT : Se o tráfego corresponder à regra, salta para o destino ACCEPT no firewall. Em outras palavras, o tráfego é aceito e permitido passar pelo firewall.

Agora podemos emitir o comando para fechar a porta:

 sudo iptables -A INPUT -p tcp --dport 22 -j REJECT 

Este comando adiciona uma regra ao firewall, que diz:

  • -A : Anexa a regra à tabela de regras de firewall, ou seja, adiciona-a ao final.
  • INPUT : Esta regra é sobre conexões de entrada.
  • -p tcp : Esta regra se aplica ao tráfego que usa o Transmission Control Protocol.
  • –dport 22 : Esta regra se aplica especificamente ao tráfego TCP que tem como destino a porta 22 (a porta SSH).
  • -j REJECT : Se o tráfego corresponder à regra, salta para o destino REJECT no firewall. Portanto, se o tráfego for rejeitado, não será permitido pelo firewall.

Devemos iniciar o daemon netfilter-persistent . Podemos fazer isso com este comando:

 sudo systemctl start netfilter-persistent 

Queremos que netfilter-persistent passe por um ciclo de salvar e recarregar, para que ele carregue e controle as regras do iptable .

Digite os seguintes comandos:

 sudo netfilter-persistent save 

 sudo netfilter-reload persistente 

Propaganda

Agora você instalou os utilitários e a porta SSH está fechada (espero, sem encerrar a conexão de ninguém). Agora, é hora de configurar a batida secreta.

Configurando o knockd

Existem dois arquivos que você edita para configurar o knockd . O primeiro é o seguinte arquivo de configuração knockd :

 sudo gedit /etc/knockd.conf 

O editor gedit é aberto com o arquivo de configuração knockd carregado.

O arquivo de configuração knockd no editor gedit.

Editaremos este arquivo para atender às nossas necessidades. As seções em que estamos interessados ​​são "openSSH" e "closeSSH". As quatro entradas a seguir estão em cada seção:

  • sequence : A sequência de portas que alguém deve acessar para abrir ou fechar a porta 22. As portas padrão são 7000, 8000 e 9000 para abri-la e 9000, 8000 e 7000 para fechá-la. Você pode alterá-las ou adicionar mais portas à lista. Para nossos propósitos, ficaremos com os padrões.
  • seq_timeout : O período de tempo dentro do qual alguém precisa acessar as portas para acioná-las para abrir ou fechar.
  • command : O comando enviado ao firewall iptables quando a ação de abrir ou fechar é acionada. Esses comandos adicionam uma regra ao firewall (para abrir a porta) ou a removem (para fechar a porta).
  • tcpflags : O tipo de pacote que cada porta deve receber na sequência secreta. Um pacote SYN (sincronizar) é o primeiro em uma solicitação de conexão TCP, chamado de handshake de três vias.

A seção "openSSH" pode ser lida como "uma solicitação de conexão TCP deve ser feita para as portas 7000, 8000 e 9000 - nessa ordem e em 5 segundos - para que o comando para abrir a porta 22 seja enviado ao firewall".

Propaganda

A seção “closeSSH” pode ser lida como “uma solicitação de conexão TCP deve ser feita para as portas 9000, 8000 e 7000 – nessa ordem e dentro de 5 segundos – para que o comando feche a porta 22 seja enviado ao firewall”.

As regras do firewall

As entradas de “comando” nas seções openSSH e closeSSH permanecem as mesmas, exceto por um parâmetro. É assim que eles são compostos:

  • -A : Anexe a regra ao final da lista de regras de firewall (para o comando openSSH).
  • -D : Excluir o comando da lista de regras de firewall (para o comando closeSSH).
  • INPUT : Esta regra está relacionada ao tráfego de rede de entrada.
  • -s %IP% : O endereço IP do dispositivo que está solicitando uma conexão.
  • -p : Protocolo de rede; neste caso, é TCP.
  • –dport : A porta de destino; em nosso exemplo, é a porta 22.
  • -j ACCEPT : Salta para o destino de aceitação dentro do firewall. Em outras palavras, deixe o pacote passar pelo resto das regras sem agir sobre ele.

As edições do arquivo de configuração knockd

As edições que faremos no arquivo estão destacadas em vermelho abaixo:

O arquivo de configuração knockd no editor gedit com as edições destacadas.

Estendemos o “seq_timeout” para 15 segundos. Isso é generoso, mas se alguém estiver enviando manualmente solicitações de conexão, ele pode precisar de tanto tempo.

Na seção “openSSH”, alteramos a opção -A (append) no comando para -I (insert). Este comando insere uma nova regra de firewall no topo da lista de regras de firewall. Se você deixar a opção -A , ela anexará a lista de regras de firewall e a colocará na parte inferior .

O tráfego de entrada é testado em relação a cada regra de firewall na lista de cima para baixo. Já temos uma regra que fecha a porta 22. Portanto, se o tráfego de entrada for testado contra essa regra antes de ver a regra que permite o tráfego, a conexão será recusada; se ele vir essa nova regra primeiro, a conexão será permitida.

O comando close remove a regra adicionada pelo openSSH das regras de firewall. O tráfego SSH é mais uma vez tratado pela regra pré-existente “porta 22 está fechada”.

Depois de fazer essas edições, salve o arquivo de configuração.

RELACIONADO: Como editar arquivos de texto graficamente no Linux com gedit

As edições do arquivo de controle knockd

O arquivo de controle knockd é totalmente mais simples. Antes de nos aprofundarmos e editarmos isso, porém, precisamos saber o nome interno da nossa conexão de rede; para encontrá-lo, digite este comando:

 endereço IP 

Propaganda

A conexão que esta máquina usa para pesquisar este artigo é chamada enp0s3 . Anote o nome da sua conexão.

O comando a seguir edita o arquivo de controle knockd :

 sudo gedit /etc/default/knockd 

Aqui está o arquivo knockd no gedit .

O arquivo de controle knockd no gedit.

As poucas edições que precisamos fazer estão destacadas em vermelho:

O arquivo de controle knockd no gedit com as edições destacadas.

Alteramos a entrada “START_KNOCKD=" de 0 para 1.

Também removemos o hash # do início da entrada “KNOCKD_OPTS=" e substituímos “eth1” pelo nome da nossa conexão de rede, enp0s3 . Obviamente, se sua conexão de rede for eth1 , você não a alterará.

A prova está no pudim

É hora de ver se isso funciona. Iniciaremos o daemon knockd com este comando:

 sudo systemctrl start batido 

Propaganda

Agora, vamos pular em outra máquina e tentar conectar. Também instalamos a ferramenta knockd nesse computador, não porque queremos configurar o port knocking, mas porque o pacote knockd fornece outra ferramenta chamada knock . Usaremos esta máquina para disparar em nossa sequência secreta e bater à porta por nós.

Use o comando a seguir para enviar sua sequência secreta de solicitações de conexão para as portas no computador host com o endereço IP 192.168.4.24:

 bater 192.168.4.24 7000 8000 9000 -d 500

Isso diz ao knock para direcionar o computador no endereço IP 192.168.4.24 e disparar uma solicitação de conexão para as portas 7000, 8000 e 9000, por sua vez, com um -d (atraso) de 500 milissegundos entre elas.

Um usuário chamado “dave” faz uma solicitação SSH para 192.168.4.24:

 ssh [email protected]

Sua conexão é aceita, ele digita sua senha e sua sessão remota começa. Seu prompt de comando muda de dave@nostromo para dave@howtogeek . Para sair do computador remoto, ele digita:

 saída

Seu prompt de comando retorna ao computador local. Ele usa knock mais uma vez e, desta vez, ele direciona as portas na ordem inversa para fechar a porta SSH no computador remoto.

 bater 192.168.4.24 9000 8000 7000 -d 500 

Propaganda

Reconhecidamente, esta não foi uma sessão remota particularmente frutífera, mas demonstra a abertura e fechamento da porta através da batida da porta e cabe em uma única captura de tela.

Então, o que isso parecia do outro lado? O administrador do sistema no host de abertura de porta usa o seguinte comando para visualizar novas entradas que chegam ao log do sistema:

 tail -f /var/log/syslog 

  • Você vê três entradas openSSH. Eles são gerados à medida que cada porta é direcionada pelo utilitário de detonação remoto.
  • Quando todos os três estágios da sequência de disparo são atendidos, uma entrada que diz “OPEN SESAME” é registrada
  • O comando para inserir a regra na lista de regras do iptables é enviado. Ele permite acesso via SSH na porta 22 a partir do endereço IP específico do PC que deu a batida secreta correta (192.168.4.23).
  • O usuário “dave” se conecta por apenas alguns segundos e depois se desconecta.
  • Você vê três entradas closeSSH. Eles são gerados à medida que cada porta é direcionada pelo utilitário de detonação remoto - ele informa ao host de detonação de porta para fechar a porta 22.
  • Após todos os três estágios serem acionados, recebemos a mensagem “OPEN SESAME” novamente. O comando é enviado ao firewall para remover a regra. (Por que não “CLOSE SESAME” quando está fechando a porta? Quem sabe?)

Agora, a única regra na lista de regras do iptables referente à porta 22 é a que digitamos no início para fechar essa porta. Portanto, a porta 22 agora está fechada novamente.

Bata na cabeça

Esse é o truque da porta do bar. Trate-o como uma diversão e não o faça no mundo real. Ou, se for preciso, não confie nele como sua única forma de segurança.