Com a necessidade de se chegar a um grau de segurança maior, vou demonstrar abaixo um módulo do iptables, que é muito interessante.
Segue um dica para deixar as portas de alguns serviços em específico fechadas e abri-las quando bem entender, apenas para você. Essa dica se baseia no SSH (porta 22).
Fui alvo de grandes ataques de brute force no serviço de SSH, então desenvolvi um script que analisa o log e bloqueia o IP do atacante, mas como já existia um na net dei uma implementada para alcançar um funcionalidade maior. Mesmo assim, interminantemente novos IP vem querendo acessar o SSH sem permissão. Desta forma busquei um saída e achei o módulo "recent" no iptables. Com ele, você pode deixar uma porta fechada, e abri-la de acordo com uma regra específica.
Veja:
1)
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --rcheck --name SSH --rsource --seconds 60 --hitcount 3 -j ACCEPT
1.1)
Libere para a lista (--name SSH) as tentativas de conexão que tentam acessar (destino) a porta 22 do protocolo tcp verificando no módulo recent (--rcheck) que tenham 3 ou mais entradas (--hitcount 3) na lista (--name SSH).
2)
iptables -A INPUT -p tcp -m tcp --dport 22323 -m state --state NEW -m recent --name SSH --remove -j DROP
2.1)
Negue as tentativas de novas conexões (-m state --state NEW) a porta (destino) 22323 e remova (--remove) da lista (--name SSH) o IP da tentativa de conexão.
3)
iptables -A INPUT -p tcp -m tcp --dport 22324 -m state --state NEW -m recent --set --name SSH --rsource -j DROP
3.1)
Negue a tentativa de novas conexões (-m state --state NEW) de acesso (destino) à porta 9837 e adicione (--set) o IP da tentativa (--rsource) a lista (--name SSH).
4)
iptables -A INPUT -p tcp -m tcp --dport 22325 -m state --state NEW -m recent --name SSH --remove -j DROP
4.1)
Negue as tentativas de novas conexões (-m state --state NEW) a porta (destino) 22323 e remova (--remove) da lista (--name SSH) o IP da tentativa de conexão.
Quando alguém tentar se conectar com o SSH, pela porta 22, o firewall irá negar a tentativa de conexão, agora se você der um telnet, ou melhor, enviar um pacote tcp com a flag syn setada (sinônimo de nova conexão) à porta 22324, o iptables irá colocar o seu IP em um arquivo, denominado SSH em /proc/net/ipt_recent, se neste arquivo o IP das tentativas estiver se repetindo 3 vezes em um período de tempo de 60 segundos, o iptables abrirá a porta 22 (SSH) para o IP. E quando o IP enviar um pacote com a flag syn setada (telnet por exemplo) para a porta 22323 ou 22325 o iptables retirará a regra que abre a porta e o IP da lista (/proc/net/ipt_recent/SSH).
Outra coisa interessante de se citar, é o fato de ter duas portas fechando e estarem antes e depois da porta que abre. Com esse esquema, se alguém der um nmap em seu firewall, ele passará pela porta 22323, como o IP não está na lista, o firewall não faz nada, e depois passa na porta 22324, aí sim o firewall adiciona o IP da máquina na lista, mas logo em seguida passa pela porta 22325 e o firewall o retira da lista, ficando assim muito difícil de alguém conseguir abrir a porta SSH do seu firewall, e ainda mais, ele tem que tentar três conexões na porta 22324 para o firewall poder abrir a 22. Eu particularmente acho "QUASE IMPOSSÍVEL" de alguém conseguir abrir a porta, mas você sabe né, segurança é cruel, quanto mais se tenta deixar seguro, sempre descobre algo novo!!!
[2] Comentário enviado por gilps em 31/03/2006 - 01:57h
Muito bom!
Quais os modulos do iptables, que tem que levantar para isso funcionar, tentei e aqui e ñ fez nada!
Aqui criei um arquivo com o nome rc.firewall, que levanta os modulos compartilha a web e redireciona portas para os demais pcs da rede! E adicionei esta regra no fim do arquivo!
[3] Comentário enviado por melphos em 03/04/2006 - 09:19h
Amigo,
Se você usa o iptables 1.2.11 ou superior, kernel 2.6 ou 2.4. Os módulos são carregados automaticamente.
Mas se caso mesmo assim quizer levantar os módulos na mão.
modprobe ipt_recent.
Para teresponder com mais segurança e certeza, fale/poste sobre os erros ...
[4] Comentário enviado por gilps em 05/04/2006 - 03:08h
Bá esta funcionando blz!...agora.
Mais uma perguntinha, usando o mesmo esquema de 3 tentativas e de pois, é aberta a porta do ssh, tem como em vez de abrir uma porta, executar um script?
Sei que parece bobagem mas estou precisando de algo assim!
Mais uma vez, esta dica sua é excelent! parabéns.
Abraços...
[5] Comentário enviado por melphos em 05/04/2006 - 09:00h
Campeão,
Até onde meu conhecimento vai em iptables, eu acho que não da não.
Mas nada impede de procurar-mos algo.
Você pode fazer este esquema das portas junto com um aplicativo que escute em alguma porta específica e quando uma requisição syn chegar ele executa um script. É uma idéia.
[6] Comentário enviado por marcosantiago em 11/05/2006 - 16:28h
Amigo,
Fiz os procedimentos que vc disse...carreguei os modulos...mas não aconteceu nada...ele continua com a porta 22 aberta aceitando conexões normalmente....
Se puder ajudar...Obrigado
OBS:Eu uso slackware 10.2 kernel 2.4 iptables 1.2.10
[7] Comentário enviado por melphos em 11/05/2006 - 16:44h
Então,
Bom vamos lá, vamos fazer um check list.
Primeiro, precisa ter a regra de aceitar conexões estabilizadas e relatadas na pilha do netfilter.
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
Definir a politica padrão como DROP
iptables -P INPUT DROP
Definir as regras do port knoking
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --rcheck --name SSH --rsource --seconds 60 --hitcount 3 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22323 -m state --state NEW -m recent --name SSH --remove -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m tcp --dport 22324 -m state --state NEW -m recent --set --name SSH --rsource -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m tcp --dport 22325 -m state --state NEW -m recent --name SSH --remove -j REJECT --reject-with tcp-reset
Agora sim.
Manda três telnet enseguidas para o host na porta 22324 e já era. A 2 estára aberta.