Números de Porta Nem Tão Bem Conhecidos Assim
Rec 05-jan-2008 14:48
Os "números de porta nem tão conhecidos assim" (NSWKPNs, sigla do termo em inglês) são uma maneira simples mas razoavelmente
eficazes para reduzir a exposição do seu perímetro de rede a ameaças da Internet.
Lembremos que um dos pilares básicos da suite de protocolos TCP/IP é o conceito de
números de portas bem conhecidos:
por convenção, alguns programas e protocolos usam certos números de porta. A porta
padrão do HTTP é 80/tcp, a do HTTPS é 443/tcp, o SSH usa 22/tcp, o syslog usa 514/udp,
e por aí vai.
Isso facilita alcançar seu servidor SSH que lhe permite administrar seu site remotamente.
Mas também torna seu servidor algo fácil para ataques de força bruta, exploração
de bugs e vários outros tipos de abuso.
Claro, você pode colocar regras no seu
firewall para rejeitar conexões vindo de
enderços não previamente aprovados, mas isso limita sua habilidade de conectar de
qualquer lugar.
E se o número da porta mudasse a cada cinco segundos de uma forma que fosse facilmente
previsível para você, mas parecesse totalmente imprevisível para qualquer outra pessoa?
Mais precisamente: e se pudéssemos fazer com que o número da porta seja calculado
partir de uma função de
hash criptográfico forte, usando a data/hora atual e uma
chave secreta como entrada?
Ainda mais precisamente: suponhamos que a porta do seu servidor SSH fosse calculada
de acordo com a seguinte função:
port = HOTP( (T/G) || K,4)+O
onde:
- T é a data/hora:min:seg atual
- G é a granularidade, digamos, 5 segunods
- K é uma chave secreta de 128-bits, escolhida aleatoriamente
- / significa divisão inteira de 32 bits
- || representa a operação de concatenação, de sorte que o resultado do primeiro parâmetro fica com 160 bits de tamanho
- HOTP(k,d) é a função geradora de senhas descartáveis definida na RFC 4226, com seu resultado truncado para 4 dígitos.
- O é um número escolhido do conjunto { 10000, 20000, 30000, 40000, 50000 }
Suponha que haja um utilitário chamado
pn
(de "port number") que realiza esse cálculo, obtendo os parâmetros a partir da linha
de comando e enviando o resultado na saída padrão. Então, no lado do cliente, poderíamos fazer:
ssh -p `pn algumasenha 1 5` me@myserver.net
A string
algumasenha
seria, obviamente, a chave. O
1 é abreviatura para
O=10000, fazendo com que
o número da porta resultante fique na faixa de 10000-19999. O
5 é a granularidade.
Agora, suponha que tivéssemos um módulo do netfilter chamado
nswkpn
que verifica se os
números de porta batem com o cálculo acima. Então, poderíamos ter regras do
iptables
mais
ou menos assim:
iptables -t nat -A PREROUTING -d ssh_servers_external_ip \
-m nswkpn -p tcp --offset 1 -j DNAT --to-destination=ssh_servers_internal_ip:22
iptables -A INPUT -d ssh_servers_internal_ip \
-m nswkpn -p tcp --offset 1 -j ACCEPT # Torque INPUT por FORWARD se o destino for outra maq
Para que funcione, o relógio do cliente e do servidor devem estar sincronizados com precisão melhor do que
G.
Usando esse método, reduzimos a chance de um atacante achar nosso servidor SSH de 1 (100%) para 1/10000
(0.01%). Não é tão sorrateiro quanto várias estratégias de
port knocking,
mas é mais simples. O programa calculador do número da porta pode rodar no seu celular o PDA.
Poderíamos obter uma operação muito mais sorrateira requerendo que a porta de origem satisfizesse
o mesmo cálculo acima, mas certos tipos de tradução de endereço realizados pelos firewalls
podem alterar os números de porta, fazendo com que o sistema falhe.
Fiquei tentado a chamar esse sistema de "números de porta de uso único",
em analogia com as "senhas de uso único" (do termo em inglês "one-time passwords").
Todavia, dei-me conta que isso seria impreciso: os números não são usados uma única
vez; de fato, são usados várias vezes, em diferentes instantes. O que dificulta
o atacante é a dificuldade de prevê-los.
topo