Knock SSH - Adicionando uma camada extra de segurança no servidor

Imagem de capa

Hoje vamos falar do Knock, uma ferramenta muito interessante para quem precisar acessar seus servidores remotamente. Bom o que o Knock faz, ele adiciona essa camada a mais da seguinte forma, por exemplo se acessamos nosso servidor pela porta 22 do ssh ela deveria estar liberada. Porém com Knock ela pode estar bloqueada, você acertando uma sequência específica de portas ele irá liberar a porta 22, e somente se acertar a sequencia definida.

No servidor

Precisamos instalar somente um pacote em nosso servidor:

apt-get install knockd

O arquivo de configuração fica no /etc/knockd.conf. Eis a configuração padrão que veio no Debian.

Eu alterei para a configuração ficar como no exemplo abaixo, sempre colocando a regra de ACCEPT na primeira linha, pois caso tenha sido bloqueada e seja adiciona no final do arquivo a regra não funcionará.

[options]
        UseSyslog

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

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

 

Após editaremos o arquivo /etc/default/knockd para especificar nossa placa de rede:

START_KNOCKD=1
KNOCKD_OPTS="-i enp0s3"

Feito a configuração reiniciaremos o serviço:

/etc/init.d/knockd restart

Caso não tenha a porta 22 fechada, vamos fecha-lá. Lembrando que isso deve estar no script firewall do seu servidor.

iptables -A INPUT -p tcp --dport 22 -j DROP

No cliente

No cliente instalaremos o mesmo utilitário, porém sem precisar fazer as configurações feitas anteriormente.

aptitude install knockd

Agora vamos bater nas portas em sequência conforme configurado no nosso servidor (7000, 8000, 9000)

knock 10.0.0.106 7000:tcp 8000:tcp 9000:tcp

Com as batidas corretamente executadas, podemos verificar o log do nosso servidor e veremos que o foi passado por 3 estágios e após os mesmos estarem corretos, nosso porta 22 foi liberada pelo firewall

Mar 21 15:49:21 server knockd: starting up, listening on enp0s3
Mar 21 15:49:26 server knockd: 10.0.0.103: openSSH: Stage 1
Mar 21 15:49:26 server knockd: 10.0.0.103: openSSH: Stage 2
Mar 21 15:49:26 server knockd: 10.0.0.103: openSSH: Stage 3
Mar 21 15:49:26 server knockd: 10.0.0.103: openSSH: OPEN SESAME
Mar 21 15:49:26 server knockd: openSSH: running command: /sbin/iptables -I INPUT 1 -s 10.0.0.103 -p tcp --dport 22 -j ACCEPT

E assim podemos conectar normalmente sem bloqueio nenhum.

[email protected]:/home/sidnei# ssh [email protected]
[email protected]'s password:

Fechando a porta

Depois de fazer tudo que era necessário podemos fechar a porta novamente, acertando a sequência de fechamento que também é incluida no nosso arquivo de configuração do servidor.

knock 10.0.0.106 9000:tcp 8000:tcp 7000:tcp

E a porta será fechada novamente conforme o log nos informa:

Mar 21 15:58:27 server knockd: 10.0.0.103: closeSSH: Stage 1
Mar 21 15:58:27 server knockd: 10.0.0.103: closeSSH: Stage 2
Mar 21 15:58:27 server knockd: 10.0.0.103: closeSSH: Stage 3
Mar 21 15:58:27 server knockd: 10.0.0.103: closeSSH: OPEN SESAME
Mar 21 15:58:27 server knockd: closeSSH: running command: /sbin/iptables -D INPUT -s 10.0.0.103 -p tcp --dport 22 -j ACCEPT

E era isso, acredito que seja uma camada bem interessante para nossos servidores e o mais importante, não colocando portas padrões na configuração, será muito mais dificil acertar a sequência para poder liberar o ssh.

Fonte

Um forte abraço