O SSH é bastante seguro, especialmente se você tomar precauções razoáveis, como exigir autenticação baseada em par de chaves. No entanto, ainda existem muitos bots à solta que tentam encontrar hosts vulneráveis tentando fazer login com nomes de usuário e senhas comuns comprometidos, como root / root ou admin / admin. Embora seja improvável que tenham sucesso, eles ainda usarão sua largura de banda e gerarão grandes quantidades de logs.
Uma maneira de minimizar as tentativas de login de força bruta é alterar a porta padrão de escuta do SSH. No entanto, isso não é considerado uma boa prática - primeiro, lembre-se de que cada vez que se conectarem ao servidor, eles devem definir a porta correta, diferente da padrão. Além disso, ele pode criar outra vulnerabilidade de segurança se a porta selecionada for maior que 1024. Normalmente, apenas o root pode se vincular a números de porta abaixo de 1024. No entanto, se um número de porta maior for usado para SSH, em certas circunstâncias, os usuários sem acesso root podem substituir o daemon SSH com outro serviço possivelmente malicioso.
A melhor maneira de resolver esse problema é usar uma ferramenta que bloqueie o acesso de um invasor ao servidor SSH. Uma tal ferramenta amplamente utilizada é fail2ban ( www.fail2ban.org ). Ao analisar os logs, o fail2ban detecta tentativas repetidas de autenticação com falha e define automaticamente as regras de firewall para descartar o tráfego originado do endereço IP do invasor.
Instale fail2ban no Ubuntu
Instalação manual
Instalar fail2ban no Ubuntu (e outras distribuições baseadas em Debian) é muito simples:
$ sudo apt install fail2ban
Verificando como funciona
Você pode verificar se o serviço está sendo executado com o seguinte comando:
$ sudo systemctl status fail2ban
A saída deve ser semelhante à seguinte - o status do serviço deve ser ativo:
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-05-18 12:36:36 ***; ** min ago
Docs: man:fail2ban(1)
Process: 723*** ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Main PID: 723*** (f2b/server)
Tasks: 5 (limit: 38293)
Memory: 18.0M
CGroup: /system.slice/fail2ban.service
└─723488 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Vamos ver como fail2ban mudou as regras de iptables:
$ sudo iptables -L -n -v
Você também deve ver que há uma nova cadeia f2b-sshd na configuração do iptables que é referenciada pela regra de cadeia INPUT:
Chain INPUT (policy ACCEPT 73411 packets, 6622K bytes)
pkts bytes target prot opt in out source destination
1019 65297 f2b-sshd tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
8 480 REJECT all -- * * 94.191.93.46 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 77.50.75.162 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 51.254.143.190 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 46.101.97.5 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 43.129.28.88 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 41.221.168.167 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 35.247.219.12 0.0.0.0/0 reject-with icmp-port-unreachable
12 720 REJECT all -- * * 220.180.119.192 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 218.75.121.75 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 213.87.101.176 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 192.139.15.34 0.0.0.0/0 reject-with icmp-port-unreachable
21 1260 REJECT all -- * * 187.104.145.210 0.0.0.0/0 reject-with icmp-port-unreachable
8 480 REJECT all -- * * 177.191.189.13 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 159.89.82.134 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 159.75.140.97 0.0.0.0/0 reject-with icmp-port-unreachable
8 480 REJECT all -- * * 157.92.13.105 0.0.0.0/0 reject-with icmp-port-unreachable
11 660 REJECT all -- * * 117.80.225.245 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 106.53.121.179 0.0.0.0/0 reject-with icmp-port-unreachable
865 56057 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
O pacote fail2ban contém uma ferramenta chamada fail2ban-client. Ele permite que você verifique o status do serviço e interaja com ele (por exemplo, permite que você bloqueie e desbloqueie manualmente endereços IP, habilite e desabilite as cadeias, etc.)
Vamos ver quais cadeias estão ativas:
$ sudo fail2ban-client status
Status |- Number of jail: 1 `- Jail list: sshd
Há apenas uma prisão - sshd - que sq é responsável por monitorar os logs do servidor SSH para login com falha e configurar regras de firewall para bloquear novas tentativas.
Agora podemos verificar as estatísticas da prisão sshd:
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 8
| |- Total failed: 26
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 22
|- Total banned: 25
`- Banned IP list: 106.53.121.179 117.80.225.245 157.92.13.105 159.75.140.97 159.89.82.134 177.191.189.13 187.104.145.210 213.87.101.176 218.75.121.75 220.180.119.192 35.247.219.12 41.221.168.167 43.129.28.88 46.101.97.5 51.254.143.190 77.50.75.162 94.191.93.46 1.55.165.141 120.53.245.68 104.131.178.145 106.56.102.83 152.32.146.21
Configurando fail2ban
Na maioria dos casos, a configuração padrão deve ser suficiente. No entanto, é útil entender quais são esses padrões e como eles podem ser alterados para atender às suas necessidades.
Em uma configuração padrão, fail2ban protegerá o servidor SSH e bloqueará o invasor por 10 minutos após 5 tentativas de login malsucedidas em 10 minutos. O arquivo de configuração padrão pode ser encontrado em /etc/fail2ban/jail.conf. O arquivo é bem documentado e, em grande parte, autoexplicativo. Observe que você não deve fazer nenhuma alteração neste arquivo, pois ele pode ser substituído durante a atualização fail2ban.
Após alterar a configuração, não se esqueça de reiniciar o serviço:
$ sudo systemctl restart fail2ban
Devo observar que, neste caso, alterei os parâmetros de configuração, entendendo a estratégia de ataque e recebi uma lista diária de hosts atacantes e bloqueei.
Mas falarei sobre isso mais tarde em uma nota separada, se esta for útil e interessante para alguém.