Aumentando o nível de seguraça na conexão SSH
Distribuição testada: Debian 10 Buster
Requisitos SSH intalado
1 |
# apt install ssh |
Primeiramente vamos mudar a porta do SSH de preferencia para uma porta bem alta (são mais difíceis serem escaneadas) e após definir apenas um único usuário para conexão
1 |
# vim /etc/ssh/sshd_config |
Aletere as seguintes linhas:
1 2 3 4 5 6 |
# Aqui vai da porta Port 60321 # Tempo que o usuario tem para fazer login LoginGraceTime 10 # Não permita que o usuário root se conecte PermitRootLogin prohibit-password |
Adicione a linha:
1 2 3 4 |
# Apenas este usuário chamado "seu_usuario" irá conseguir # conectar-se via ssh por mais que exita outros usuários que # teriam permissões de acessa o bash. AllowUsers seu_usuario |
Salve e reinicie o serviço:
1 |
# /etc/init.d/ssh restart |
Pronto!
1 |
# ssh usuariodossh@seuip -p 60321 |
Agora sua porta de conexão SSH é a 60321, e só loga pleo “seu_usuario” terminou? Não!!!
Que tal enganar um pouco! 🙂
Vamos criar uma regra de firewall com iptables, caso você já tenha um script de firewall adicione a ele. A regra será um DROP na porta 22 assim vai dar uma falsa impressão que sua porta está protegia quando alguém usar algum scanner, vai passar aquele impressão: “- iii tem firewall na 22, vamos procurar outro….”
Drop falso na porta 22
1 |
# iptables -A INPUT -p tcp --dport 22 -j DROP |
Se desejar filtrar sua porta de SSH (60321) e deixar apenas IP X ou Y conectarem-se, no meu exemplo deixo apenas os IP 200.1.2.3 e toda a classe 10.0.0.0-10.0.0.255.
1 2 3 4 5 |
# iptables -A INPUT -s 200.1.2.3 -p tcp --dport 60321 -j ACCEPT # IP Especifico # iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 60321 -j ACCEPT # Uma Classe # ip6tables -A INPUT -s 3001:1234::/32 -p tcp --dport 60321 -j ACCEPT # Uma Classe v6 # iptables -A INPUT -p tcp --dport 60321 -j DROP # ip6tables -A INPUT -p tcp --dport 60321 -j DROP v6 |
Como dito no momento que seu servidor for scanear seu servidor a porta 22 ira aparecer como filtrada.
Para verificar os filtros
1 2 |
iptables -nL ip6tables -nL |
Mas você ira precisar criar um script e colocar ele para iniciarlizar, e é por isso q eu recomendo você usar o nftables o nftables em vez do iptables, já que provavelmente vamos ver ele próximas distribuições no lugar do iptables. (Mas quis explicar o iptables também)
1 2 3 4 |
# apt install nftables # systemctl enable nftables # nft list ruleset # vim /etc/nftables.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; ip saddr 200.1.2.3 tcp dport 60123 counter accept ip saddr 10.0.0.0/24 tcp dport 60123 counter accept ip6 saddr 3001:1234::/32 tcp dport 60123 counter accept tcp dport 60123 counter drop tcp dport 22 counter drop } chain forward { type filter hook forward priority 0; } chain output { type filter hook output priority 0; } } |
Reinicie o serviço, verifique as regras
1 2 |
# systemctl restart nftables # nft list ruleset |
Instale o nmpa e faça um scanner
1 2 |
# apt install nmap # nmap localhost |
Resultado:
1 2 3 |
Not shown: 1674 closed ports PORT STATE SERVICE 22/tcp filtered ssh |
Assim já estou “protegido”! Legal!!!
Suficiente? Eu sou mais paranoico, então se desejar prossiga 😀
O que vamos fazer, é meio que redundante como que fizemos no firewall, porém se por alguma “zica” seu firewall não tiver rodando/ou foi quebrado o próximo passo vai salvar! Vamos configurar nos hosts para bloquear o serviço SSH e liberar apenas para seu IP ou classe.
1 |
# vim /etc/hosts.allow |
Adicione:
1 2 |
sshd: 200.1.2.3 # Ip Especifico sshd: 10.0.0.0/24 # Uma Classe de IP |
1 |
# vim /etc/hosts.deny |
Adicione:
1 |
sshd: ALL |
Agora sim né! Humm.. Sei não que tal instalar o fail2ban?
1 |
# apt install fail2ban |
Por padrão o modulo de proteção do SSH vem ativo (true) no Debian, no parâmetro maxretry você define o número de tentativas que poderá errar a senha para conexão a partir de um determinado IP.
Para alterar as configurações do fail2ban edite o arquivo /etc/fail2ban/jail.conf
1 |
vim /etc/fail2ban/jail.conf |
Por padrão os tempos de banimento é de 10m e numero de tentativas é 5
1 2 3 |
bantime = 10m # Duração para um IP ficar banido findtime = 10m # Se nenhuma correspondência nos logs é encontrada dentro de X tempo maxretry = 5 # Tentativas ate o banimento |
Adicione também a porta 60123 já que alteramos a mesma
1 2 3 4 5 6 7 8 |
[sshd] # To use more aggressive sshd modes set filter parameter "mode" in jail.local: # normal (default), ddos, extra or aggressive (combines all). # See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details. #mode = normal port = ssh,60123 logpath = %(sshd_log)s backend = %(sshd_backend)s |
O filtro fica ativo em /etc/fail2ban/jail.d/defaults-debian.conf, você pode incluir maxretry so para ele bem como bantime, personalizando somente o filtro SSH. Ex.:
1 |
# vim /etc/fail2ban/jail.d/defaults-debian.conf |
1 2 3 4 |
[sshd] enabled = true maxretry = 2 bantime = 12h |
Estamos 100% seguro? Nada é 100% seguro, mas certamente você levou seu nível de segurança a um nível “hard core”!
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento! (Esse deu trabalho!)
Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.
Abraço!
Excelente dica, seu site está de parabéns, não conhecia o site, mas de um tempo pra cá agora sempre busco algumas dicas aqui, obrigado por compartilhar com a gente! um abraço!
Muito bom, bem explicado.
Parabéns.
Dica simples e muito boa, cara. Obrigado. Me ajudou bastante.
Como faço isso?
Que tal enganar um pouco!
No seu firewall coloque a seguinte linha:
# Engana porta
iptables -A INPUT -p tcp –dport 22 -j DROP
da para liberar só seu ip local
boa dica
Muito boa sua dica
Parabéns pelo blog!