Aumentando o nível de seguraça na conexão SSH
Distribuição testada: Debian 10 Buster
Requisitos SSH intalado
# 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
# vim /etc/ssh/sshd_config
Aletere as seguintes linhas:
# 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:
# 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:
# /etc/init.d/ssh restart
Pronto!
# 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
# 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.
# 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
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)
# apt install nftables # systemctl enable nftables # nft list ruleset # vim /etc/nftables.conf
#!/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
# systemctl restart nftables # nft list ruleset
Instale o nmpa e faça um scanner
# apt install nmap # nmap localhost
Resultado:
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.
# vim /etc/hosts.allow
Adicione:
sshd: 200.1.2.3 # Ip Especifico sshd: 10.0.0.0/24 # Uma Classe de IP
# vim /etc/hosts.deny
Adicione:
sshd: ALL
Agora sim né! Humm.. Sei não que tal instalar o fail2ban?
# 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
vim /etc/fail2ban/jail.conf
Por padrão os tempos de banimento é de 10m e numero de tentativas é 5
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
[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.:
# vim /etc/fail2ban/jail.d/defaults-debian.conf
[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!
No meu exemplo deu erro! não consegui logar com meu usuário comum! solicitou senha para logar na outra máquina! Eu teria que criar um ssh key e enviar para outro lado da máquina no arquivo /etc/ssh/sshd_conf para quando solicitar senha eu digitar a senha que eu criei na ssh key?
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!