Como recuperar endereços IP de possíveis invasores ssh?

17

Acabei de cat /var/log/auth.logregistrar e ver que existem muitos | grep "Failed password for"registros.

No entanto, existem dois tipos de registro possíveis - para usuário válido / inválido. Isso complica minhas tentativas para | cuteles.

Gostaria de ver criar uma lista (arquivo de texto) com endereços IP de possíveis invasores e número de tentativas para cada endereço IP. Existe alguma maneira fácil de criá-lo?

Além disso, apenas em relação a ssh: O /var/log/auth.logque devo considerar em todos os registros ao fazer a lista de possíveis invasores?

Exemplo do meu 'auth.log' com números ocultos:

cat /var/log/auth.log | grep "Failed password for" | sed 's/[0-9]/1/g' | sort -u | tail

Resultado:

Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user ucpss from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user vijay from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user webalizer from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user xapolicymgr from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user yarn from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user zookeeper from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user zt from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for mysql from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for root from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for root from 111.111.111.1 port 11111 ssh1
kravemir
fonte
Eu sugiro que você crie chaves ssh, instale-as no seu servidor e desabilite as senhas inteiramente no arquivo de configuração sshd do servidor /etc/ssh/sshd_config... configurações de pesquisa PasswordAuthentication noe PermitRootLogin without-password ... todas essas tentativas de senha serão frustradas antes de entrar no auth.log ...
Scott Stensland

Respostas:

19

Você poderia usar algo como isto:

grep "Failed password for" /var/log/auth.log | grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" \
| sort | uniq -c

Ele recebe a string Failed password fore extrai ( -o) o endereço IP. Ele é classificado e uniqconta o número de ocorrências.

A saída ficaria assim (com o seu exemplo como arquivo de entrada):

  1 111.111.111.1
  3 111.11.111.111
  6 111.111.11.111

O último na saída tentou 6 vezes.

caos
fonte
esta é a melhor resposta @chaos - adicionada à minha caixa de oneliners úteis - obrigado!
Jake
Ótima solução. Eu não sabia que o grep pode extrair correspondências de regex, não apenas linhas de filtro. Acabei de adicionar | sort -nà cadeia.
Kravemir
1
Boa resposta - vários greps são geralmente um sinal para usar o sed. sed -nr '/Failed/{s/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/;p}'substitui os dois greps.
orion
1
@orion true, mas imagine que o primeiro grep também possa ser zgrep "Failed" /var/log/auth.log*pesquisar nos arquivos de log compactados, o que sednão pode.
caos
1
E o IPv6?
Ortomala Lokni
6

Pode ser uma solução inchada, mas eu sugiro que você instale algo como Fail2Ban

Ele é feito para esse tipo de registro + adiciona o bônus de poder adicionar regras (temporárias) ao seu firewall para bloquear os reincidentes. Certifique-se de colocar na lista branca os seus próprios ips, eu consegui me bloquear temporariamente em algumas ocasiões

Jake
fonte
Bem, bom comentário, mas não uma resposta para a pergunta. É mais uma sugestão que pode remover a necessidade de pergunta, mas não preciso de um daemon para monitorar meus arquivos. Eu tenho minhas razões pelas quais preciso fazer essa lista como arquivo de texto apenas por scripts. :)
kravemir
Concordo com o @Miro, se você não tivesse mencionado aqui, eu o teria adicionado em um comentário.
SailorCire
@Miro, você está certo, não é uma resposta para a pergunta em si, ela veio à mente como uma ferramenta conveniente para esse tipo de registro.
19415 Jake
0

Isso funcionou muito bem para mim. (IPs foram alterados para proteger os culpados)

$ awk '/Failed/ {x[$(NF-3)]++} END {for (i in x){printf "%3d %s\n", x[i], i}}' /var/log/auth.log | sort -nr
 65 10.0.0.1
 14 10.0.0.2
  4 10.0.0.3
  1 10.0.0.4
Nomes falsos
fonte
0
grep "Failed password for" /var/log/auth.log |
    awk -F"from" {'print $2'} |
    awk {'print $1'} |
    sort -u
Liviu Popescu
fonte
O resultado é password- não está funcionando. Ele nem cobre tipos de entrada diferentes; awka coluna de impressão é alternativa à cut, e não à solução.
Kravemir
Ele funciona para mim também com a amostra acima OU /var/log/auth.log reais
Archemar
Bem, não funcionou antes da edição - quando o comentário foi feito. Agora funciona corretamente. No entanto, falta uniq -ccomo na melhor resposta.
Kravemir