Найти следы взлома Linux-сервера

Опубликовано:
Автор:

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

Пользователи ОС

Смотрим список пользователей сервера

cat /etc/passwd

Убеждаемся, что только один пользователь имеет идентификатор пользователя UID (третье значение в каждой строке) равный 0.

Смотрим файл паролей пользователей сервера

cat /etc/shadow

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

sudo passwd root

Пароли должны быть длинными и сложными.

Проверяем историю входа пользователей ОС (показать последние 20 входов)

last -20

Смотрим, кто, когда и с какого IP заходил и пытаемся понять, есть ли взломщик. Вход одного пользователя с разных IP может быть признаком взлома.

Чтобы посмотреть все входы конкретного пользователя, нужно выполнить (user нужно заменить на имя пользователя)

last user

Для каждого пользователя смотрим файл ~/.ssh/authorized_keys и убеждаемся, что в них нет чужих ключей.

Для каждого пользователя смотрим историю команд и ищем что-то подозрительное (перейти в конец истории: Shift + G)

history | less
MySQL

Подсоединяемся к MySQL и убеждаемся, что внешнее соединение с базами данных отсутствует (если вам не требуется внешнее соединение).

$ mysql -u root -p
mysql> SELECT user, host FROM mysql.user;

Точнее посмотреть привилегии пользователя можно так

SHOW GRANTS FOR 'user'@'localhost';

Если необходимо для каждого mysql-пользователя меняем пароль

SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass');
Открытые порты

На другом сервере с Linux устанавливаем, уважаемую взломщиками, утилиту nmap и сканируем открытые порты

nmap xxx.xxx.xxx.xxx

В результате получаем, например, так

Starting Nmap 7.80 ( https://nmap.org ) at 2021-02-19 22:05 +06
Nmap scan report for site.ru (000.000.000.000)
Host is up (0.087s latency).
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Убеждаемся, что не открыто «лишних» портов, через которые можно повторно взломать сервер. Под «лишними» понимаются открытые порты, которые не нужны для целей сервера. filtered означает, что nmap не может определить, является ли порт открытым или закрытым.

Открытые порты можно посмотреть и на самом проверяемом сервере, выполнив (ss улучшенный аналог netstat)

sudo ss -tulpn

Смотрим открытые для внешнего обращения порты.

Изменённые системные файлы

Ищем файлы в системных каталогах, содержимое или атрибуты которых изменялись за последние дни. Например, ищем в каталоге /etc за последние 10 дней и показываем подробную информацию колонками

sudo find /etc -type f -ctime -10 -exec ls -ltc '{}' + | column -t | less

Можно искать файлы в диапазоне дат (от и до). Например, ищем файлы, измененные не раньше 10 дней, но не позднее 7 дней, результат записываем в файл changed.txt

find /etc -type f -ctime +7 -ctime -10 -exec ls -ltc '{}' + > changed.txt

Подробнее об атрибутах файла можно посмотреть командой stat

stat /etc/nginx/nginx.conf

Дополнительно смотрите Структура каталогов в системе Linux

Что дальше?

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

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