[Tutorial] Blindando o OpenSSH

A pouco tempo escrevi como usar o SSH juntamente com o Screen e agora pretendo mostrar como configuro o OpenSSH (Open Secure Shell) nos Servidores que administro.

Vou demostrar como ir um pouco mais fundo na configuração do sshd_config para se prevenir de ataques de Brute_Force e como configurar algumas regras de Firewall especificas para a conexão SSH.

É possivel executar conexões remotas via VPN com trocas de chaves públicas e privadas usando criptografia de 2048 bits (OpenVPN), mas nada como ter a comodidade e simplicidade de poder fazer acesso aos seus servidores usando o SSH desde que para manter uma conexão segura siga alguns passos extras de precaução.

Eu sempre configuro meus Servidores com as seguintes caraterísticas para acesso ao SSH:

1) Não uso a porta padrão para acesso, sempre mudo para uma porta acima de 45000 (na verdade qualquer valor acima de 1024 está bom);

2) Não permito acesso ao root, permito acesso somente aos usuários que pertencem a um determinado grupo e restrinjo o acesso ao comando su a este grupo de usuários usando o PAM;

3) Só aceito conexões com protocolo versão 2;

4) Limito o número de tentativas de conexão a 3;

5) Não permito senhas em branco;

6) Habilito o uso de PAM e Log;

7) Não permito o uso de tunelamento sobre SSH;

8) Não permito que o X seja exportado via SSH;

9) Uso a variável “MaxStartups” para bloquear ataques de Força Bruta;

10) Uso uma variável para fazer com que os processos filhos do OpenSSH rodem com baixos privilegios;

11) Faço acesso ao SSH sempre usando passphase, por isso do Screen com SSH;

12) Mostro um Banner sempre na conexão;

Além destas configurações que são feitas no arquivo de configuração do OpenSSH eu ainda rodo um Script de Firewall para filtrar conexões SSH e impedir ataques de Brute-Force, bem como um Script que roda via Cron de 15 em 15 minutos que pesquisa nos logs tentativas de acesso forçadas e cria regras de bloqueio automaticamente para elas.

Uma outra medida muito importante, senão a mais de todas é manter o pacote do OpenSSH sempre atualizado, pois as regras acima bloqueiam ataques de força-bruta mas não falhas do programa que podem ser exploradas por exploits e etc.
Também limite ao máximo o número de pessoas que terão acesso ao  SSH mas nunca compartilhe  um mesmo login, sempre crie um diferente para cada administrador (dentro do grupo que é permitido  o acesso ao SSH);

Abaixo você tem o Script do Iptables que utilizo para filtrar e logar as conexões ao SSH:

{

####
#### Script para Bloquear ataques de Força Bruta no OpenSSH
#### Obs:> Se a porta do SSH for outra nao esqueça de mudar a váriável
#### By Leandro Godoy
####

IPTABLES=`which iptables`
PORTA=”55555″

$IPTABLES -A INPUT -p tcp –syn –dport $PORTA -m recent –name sshattack –set

$IPTABLES -A INPUT -p tcp –dport $PORTA –syn -m recent –name sshattack –rcheck –seconds 60 –hitcount 3 -j LOG –log-prefix ‘SSH REJECT: ‘

$IPTABLES -A INPUT -p tcp –dport $PORTA –syn -m recent –name sshattack –rcheck –seconds 60 –hitcount 3 -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –syn –dport $PORTA -m recent –name sshattack –set

$IPTABLES -A FORWARD -p tcp –dport $PORTA –syn -m recent –name sshattack –rcheck –seconds 60 –hitcount 3 -j LOG –log-prefix ‘SSH REJECT: ‘

$IPTABLES -A FORWARD -p tcp –dport $PORTA –syn -m recent –name sshattack –rcheck –seconds 60 –hitcount 3 -j REJECT –reject-with tcp-reset

}

Abaixo está o Script que utilizo via Cron para bloquear os ataques de Brute-force já executados e logados pelo Servidor:

}

#!/bin/bash
# Shellscript criado para bloquear os corriqueiros bruteforce probes
# feitos para a porta do ssh. Pega as ultimas 10 tentativas ilegais na porta do ssh.
# Verifica se voce já bloqueou o Ip e se voce quer adicionar na regra do iptables.
# Caso queira usar manualmente, é so mudar o valor da var $MODE pra “AUTO”…
# Traduzido: Leandro Godoy
# Abracos, Mastah

MODE=”AUTO”
#MODE=”MANUAL”

if [ -f /var/log/messages ] ; then
ips=$(cat -n /var/log/messages | tail -n 10 | grep -i SSH_REJECT | grep -i sshd | awk -F” ” {’print $11′})
attempts=1
for ip in $ips ; do
lastip=$ip
if [ “$lastip” == “$ip” ] ; then
attempts=$(expr $attempts + 1)
if [ $attempts -ge 5 ] ; then
echo “Ataque de Brute Force (SSHD) detectado e originario de $ip”
attempts=1
lastip=””
blocked=$(iptables -L INPUT | grep -i $ip | grep -i DROP)
if [ “$blocked” ] ; then
echo “> IP ja esta bloqueado. Continuando o Scan”
echo ” “
else
if [ $MODE == “MANUAL” ] ; then
echo “> Voce quer adicionar este IP nas regras de DROP do Iptables da Chain INPUT? (y/n)”
read resp
if [ “$resp” == “y” ] ; then
iptables -A INPUT -s $ip -j DROP
echo “> IP $ip bloqueado com DROP na Chain INPUT”
echo ” “
fi
else
iptables -A INPUT -s $ip -j DROP
echo “> IP $ip bloqueado com DROP na Chain INPUT”
echo ” “
fi
fi
fi
fi
done
fi

}

No meu iDisc, dentro de Gnu/Linux, você encontra um arquivo de configuração do OpenSSH (sshd_config) todo comentado em português (por mim) e com todas as configurações citadas aqui bem como os demais arquivos de script citados aqui e muitos outros. Podem baixar a vontade e caso façam acréscimos me mandem…

Abraços

Créditos: Blog … BlogMind …

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: