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!

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

7 Resultados

  1. Felipe disse:

    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?

  2. 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!

  3. Andre disse:

    Muito bom, bem explicado.
    Parabéns.

  4. Italo disse:

    Dica simples e muito boa, cara. Obrigado. Me ajudou bastante.

  5. Paulinho disse:

    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

  6. Daniel disse:

    da para liberar só seu ip local

    boa dica

  7. Adriano disse:

    Muito boa sua dica
    Parabéns pelo blog!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *