Взлом редко выглядит как в кино. Чаще это неизвестный процесс, который съедает процессор, жалоба на рассылку спама или странные исходящие соединения. Действуйте спокойно и по порядку.
Признаки
- Процессор загружен на 100 % процессом с незнакомым или «системным» именем — часто это майнер.
- Пришла жалоба (abuse) на атаки, сканирование или спам с вашего IP.
- В authorized_keys появились чужие ключи, в системе — новые пользователи.
- Появились неизвестные задачи cron или службы systemd.
- Изменились файлы сайта: вставки со ссылками, незнакомые PHP-файлы в папке загрузок.
Первые действия
- 01Не удаляйте ничего сразу — сначала соберите информацию: она поможет понять, как произошёл взлом.
- 02Если с сервера идёт атака или рассылка, остановите её: выключите сервер в панели или закройте исходящий трафик фаерволом. Работать с выключенным сервером можно через VNC-консоль после запуска.
- 03Смените пароли и ключи, которые хранились на сервере или использовались для входа: root, базы данных, API-ключи сторонних сервисов, токены деплоя.
- 04Если пришло уведомление о нарушении, ответьте в тикете: что случилось и что вы делаете. На ответ отводится 24 часа.
Сбор информации
$ last -a | head -30$ lastb -a | head -30$ journalctl -u ssh --since "7 days ago" | grep -i accepted$ ps auxf --sort=-%cpu | head -20$ ss -tunap$ cat /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys$ grep -v nologin /etc/passwd$ for u in $(cut -d: -f1 /etc/passwd); do crontab -l -u "$u" 2>/dev/null | sed "s/^/$u: /"; done$ ls -la /etc/cron.* /etc/cron.d$ systemctl list-timers --all$ systemctl list-units --type=service --state=running$ find /etc /usr/local /var/www -mtime -7 -type f | head -100Восстановление
Найти и вычистить все закладки злоумышленника почти невозможно: он мог подменить системные утилиты. Надёжный путь один — чистая система.
- 01Сохраните данные, которые нужно перенести: базы данных, загруженные пользователями файлы, конфиги. Код сайта лучше взять из репозитория, а не с заражённого сервера.
- 02Переустановите систему из панели: «Переустановить» на странице сервера. Все данные на диске будут удалены.
- 03Сразу закройте доступ: SSH только по ключам, фаервол, обновления.
- 04Восстановите данные, проверив их на вставки и незнакомые файлы. Обновите CMS, плагины и зависимости до актуальных версий.
Как снизить риск
- Вход по SSH только по ключам, root без пароля.
- Фаервол: наружу открыты только нужные порты. Базы данных и Redis — только на localhost.
- Автоматические обновления безопасности и своевременные обновления CMS.
- Резервные копии вне сервера с проверкой восстановления.