Ваш VDS под угрозой: 53 000 попыток взлома за 5 дней

Представьте, что вы развернули новый виртуальный сервер (VDS) для тестирования, разработки или автоматизации рутинных задач. Возможно, это простой веб-сервер на Nginx, пара скриптов в cron и доступ по SSH. Вам кажется, что ваш сервер, будучи «незначительным», не привлечет внимания злоумышленников. Однако реальность такова, что с момента получения нового IP-адреса в интернете ваш VDS становится мишенью для автоматизированных атак, которые начинаются практически мгновенно.

Имея двухлетний опыт работы в технической поддержке облачного хостинга, а затем в CleverData (часть холдинга LANSOFT), я неоднократно сталкивался с последствиями взломов серверов клиентов — от внедрения майнеров до полного уничтожения данных без возможности восстановления. Этот опыт подтолкнул меня к более глубокому изучению механизмов атак.

Шокирующая статистика: десятки тысяч атак на новый VDS

Однажды, из чистого любопытства, я решил проверить логи безопасности только что созданного VDS, который проработал всего пять дней. Результат меня поразил:

$ grep "Failed password" /var/log/auth.log | wc -l
53732

Команда grep "Failed password" /var/log/auth.log ищет все строки, содержащие фразу «Failed password» (неудачная попытка ввода пароля), в файле системных аутентификационных логов /var/log/auth.log. Результат затем передается команде wc -l, которая подсчитывает количество строк. Таким образом, эта простая комбинация позволяет узнать общее число неудачных попыток входа по SSH.

Более 53 000 неудачных попыток входа за пять дней! Каждая такая запись означает попытку подбора логина и пароля к серверу через SSH. Автоматизированные боты, брутфорс-скрипты и сетевые сканеры постоянно патрулируют интернет, выискивая новые IP-адреса и открытые порты, чтобы немедленно начать атаки. Этот случай наглядно показал, что даже «никому не нужный» сервер становится объектом целенаправленного воздействия.

Эксперимент: Динамика атак на чистый VDS в реальном времени

Заинтересовавшись скоростью и интенсивностью обнаружения новых серверов в интернете, я решил провести более контролируемый эксперимент. Я развернул абсолютно новый, «чистый» VDS с предустановленными настройками SSH по умолчанию, чтобы отслеживать динамику атак с момента его запуска.

Настройка мониторинга

Для мониторинга я выбрал файл /var/log/auth.log, куда записываются все события, связанные с аутентификацией, включая неудачные попытки входа по SSH. Простейший способ наблюдать за логами в реальном времени — использовать команду tail -f /var/log/auth.log.

Однако для более детального анализа мне требовался скрипт, который бы не только показывал новые записи, но и фильтровал их, подсвечивая ключевую информацию: IP-адрес атакующего, страну происхождения, имя пользователя, которое пытались подобрать, и время атаки. Для определения страны по IP-адресу я установил пакет geoip-bin:

sudo apt install geoip-bin

Затем я использовал утилиту geoiplookup, которая сопоставляет IP-адреса с базой данных GeoIP.

Мой простейший Bash-скрипт для мониторинга выглядел так:

#!/bin/bash

tail -f /var/log/auth.log | grep --line-buffered "Failed password" | while read line; do
  ip=$(echo $line | grep -oP '\d+\.\d+\.\d+\.\d+')
  user=$(echo $line | grep -oP 'for \K[^ ]+')
  time=$(echo $line | cut -d' ' -f1-3)
  country=$(geoiplookup $ip | grep -oP 'GeoIP Country Edition: \K.*' || echo "Unknown")
  echo "[ALERT] $time | IP: $ip | Country: $country | Attempted user: $user"
done

Разберем скрипт по шагам:

  • tail -f /var/log/auth.log: Выводит новые строки из файла логов в реальном времени.
  • grep --line-buffered "Failed password": Фильтрует только те строки, которые содержат «Failed password», и буферизирует вывод построчно.
  • while read line; do ... done: Обрабатывает каждую отфильтрованную строку.
  • ip=$(echo $line | grep -oP '\d+\.\d+\.\d+\.\d+'): Извлекает IP-адрес из строки лога с помощью регулярного выражения.
  • user=$(echo $line | grep -oP 'for \K[^ ]+'): Извлекает имя пользователя, которое пытались использовать для входа.
  • time=$(echo $line | cut -d' ' -f1-3): Извлекает временную метку из начала строки лога.
  • country=$(geoiplookup $ip | grep -oP 'GeoIP Country Edition: \K.*' || echo "Unknown"): Определяет страну по IP-адресу с помощью geoiplookup. Если определение не удалось, выводит «Unknown».
  • echo "[ALERT] ...": Выводит отформатированное сообщение с ключевой информацией об атаке.

Результаты эксперимента

Первые попытки проникновения начались практически сразу после запуска сервера. Динамика атак оказалась ошеломляющей:

  • Первые 7 часов жизни сервера:
    $ sudo grep "Failed password" /var/log/auth.log | wc -l
    2847

    За менее чем полдня сервер столкнулся почти с тремя тысячами попыток взлома.

  • Через сутки после запуска:
    $ sudo grep "Failed password" /var/log/auth.log | wc -l
    42799

    Менее чем за 24 часа количество атак превысило 42 тысячи. Это свидетельствует о невероятно высокой активности ботнетов, которые сканируют интернет и мгновенно реагируют на появление новых целей.

Эти результаты наглядно демонстрируют, что вопрос защиты вашего VDS-сервера не является второстепенным или отложенным. Атаки начинаются немедленно, и ваш сервер нуждается в адекватной защите с первых минут своего существования. Игнорирование базовых мер безопасности может привести к серьезным последствиям, даже если вы считаете свой сервер «неважным».