De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Como melhorar a segurança do ssh
Colaboração: Ederson L. Corrêa
Data de Publicação: 13 de Janeiro de 2005
Sabemos que o ssh é uma forma de acesso remoto razoalvelmente
segura, bem mais segura que nosso velho conhecido telnet.
Entretanto, na net encontram-se disponiveis diversos scripts de
"brute force" para tentar se obter acesso pelo ssh, e como não
faltam idiotas metidos a crackers para tentarem essas coisas,
sempre é bom se cercar de todo o cuidado.
Aqui listarei algumas sugestões coletadas de várias fontes
(agradecimentos especiais ao Alejandro Flores, que me deu boas
idéias), que ajudam a aumentarmos nossa segurança.
1. Use senhas fortes: Não use senhas fáceis, muito menos
pequenas, de preferência assimétricas e sem padrão (nada de
"letra numero letra numero ..." ou "numero letra numero letra
...") e faça bom uso dos caracteres como @,#,$,&, ...;
2. Mude a porta do ssh: Só com isso minimizamos problemas com um
ataque automatizado, ou ataques de script kiddies que não sabem
mudar a porta do ssh no exploit que baixaram da internet. Isso
pode ser feito através da opção 'Port' do /etc/ssh/sshd_config.
3. Bloqueie o acesso como usuário root: Assim, evita-se
problemas de alguém conseguir quebrar a senha do root e já
acessar com plenos poderes. Com isso, o 'atacante' teria que
descobrir o login e password de um usuário e depois a senha
do root. Isso pode ser feito adicionando 'PermitRootLogin no'
no /etc/ssh/sshd_config.
4. Certifique-se de o sshd estar rodando com separação
de privilegios: Dessa forma, o sshd cria um processo não
privilegiado para tratar as conexões iniciais. Após sucesso na
autenticação, cria um outro processo que tem os provilegios
necessários. Isso é default no ssh, mas devemos garantir
que NÃO exista uma linha com 'UsePrivilegeSeparation no'
no /etc/ssh/sshd_config.
5. Permita acesso a apenas um usuário: Isso
é possivel através da opção 'AllowUsers' do
/etc/ssh/sshd_config. Bastaria acrescentar uma linha com
'AllowUsers nome_do_usuario_autorizado_a_logar_via_ssh'.
6. Crie um usário com o máximo de restrições possiveis e que
você só use para o shh: Exemplos de restrições:
- Não o inclua em nenhum outro grupo além do users;
- Edite o /etc/ftpusers e acrescente o nome desse usuário. Assim
bloqueamos o acesso dele ao ftp.
- Evite que ele possa se tornar root (adicione uma linha com
'root:nome_usuario_do_ssh:DENY' no /etc/suauth). Assim, vc
deverá se tornar outro usuário e ai sim se tornar root. Exemplo,
suponhamos que 'teste' seja o usuario criado para o acesso
por ssh, e que 'elcorrea' seja um outro usuário cadastrado na
máquina, assim para se tornar root estando logado com teste
teriamos que fazer:
$ (aqui somos teste)
$ su - elcorrea (aqui nos logamos como usuario elcorrea)
Password: (password do elcorrea)
$ (agora somos elcorrea)
$ su - (aqui nos tornamos root)
Password: (password do root)
# (agora somos root)
Assim, vemos que alguém teria que descobrir dois nomes de
usuário e três senhas para conseguir se tornar root.
- Utilize algum programa pós-login para efetuar um 'challenge'
para certificar de que você é você mesmo. Essa foi uma grande
idéia do Alejandro. O que ele quis dizer é para criarmos um
programa ou script que faz uma pergunta, a qual pode ser um
gerador de caracteres baseado na hora ou uma simples pergunta
de carater pessoal, que só você saberia responder. E caso
o usuário erre ou tente fechar o programa/script (ctrl+c)
a sessão é fechada. Um exmeplo bem simplista seria:
- Crie (ou edite acrescentando no inicio) um .bash_profile
para o usuário do ssh com o seguinte conteudo:
trap '' SIGINT SIGTERM
./eu.sh
if [ -e sou_eu.txt ]; then
echo "Acesso Autorizado"
rm -f sou_eu.txt
else
echo "Acesso Negado"
logout
fi
trap SIGINT SIGTERM
- Crie um arquivo chamado eu.sh no home do usuário do ssh, com:
#!/bin/bash
echo "Qual a senha do seu cartao?"
read resp
if [ "$resp" == "123456" ]; then
touch sou_eu.txt
fi
E não se esqueça de torna-lo executavel: chmod +x eu.sh
7. Se possivel, limite os endereços IPs que podem acessar a
maquina por ssh: Caso você sempre acesse a máquina através de
um número limitado de maquinas, ou então somente internamente
a rede, você pode limitar o acesso ao ssh a somente essas
maquinas.
Isso pode ser feito de diversas formas, com regras no iptables,
através da dupla /etc/hosts.allow e /etc/hosts.deny, e, o que eu
acho mais fácil, através da opção AllowUsers na forma user@host.
Assim, suponhamos que eu sempre acesso a maquina remoatamente
através de uma máquina de IP 10.0.0.5 e que eu criei o usuário
'teste' para acesso por ssh, assim eu acrescentaria uma linha
com 'AllowUsers teste@10.0.0.5' no /etc/ssh/sshd_config,
e limitaria o acesso a apenas esse usuário e de apenas essa
maquina.
Se você não pode limitar os endereços, por qualquer
razão, é bom utilizar um script que detecte uma
tentaiva de acesso por brute force e que bloqueie o IP
do atacante. Veja também um script desse tipo, criado pelo Mastah
listado abaixo:
#!/bin/bash
# Shellscript criado para bloquear os corriqueiros bruteforce probes
# feitos para a porta do ssh. Pega as ultimas 20 tentativas ilegais na porta do ssh.
# Verifica se voce já bloqueou o mané e se voce quer adicionar na regra do iptables.
# Caso queira usar no crontab, é so mudar o valor da var $MODE pra "AUTO"...
# Abracos, Mastah
MODE="AUTO"
#MODE="MANUAL"
if [ -f /var/log/messages ] ; then
ips=$(cat -n /var/log/messages | tail -n 20 | grep -i Illegal | 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 "Brute force SSHD attack detected from $ip"
attempts=1
lastip=""
blocked=$(iptables -L INPUT | grep -i $ip | grep -i DROP)
if [ "$blocked" ] ; then
echo "> Ip Already Blocked. Continuing with scan"
echo " "
else
if [ $MODE == "MANUAL" ] ; then
echo "> Do You Want to add this IP to INPUT DROP in IPTABLES rules? (y/n)"
read resp
if [ "$resp" == "y" ] ; then
iptables -A INPUT -s $ip -j DROP
echo "> IP $ip ADDED TO IPTABLES INPUT DROP ruleset"
echo " "
fi
else
iptables -A INPUT -s $ip -j DROP
echo "> IP $ip ADDED TO IPTABLES INPUT DROP ruleset"
echo " "
fi
fi
fi
fi
done
fi
Assim, utilizando apenas algumas dessas dicas já aumentamos
enormemente a nossa segurança.
Caso não tenha ficado claro, todas as alterações mencionados
aqui devem ser feitas na maquina que será acessada remotamente.