Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Vida dum programdor
Por marun
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Dica

Port knocking para SSH rápido e fácil com iptables
Linux user
Publicado por Leandro Lanini em 09/11/2009

Login: terolando, 6055 pontos
[ Hits: 4546 ]

Port knocking para SSH rápido e fácil com iptables

Port knocking funciona como um cadeado de segredo para ter acesso ao servidor, onde o usuário ou invasor terá que "bater" em um determinado número de portas com um limite de tempo também determinado para fazer a sequência para só assim liberar o ip que ele estiver usando também por um determinado tempo. O acesso a porta que queremos aqui no caso é a 22 (ssh).

Vamos construir um cenário onde você queira primeiro liberar o acesso direto a alguns IPs sem precisar passar pelo segredo das portas, depois liberaremos todos os IPs (ou alguma rede específica) somente se acertarem a sequência das portas e por último bloquearemos todo o resto.

A configuração a seguir pode ser adicionada a seu script de firewall.

Como este é o primeiro tutorial que escrevo, tentarei ser o mais claro possível (espero que me perdoem se não conseguir):

####### Libera ssh para um determinado ip sem precisar passar pelo segredo ##############
####### xxx.xxx.xxx.xxx = IP que deseja liberar#######################

iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport ssh -j ACCEPT
iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport ssh -j ACCEPT
iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport ssh -j ACCEPT

####### A rede que você quer que tenha acesso ao segredo (aqui no caso está para qualquer uma)

HOST_IP="0.0.0.0/0.0.0.0"

####### Fases do Segredo ##################################
/sbin/iptables -N INTO-FASE2
/sbin/iptables -A INTO-FASE2 -m recent --name FASE1 --remove
/sbin/iptables -A INTO-FASE2 -m recent --name FASE2 --set
/sbin/iptables -A INTO-FASE2 -j LOG --log-prefix "INTO FASE2: "

/sbin/iptables -N INTO-FASE3
/sbin/iptables -A INTO-FASE3 -m recent --name FASE2 --remove
/sbin/iptables -A INTO-FASE3 -m recent --name FASE3 --set
/sbin/iptables -A INTO-FASE3 -j LOG --log-prefix "INTO FASE3: "

/sbin/iptables -N INTO-FASE4
/sbin/iptables -A INTO-FASE4 -m recent --name FASE3 --remove
/sbin/iptables -A INTO-FASE4 -m recent --name FASE4 --set
/sbin/iptables -A INTO-FASE4 -j LOG --log-prefix "INTO FASE4: "

/sbin/iptables -A INPUT -m recent --update --name FASE1

####### Aqui você determina o número das portas e o tempo que o ip ficará em cada uma das fazes aguardando a próxima porta ser digitada. Por ex.: Você terá 15 segundos para passar de cada fase, se o tempo se expirar na fase 3 terá que começar da fase1 novamente. ###########
####### Dica: não é aconselhável utilizar portas em sequências crescentes ou decrescentes como neste exemplo (100, 200, 300, 400) e sim intercalando os valores uma mais alta e uma mais baixa para evitar que algum scan consiga adivinhar a sequência. #######

/sbin/iptables -A INPUT -p tcp --dport 100 -m recent --set --name FASE1
/sbin/iptables -A INPUT -p tcp --dport 200 -m recent --rcheck --seconds 15 --name FASE1 -j INTO-FASE2
/sbin/iptables -A INPUT -p tcp --dport 300 -m recent --rcheck --seconds 15 --name FASE2 -j INTO-FASE3
/sbin/iptables -A INPUT -p tcp --dport 400 -m recent --rcheck --seconds 15 --name FASE3 -j INTO-FASE4

####### Aqui chegamos a FASE4, que é a última deste exemplo, onde será liberada a conexão com a porta 22 (ssh). O tempo aqui está setado para 3600 segundos (1 hora). Depois disso será fechada novamente para o ip em questão, lembrando que se ele ainda estiver logado não fará diferença, será fechada mesmo assim. Então aumente o tempo conforme desejado.####

/sbin/iptables -A INPUT -p tcp -s $HOST_IP --dport 22 -m recent --rcheck --seconds 3600 --name FASE4 -j ACCEPT

####### Por último fechamos todos acessos a porta 22 ########

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

Testando:

A forma mais fácil que eu acho para testar é utilizando o telnet. Por ex.:

$ telnet IP_SERVIDOR 100
$ telnet IP_SERVIDOR 200
$ telnet IP_SERVIDOR 300
$ telnet IP_SERVIDOR 400


e agora é só entrar com ssh normalmente.

Espero ter ajudado!


Outras dicas deste autor
Nenhuma dica encontrada.

Leitura recomendada
   Dica Linux recomendada Legendas no Slackware
   Dica Linux recomendada Instalando Tomcat5 no Debian Etch
   Dica Linux recomendada [RESOLVIDO] VirtualBox não funciona no Arch Linux e no KahelOS
   Dica Linux recomendada Alterando o tema do KDM (KDM Theme Manager)
   Dica Linux recomendada BackTrack 4 e criptografia de pasta

Comentários
[1] Comentário enviado por andre.vmatos em 09/11/2009 - 10:09h:

Muito bom o artigo, parabéns. Bem explicado e extremamente útil. Favoritos =)

[2] Comentário enviado por magnolinux em 10/11/2009 - 08:16h:

Bem vindo Leo.....

continue contribuindo com otimas dicas...

o vol agradesçe.

flw..

[3] Comentário enviado por dimasdaros em 24/01/2012 - 10:11h:

Dando vida para este tópico, digamos, antigo...

Estou tentando criar um script para usar na minha máquina, para executar este processo de forma digamos automática, para não ficarem sabendo quais portas são utilizadas pelo port knock, quem estiver ao meu redor.
Queria colocar uma senha para executar este aplicativo também hehe

Alguém tem alguma sugestão de como fazer isso?


Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.