Vou logo avisando que este é um post longo, mas vale à pena você dedicar alguns minutos para lê-lo e aprender como deixar o acesso ao SSH menos vulnerável a ataques usando o SPA.
SPA (Single Packet Autorization) é uma técnica baseada em Port Knocking que ajuda a aumentar a segurança do SSH.
Como funciona o SPA?
Antes de responder a esta pergunta, é preciso explicar como funciona o Port Knocking.
Port Knocking, segundo o site www.portknocking.org, é uma forma de comunicação entre dois hosts, em que o host cliente envia uma informação, que pode ser criptografada, é dividida e enviada em uma sequência de pacotes a uma porta que está fechada (protegida) num host destinatário. Embora a porta do host destinatário possa estar fechada ou protegida por um firewall, por exemplo, há um daemon que fica escutando os pacotes que chegam. Neste caso, se a sequência de pacotes enviada pelo host cliente estiver correta, a porta será aberta temporariamente e exclusivamente para ele. Vide figura 1.
Figura 1: Funcionamento do Port Knocking.
Uma analogia muito utilizada ao Port Knocking é: uma pessoa que bate na porta fechada de uma casa, usando uma sequência de batidas que é reconhecida pela pessoa que está escutando do lado de dentro atrás da porta. É daí que vem o nome Port Knocking (bater na porta). 🙂
Mas alguns especialistas em segurança da informação perceberam que o Port Knocking tem as seguintes falhas:
- Se a sequência de pacotes chegar errada no host destino (devido a diferentes rotas que cada um pode tomar), nenhuma porta será aberta e não será possível acessar o serviço.
- Os pacotes podem ser capturados por um invasor que está observando o tráfego da rede e tentar um ataque no host destino, se disfarçando por um cliente válido.
- Port Knocking usa os campos de cabeçalho dos protocolos TCP e UDP para enviar “a senha” de acesso e não utiliza criptografia.
É para suprir estas falhas que o SPA foi criado. Ele usa criptografia e só precisa enviar apenas um pacote ao host destino para obter o acesso. E um dos softwares que implementa o SPA é o fwknop, criado por Michael Rash.
Meu amigo Leandro Almeida apresentou uma palestra sobre este tema no III ENSOL e os slides podem ser vistos a seguir. Eles são bem explicativos e objetivos. Qualquer dúvida poste um comentário para debatermos sobre o assunto.
Espero que tenha entendido toda esta teoria (se não entendeu, fale sua dúvida), porque agora vou ensinar a instalar e configurar o fwknop no Ubuntu 10.04 LTS (neste tutorial estou assumindo que o SSH está instalado e escutando na porta 22).
OBS.: Nos testes que eu fiz, utilizei duas máquinas virtuais. Uma será o servidor SSH que contém o Ubuntu Server 10.04 com o IP 192.168.0.254 (onde está instalado o iptables e o OpenSSH-Server) e a outra é uma máquina com o IP 192.168.0.1 com o Ubuntu Desktop 10.0.4 que contém o cliente ssh.
Para instalar o fwknop no servidor, usei o seguinte comando.
# apt-get install fwknop-server
Durante a instalação, informei uma senha a ser usada pelo fwknop. Depois disso, eu executei o seguinte comando.
# iptables -A INPUT -d 192.168.0.254 -p tcp –dport 22 -j REJECT
Onde:
- 192.168.0.254 é o IP do servidor que contém o OpenSSH-Server instalado.
O comando acima diz ao Iptables para negar qualquer tentativa externa de conexão ao SSH na porta 22. Ou seja, a porta 22 está fechada.
Depois disso, eu configurei o arquivo /etc/fwknop/access.conf as seguintes opções.
SOURCE: ANY; # Qualquer host pode tentar conectar
OPEN_PORTS: tcp/22; # Porta usada pelo SSH
KEY: testeteste; # Senha criada para o fwknop, ela deve ser divulgada com cuidado apenas com os usuários que terão acesso ao SSH.
FW_ACCESS_TIMEOUT: 30; # Tempo em segundos para abrir a sessão SSH após a autorização
O comando abaixo foi executado para carregar as configurações e iniciar o daemon do fwknop-server.
# /etc/init.d/fwknop-server restart
Ao executar o comando iptables –L foi possível ver que a chain FWKNOP_INPUT foi criada. É nela que podemos ver quais as conexões temporárias que serão autorizadas pelo fwknop.
No host client, que acessará o SSH, foi instalado o pacote fwknop-client com o seguinte comando.
# apt-get install fwknop-client
Agora, para eu acessar o ssh do servidor 192.168.0.254, é preciso digitar o comando abaixo.
# fwknop -A “tcp/22” -a 192.168.0.1 -D 192.168.0.254
Onde:
- “tcp/22” => porta TCP do SSH.
- 192.168.0.1 => IP do host cliente que vai acessar o SSH.
- 192.168.0.254 => IP do servidor SSH.
O comando acima envia um pacote com a senha do fwknop requisitando uma autorização no host destinatário para acessar o SSH.Lembre-se que o Iptables continua rejeitando as conexões na porta 22. Mas se o daemon perceber que o pacote enviado pelo cliente é válido ele vai abrir uma excessão e permitirá que por 30 segundos (tempo configurado no arquivo /etc/fwknop/access.conf) apenas aquele host cliente possa abrir uma conexão na porta 22. Depois que a sessão SSH for encerrada, ele fecha a porta novamente.
Continuando, só depois que for executado o comando acima, é possível abrir uma sessão SSH com o comando abaixo.
# ssh aecio@192.168.0.254
Como digitar o comando de autorização do fwknop-client cada vez que for abrir uma sessão SSH é uma “mão-de-obra”, criei o script client_ssh.sh que simplemente pergunta o IP do servidor SSH e a porta em que o serviço está sendo executado e depois eu posso abrir uma sessão SSH.
Você pode baixar o script e usar também. Depois de baixá-lo use o comando abaixo para dar permissão de execução ao script.
# chmod +x cliente_ssh.sh
Todas as vezes que o usuário for conectar ao servidor SSH, ele deve executar o script acima para receber uma autorização do fwknop-server. Depois de executado o script cliente_ssh.sh, tem 30 segundos para iniciar a sessão SSH (tempo configurado no arquivo /etc/fwknop/access.conf) ou enviar um arquivo usando SCP. Caso contrário, o script deve ser executado novamente.
Para receber a autorizaçao do fwknop-server, a senha configurada no arquivo /etc/fwknop/access.conf tem que ser compartilhada com quem as pessoas que têm permissão para acessar o SSH.
Para finalizar, veja o vídeo feito por Leandro Almeida que demonstra o funcionamento do fwknop.
Finish! Então, o que achou?
Deixe um comentário