Як отримати IP-адреси можливих ssh-зловмисників?


17

Я просто cat /var/log/auth.logввійшов і побачив, що є багато | grep "Failed password for"записів.

Однак можливі два типи записів - для дійсного / недійсного користувача. Це ускладнює мої спроби на | cutних.

Мені хотілося б створити список (текстовий файл) з IP-адресами можливих зловмисників та кількістю спроб для кожної IP-адреси. Чи є якийсь простий спосіб її створити?

Крім того, що стосується лише ssh: Які всі записи /var/log/auth.logслід враховувати при складанні списку можливих нападників?

Приклад мого "auth.log" із прихованими номерами:

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

Результат:

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

Я пропоную вам створити ключі ssh, встановити їх на своєму сервері та повністю відключити паролі у файлі конфігураційного файлу sshd /etc/ssh/sshd_config... налаштування пошуку PasswordAuthentication noта PermitRootLogin without-password ... тоді всі такі спроби паролів будуть зірвані перед тим, як коли-небудь входити в auth.log ...
Scott Stensland

Відповіді:


19

Ви можете використовувати щось подібне:

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

Він схоплює рядок Failed password forі витягує ( -o) ip адресу. Він сортується і uniqпідраховує кількість випадків.

Тоді вихід буде виглядати приблизно так (з вашим прикладом як вхідним файлом):

  1 111.111.111.1
  3 111.11.111.111
  6 111.111.11.111

Останній на виході спробував 6 разів.


це найкраща відповідь @chaos - додано до моєї скриньки корисних ліній - дякую!
Джейк

Прекрасне рішення. Я не знав, що grep може витягувати збіги з регулярними виразками, а не лише лінії фільтра. Я щойно додав | sort -nдо ланцюжка.
kravemir

1
Хороша відповідь - декілька грепсів зазвичай є знаком використання sed. sed -nr '/Failed/{s/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/;p}'замінює обидві грепи.
orion

1
@orion правда, але уявіть, що першим грепом може бути zgrep "Failed" /var/log/auth.log*також пошук через стислі журнали архівів, що sedне може.
хаос

1
Що з IPv6?
Ортомала Локні

6

Це може бути роздуте рішення, але я пропоную вам поглянути на встановлення чогось типу Fail2Ban

Він створений для такого типу реєстрації + додає бонус за можливість додавати (тимчасові) правила у ваш брандмауер, щоб блокувати повторюваних порушників. Не забудьте додати до списку власних ip, хоча мені вдалося кілька разів тимчасово заблокувати себе


Ну, приємний коментар, але не відповідь на запитання. Це більше схоже на пропозицію, яка могла б усунути необхідність запитання, але мені не потрібен демон, щоб контролювати свої файли. У мене є мої причини, чому мені потрібно робити цей список як текстовий файл лише за сценаріями. :)
kravemir

Я погоджуюся з @Miro, якби ви цього не згадали, я б додав це в коментар.
SailorCire

@Miro, ви праві, не відповідь на саме запитання, це просто прийшло в голову як зручний інструмент для подібного ведення журналу.
Джейк

0

Це вийшло справді добре для мене. (IP-адреси були змінені для захисту винних)

$ 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

Результат password- не працює. Він навіть не охоплює різні типи запису, awkколонка друку є альтернативою cut, а не рішенням.
kravemir

Це працює для мене або з зразком вище ou real /var/log/auth.log
Archemar

Ну, це не спрацювало до редагування - коли коментар був зроблений. Тепер він працює правильно. Однак він пропускає, uniq -cяк у найкращій відповіді.
kravemir
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.