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

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.


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


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

0
grep "Failed password for" /var/log/auth.log |
    awk -F"from" {'print $2'} |
    awk {'print $1'} |
    sort -u

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.