SSH port knocking – IPTABLES
Desta vez irei demonstrar como adicionar um cadeado com vários segredos para acesso via SSH em Firewall Linux só que desta vez usando IPTABLES. ( Modo Extreme ).
Esta técnica e a mesma do KNOCK só que desta vez puro e limpo modulo iptables
Port knocking funciona da seguinte forma, o usuário tem que de uma certa forma “bater” em um determinado número de portas com um limite extremamente pequeno de tempo, e ainda fazer a sequência correta para que possa liberar o ip do mesmo sem contar com um time out para esta mesma conexão fechar, no nosso caso o acesso é a porta 22 (SSH).
Este configuração abaixo pode ser colocada em um script OK
A configuração a seguir pode ser adicionada a seu script de firewall.
#!/bin/bash
# Descricao: Firewall Iptables
echo “Carregando regras de entrada…”
# Variaveis
any=”0.0.0.0/0″
localhost=”127.0.0.1/32″
intex=”eth0″
ipt=”/sbin/iptables”
# Ajusta politicas de acesso do firewall.
$ipt -P INPUT DROP
$ipt -F INPUT
$ipt -Z INPUT
# Aceita trafego na interface loopback.
$ipt -A INPUT -i lo -j ACCEPT
$ipt -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
HOST_IP=”0.0.0.0/0.0.0.0″
##################### Fases do Segredo #########################
$ipt -N INTO-FASE2
$ipt -A INTO-FASE2 -m recent –name FASE1 –remove
$ipt -A INTO-FASE2 -m recent –name FASE2 –set
$ipt -A INTO-FASE2 -j LOG –log-prefix “INTO FASE2: “
$ipt -N INTO-FASE3
$ipt -A INTO-FASE3 -m recent –name FASE2 –remove
$ipt -A INTO-FASE3 -m recent –name FASE3 –set
$ipt -A INTO-FASE3 -j LOG –log-prefix “INTO FASE3: “
$ipt -N INTO-FASE4
$ipt -A INTO-FASE4 -m recent –name FASE3 –remove
$ipt -A INTO-FASE4 -m recent –name FASE4 –set
$ipt -A INTO-FASE4 -j LOG –log-prefix “INTO FASE4: “
$ipt -A INPUT -m recent –update –name FASE1
# Basicamente se vcs observarem aqui estamos determinando quando vc passar pela FASE1 o mesmo verifica se vc ja passou caso sim remove a FASE1 e SETA a FASE2 depois faz isso na FASE3 e por ultimo na FASE4 com um tempo determinado entre cada FASE para que possamos fazer a sequência correto, no nosso exemplo são apenas 5 segundos entre cada FASE (você pode diminuir isso).
# Neste exemplo estou utilizando como sequência as portas 30334, 2200, 1005 e 40099
$ipt -A INPUT -p tcp –dport 30334 -m recent –set –name FASE1
$ipt -A INPUT -p tcp –dport 2200 -m recent –rcheck –seconds 5 –name FASE1 -j INTO-FASE2
$ipt -A INPUT -p tcp –dport 1005 -m recent –rcheck –seconds 5 –name FASE2 -j INTO-FASE3
$ipt -A INPUT -p tcp –dport 40099 -m recent –rcheck –seconds 5 –name FASE3 -j INTO-FASE4
# Chegamos a FASE4, é a última parte do script , onde a sua conexão e liberada caso vc acerte as 4 portas na ordem pré-estabelecida OK. Outra coisa muito interessante e colocar um limite nesta conexão estabelecida com o Firewall, em nosso exemplo o tempo aqui está setado para 3600 segundos ou 1 hora, depois disso será fechada novamente, lembrando que se vc ainda estiver conectado no Firewall não vai fazer diferença alguma vai cortar o galho da árvore de qualquer jeito.
$ipt -A INPUT -p tcp -s $HOST_IP –dport 22 -m recent –rcheck –seconds 3600 –name FASE4 -j ACCEPT
# Fechando todo acesso a porta 22
$ipt -A INPUT -p tcp –dport 22 -j DROP
### Fim script ###
Vamos testar
root@NoteDejano:~# telnet 192.168.0.117 30334
Trying 192.168.0.117…
^C
root@NoteDejano:~# telnet 192.168.0.117 2200
Trying 192.168.0.117…
^C
root@NoteDejano:~# telnet 192.168.0.117 1005
Trying 192.168.0.117…
^C
root@NoteDejano:~# telnet 192.168.0.117 40099
Trying 192.168.0.117…
^C
root@NoteDejano:~# ssh 192.168.0.117 -l root -p 22
root@192.168.0.117’s password: *******
Last login: Thu Jun 13 07:15:09 2013 from 192.168.0.17
[root@localhost ~]#
# abaixo vejam o iptables inserindo as FASES no Log
tail -f /var/log/messages
Jun 13 07:38:30 localhost kernel: INTO FASE2: IN=eth0 OUT= MAC=08:00:27:d2:57:d3:18:03:73:75:6f:ba:08:00 SRC=192.168.0.17 DST=192.168.0.117 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=13178 DF PROTO=TCP SPT=48509 DPT=200 WINDOW=14600 RES=0x00 SYN URGP=0
Jun 13 07:38:33 localhost kernel: INTO FASE3: IN=eth0 OUT= MAC=08:00:27:d2:57:d3:18:03:73:75:6f:ba:08:00 SRC=192.168.0.17 DST=192.168.0.117 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=57045 DF PROTO=TCP SPT=44192 DPT=300 WINDOW=14600 RES=0x00 SYN URGP=0
Jun 13 07:38:36 localhost kernel: INTO FASE4: IN=eth0 OUT= MAC=08:00:27:d2:57:d3:18:03:73:75:6f:ba:08:00 SRC=192.168.0.17 DST=192.168.0.117 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=15933 DF PROTO=TCP SPT=57733 DPT=400 WINDOW=14600 RES=0x00 SYN URGP=0
# Dica, nunca usem portas sequenciais tipo 100, 200, 300 ou 1001, 1002 e 1003 fica muito fácil para um IPPortScanner descobrir.