Ваш SSH сервер вероятно подвергается сотням атак каждый день. Скорее всего это утверждение недостаточно. Я убежден, что ваш сервер атакуют сотни раз в день с почти 100% вероятностью. Тем не менее, многие разработчики практически не заглядывают в папку /var/log. Попробуйте выполнить простую команду journalctl -f | grep ssh в терминале прямо сейчас.

Если посмотреть на логи:

  • Кто

  • Когда

  • Откуда

  • Как
    они пытались войти на сервер - это можно увидеть подробно.

В этой статье мы рассмотрим как интерпретировать логи SSH сервера и способы анализа для поиска признаков взлома с точки зрения разработчиков.


1. Где находятся логи SSH?



Местоположение логов SSH немного отличается в зависимости от дистрибутива Linux.

В общем:

  • Семейство Ubuntu / Debian

    • /var/log/auth.log
  • Семейство CentOS / RHEL

    • /var/log/secure
  • Общие команды для systemd

    • journalctl -u ssh.service или journalctl -u sshd

Вы можете использовать команду tail, но я лично предпочитаю смотреть через journald, так как это позволяет видеть логи всех служб в одном месте.

# Пример для Ubuntu
sudo tail -f /var/log/auth.log

# Пример для CentOS/RHEL
sudo tail -f /var/log/secure

# Просмотр логов службы systemd в реальном времени
sudo journalctl -u ssh.service -f

Совет: даже на сервере разработки хорошо бы иметь привычку «проверять логи через tail -f» время от времени.

Для более подробного использования journald нажмите "здесь"!


2. Анализ строки лога SSH

Давайте посмотрим на структуру типичной строки лога SSH. (пример для Ubuntu)

2.1 Успешный вход с использованием открытого ключа

Jan 10 12:34:56 myserver sshd[12345]: Accepted publickey for deploy from 203.0.113.10 port 50312 ssh2: ED25519 SHA256:xxxx

Значение каждого элемента:

  • Jan 10 12:34:56: дата, время

  • myserver: имя хоста

  • sshd[12345]: имя процесса (SSH демон) и PID

  • Accepted publickey: авторизация успешна, метод - открытый ключ

  • for deploy: имя учетной записи

  • from 203.0.113.10: исходный IP

  • port 50312: клиентский порт

  • ssh2: ED25519 ...: информация о протоколе/типе ключа

Понимание этого позволяет быстро понять, “кто и откуда вошел с помощью ключа”.

2.2 Неудачная попытка входа по паролю

Jan 10 12:35:01 myserver sshd[12346]: Failed password for root from 198.51.100.23 port 50320 ssh2
  • Failed password: неудачная авторизация по паролю

  • for root: попытка входа с учетной записи root

  • from 198.51.100.23: удаленный IP

Если такие логи записываются десятками - сотнями раз с интервалом в несколько секунд,
это почти наверняка атака методом подбора (brute-force).

2.3 Попытки входа с несуществующим пользователем

Jan 10 12:35:05 myserver sshd[12347]: Invalid user admin from 198.51.100.23 port 50325
  • Invalid user admin: попытка входа с учетной записи admin, которой нет на сервере

Это также распространенный паттерн, используемый автоматизированными ботами.


3. Основные атакующие паттерны по логам



3.1 Атака методом подбора (brute-force)

Характеристики:

  • Логов Failed password возникает очень много за короткое время

  • Несколько десятков - сотен попыток из одного и того же IP

  • Имена учетных записей, такие как root, admin, test, oracle

Быстрая проверка:

# Общее количество неудачных попыток входа
sudo grep "Failed password" /var/log/auth.log | wc -l

# Какая учетная запись чаще всего атакуется
sudo grep "Failed password" /var/log/auth.log \
  | awk '{for (i=1;i<=NF;i++) if ($i=="for") print $(i+1)}' \
  | sort | uniq -c | sort -nr | head

3.2 Сканирование несуществующих пользователей

sudo grep "Invalid user" /var/log/auth.log | head

Если таких логов много, это означает, что проводится сканирование, чтобы выяснить, какие учетные записи могут быть на этом сервере.

3.3 Чрезмерное количество попыток с одного IP

Чтобы проверить, какой IP неудачно пытался войти больше всего:

sudo grep "Failed password" /var/log/auth.log \
  | awk '{print $(NF-3)}' \
  | sort | uniq -c | sort -nr | head

В приведенной команде $(NF-3) обычно указывает на IP в части from <IP>,
но это может немного варьироваться в зависимости от среды, поэтому необходимо адаптировать по вашему формату логов.


4. Поиск аномалий среди «успешных» входов

Атаки в большинстве случаев остаются неуспешными, но настоящая угроза заключается в успешных попытках входа.

4.1 Сбор логов Accepted

sudo grep "Accepted" /var/log/auth.log

На что стоит обратить особое внимание:

  • Вход с учетной записи, которой обычно не используют

  • Вход в нестандартные часы (например, в 3 ночи)

  • IP адреса из неожиданных стран/субсетей (не IP вашего офиса/дома/VPN)

4.2 Просмотр истории входов

Команда last показывает историю последних входов.

# Последние записи SSH
last -i | head

# Неудачные входы (в поддерживаемом окружении)
lastb | head
легко обнаружить "записи о входах, в которые вы не входили".

5. Практический анализ логов: пример быстрой проверки

Предположим, у вас есть один SSH сервер,
создадим рутинную проверку, которую можно выполнить за 5 минут.

5.1 Этап 1: Проверка общего количества неудачных входов

sudo grep "Failed password" /var/log/auth.log | wc -l
sudo grep "Invalid user" /var/log/auth.log | wc -l
  • Если цифры резко возросли, это может указывать на увеличение "интенсивности атак".

5.2 Этап 2: Топ 10 IP адресов с наибольшим количеством атак

sudo grep "Failed password" /var/log/auth.log \
  | awk '{print $(NF-3)}' \
  | sort | uniq -c | sort -nr | head
  • Верхние IP адреса можно добавить в правила брандмауэра/fail2ban.

5.3 Этап 3: Входы, совершенные с использованием root

sudo grep "Failed password for root" /var/log/auth.log | tail
sudo grep "Accepted.*root" /var/log/auth.log
  • Если выводится Accepted, это означает, что вход под root уже был успешным, что очень опасно.

5.4 Этап 4: Обзор последних успешных попыток входа

sudo grep "Accepted" /var/log/auth.log | tail -n 50

Обратите внимание на следующие моменты:

  • Знаю ли я этот IP?

  • Это в обычное время работы?

  • Не появилась ли новая учетная запись?


6. И что нам делать с логами? Применим защитные меры

Если вы уловили запах атаки по логам,
теперь необходимо переходить к настройкам защиты.

6.1 Отключение входа по паролю (только открытые ключи)

В файле /etc/ssh/sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes

После внесения изменений:

sudo systemctl reload sshd
# Или
sudo service ssh restart

Обязательно пройдите тест на вход с открытым ключом, прежде чем отключать пароли.
Иначе вы рискуете оказаться заблокированными сами.

6.2 Запрет прямого входа под root

PermitRootLogin no

Запретите невозможность входа под root напрямую,
лучше входить под обычной учетной записью с последующим использованием sudo.

6.3 Изменение порта (снижение шума)

Port 22    # -> Пример: смените на 2222
  • Изменение порта не делает безопасность «более надежной», но

  • любопытство среди автоматических сканирование/атак будет существенно снижено,
    это позволяет легче выявлять «настоящие аномалии».

6.4 Использование инструментов, таких как fail2ban

fail2ban - это инструмент, который мониторит логи и

  • при неудачных входах

  • с одного и того же IP

  • за короткий промежуток времени

автоматически добавляет правила брандмауэра для их блокировки.

Идея простая:

  1. Мониторить паттерн Failed password в auth.log

  2. При превышении определенного порога блокировать этот IP с помощью iptables/ufw

Таким образом, вы автоматизируете анализ логов и автоматически блокируете атаки brute-force.

6.5 Ограничение SSH-доступа через брандмауэр

Если возможно:

  • Разрешите доступ только из VPN вашей компании или с определенного статического IP 22/tcp (или установленного порта)

  • Блокируйте все остальные

Например, простой пример для ufw

sudo ufw allow from 203.0.113.50 to any port 22 proto tcp
sudo ufw deny 22/tcp

7. Минимальная рутинная проверка логов для разработчика

Если подытожить в реальных условиях, которые может выполнить разработчик,
то достаточно сделать вот это, чтобы значительно повысить уровень безопасности.

C частотой раз в неделю:

  1. Посмотрите количество Failed password, Invalid user за последнюю неделю

  2. Проверьте Топ 10 IP с наибольшим количеством неудачных попыток

  3. В логах Accepted проверьте:

    • Новые IP,

    • Странное время,

    • Неизвестные учетные записи

  4. Заблокируйте подозрительные IP с помощью брандмауэра/fail2ban.

Посмотрев хоть раз, вы обретете ощущение,
“О, этот сервер действительно подвергается атакам каждый день” и
вы будете готовы инвестировать время в настройки безопасности.


Взломщик атакует SSH сервер

Заключение: давайте откроем логи прямо сейчас

Безопасность SSH начинается не с громоздких решений,
а с понимания того, что действительно происходит на моем сервере.

  1. Откройте /var/log/auth.log или /var/log/secure

  2. Читаем по критериям Failed password, Invalid user, Accepted

  3. Если что-то кажется странным, сразу рассмотрите настройки и внедрение брандмауэра и fail2ban.

Если вы прочитали эту статью до конца,
вы теперь готовы избежать "взлома, связанного с отсутствием проверки логов".
Теперь откройте терминал и посмотрите логи сервера.

Для разработчика безопасность - это не опция, а необходимость и рутина.

Нажмите "здесь", чтобы ознакомиться с подробностями использования Fail2ban.