Как проверить активные SSH‑сессии на удалённом хосте
Важно: некоторые команды могут требовать прав root или sudo, а вывод зависит от конфигурации системы (например, ведётся ли DNS‑резолвинг, сохранение /var/log/wtmp и пр.).

Зачем проверять активные SSH‑сессии
Поддержание доступа к серверу и своевременное обнаружение подозрительных подключений — ключевые задачи администрирования. Регулярный мониторинг SSH помогает:
- выявлять несанкционированные входы;
- обнаруживать подвешенные/зависшие сеансы, расходующие ресурсы;
- собирать данные для аудита и инвентаризации подключений;
- принимать оперативные меры (разрывать соединение, блокировать IP, менять ключи).
Ниже — обзор команд, которые пригодятся для разных сценариев: быстрый осмотр, подробный аудит и поиск исторических подключений.
Быстрый обзор команд (шпаргалка)
- who — кто сейчас вошёл в систему;
- w — доп. информация о процессах пользователей и простое idle‑время;
- last — история входов/выходов по /var/log/wtmp;
- netstat — классический инструмент для сетевых соединений (может быть устаревшим на некоторых дистрибутивах);
- ss — современная замена netstat для работы с сокетами.
Все перечисленные команды удобно комбинировать с grep, awk, sort и sudo.
1. who — кто сейчас в системе
Команда who показывает список вошедших пользователей и терминалы, с которых они подключены. Часто достаточно для быстрого подтверждения наличия SSH‑сессий.
Пример использования:
who
Вывод who обычно содержит имя пользователя, терминал (tty/pts), дату/время входа и исходный адрес. Если нужно показать время последней перезагрузки и информацию о пользователях, можно добавить флаги:
who -b -uПояснение: -b показывает время последней загрузки, -u — показывает время простоя и идентификатор процесса входа.
Когда who даёт недостаточно данных:
- он не покажет детали сокетов и статусы соединений (ESTABLISHED vs LISTEN);
- не даст историю прошлых подключений — смотрите last.
2. w — подробная информация о сессиях
Команда w показывает, кто вошёл в систему, с чего и какие процессы выполняются. Она удобна, чтобы увидеть простые показатели нагрузки от конкретных сессий и время бездействия.
Пример простого вызова:
wТипичный вывод включает заголовок с текущим временем, uptime, количество пользователей и нагрузку на систему и далее строки с именем пользователя, TTY, задачами и командой.
Часто полезные опции w:
| Параметр | Что делает |
|---|---|
| -h, –no-header | Не выводить заголовок |
| -u, –no-current | Игнорировать отображение текущих процессов |
| -s, –short | Короткий вывод (без времени входа, JCPU, PCPU) |
| -f, –from | Включить/отключить поле FROM (адрес источника) |
| –help | Показать справку |
| -v, –version | Показать версию |
Пример: посмотреть короткий вывод с адресами:
w -s -fКогда w особенно полезна:
- нужно увидеть, какие команды выполняют пользователи прямо сейчас;
- требуется оценить, кто влияет на CPU/IO;
- необходимо определить долгие периоды простоя у конкретной учётной записи.
Когда w не помогает:
- если нужно знать точные параметры сетевого соединения (TCP‑статусы), используйте ss/netstat;
- для истории подключений используйте last.
3. last — история входов и выходов
last читает файл /var/log/wtmp (по умолчанию) и показывает журнал входов/выходов. Это основной инструмент, когда нужно понять, кто и когда подключался ранее.
Базовый вызов:
last
Если журнал большой, фильтруйте по признакам «ещё в системе» (still logged in) или по ssh:
last | grep still
last | grep sshПолезные опции last:
| Параметр | Что делает |
|---|---|
| -a, –hostlast | Показывать hostname в последнем столбце |
| -d, –dns | Показывать имена хостов вместо IP (через DNS) |
| -f, –file | Использовать указанный файл вместо /var/log/wtmp |
| -F, –fulltimes | Показать полные даты и времена входа/выхода |
| -i, –ip | Показать IP вместо имени хоста |
Примеры:
last -F -i
last -f /var/log/wtmp.1 | grep usernameОграничения last:
- если ротация логов или очистка /var/log/wtmp — часть истории может быть потеряна;
- не показывает статус сетевого соединения (ESTABLISHED/LISTEN).
4. netstat — классика для сетевых соединений
netstat показывает активные сетевые соединения, таблицы маршрутизации и статистику интерфейсов. На современных дистрибутивах netstat может быть частью пакета net-tools, который устарел в пользу iproute2 и ss, но всё ещё широко используется.
Показать только SSH (обычно порт 22):
netstat -tn | grep :22Параметры:
- -t — TCP;
- -n — не делать обратного DNS‑последнего (быстрее);
- -a — показать все соединения (LISTEN и ESTABLISHED).
Пример для всех соединений с ssh:
netstat -a -n | grep ':22'Ограничение netstat: на новых системах предпочтительнее ss — он быстрее и даёт более детальные данные.
5. ss — современная и быстрая альтернатива
ss (socket statistics) ведёт себя как более быстрый и функциональный аналог netstat. Он показывает детали сокетов, их состояния и связанные процессы.
Показать все соединения, связанные с SSH:
ss -a -n | grep ':22'Фильтрация Established соединений:
ss -a -n | grep ':22' | grep ESTABПолезные флаги:
- -a — все сокеты;
- -n — цифры вместо имён;
- -t — только TCP;
- -p — показать PID/имя процесса (требует root для большинства данных);
- -e — более подробный вывод о состоянии сокета.
Пример с PID:
sudo ss -t -a -p | grep ':22'ss особенно удобен, когда нужно связать соединение с конкретным процессом sshd и увидеть время, TTL, объём данных и состояние сокета.
Дополнительные источники данных и файлы логов
- /var/log/auth.log (или /var/log/secure на RHEL/CentOS) — аутентификация SSH, неудачные попытки, успешные логины;
- journalctl -u sshd — системный журнал службы sshd в systemd‑системах;
- /var/log/wtmp — для last; /var/log/btmp — попытки неуспешных логинов (для lastb).
Пример просмотра последних записей sshd в journalctl:
sudo journalctl -u sshd --since "1 hour ago"Практический рабочий план (SOP) для анализа и реагирования
- Быстрый осмотр (1–2 минуты):
- who
- w -s
- ss -t -a -n | grep ‘:22’ | grep ESTAB
- Исторический анализ (5–10 минут):
- last | grep ssh
- sudo journalctl -u sshd –since “24 hours ago” | tail -n 200
- Если обнаружено подозрительное подключение:
- зафиксировать время, IP и пользователя;
- при необходимости закрыть соединение: найти PID sshd и kill -9 (крайняя мера);
- при массовых попытках — добавить правило в iptables/nftables/Fail2Ban;
- пересмотреть аутентификацию: отключить пароли, включить ключи, сменить ключи, проверить авторизованные ключи в ~/.ssh/authorized_keys.
- Документировать инцидент и, если нужно, собрать дампы сетевого трафика (tcpdump).
Ролевые контрольные списки
Администратор (быстрый чек):
- кто сейчас подключён (who, w);
- есть ли долгие простои (w);
- активные сокеты ssh (ss);
- проверка логов auth/journalctl.
Инженер по безопасности (глубокий аудит):
- история подключений (last, lastb);
- корреляция с firewall/IDS;
- анализ подозрительных IP через «whois», геолокация и репутацию;
- аудит ключей доступа и sudo‑прав.
DevOps (автоматизация):
- встраивание проверок в мониторинг (Prometheus/Alertmanager);
- настроить Fail2Ban или аналог;
- централизованная логировка (ELK/Graylog).
Когда эти методы не сработают (ограничения и контрпримеры)
- Если /var/log/wtmp очищен или недоступен — last ничего не покажет.
- При использовании нестандартных портов SSH проверяйте нужный порт (не только :22).
- Шифрованные и туннелированные подключения (например, VPN/Tor) скрывают исходный IP вплоть до прокси.
- Если атакующий получает root и модифицирует местные инструменты, вывод who/w/ss/netstat может быть подделан — полагайтесь на удалённые журналы и сетевые зеркала.
Лист команд для быстрого копирования (cheat sheet)
who
w -s -f
last | grep still
sudo ss -t -a -p | grep ':22'
netstat -tn | grep ':22'
sudo journalctl -u sshd --since "1 hour ago"
last -F -i
sudo tcpdump -n -s 0 -w capture.pcap port 22Руководство по безопасности и жёсткой настройке SSH
- Отключите логин root по паролю (PermitRootLogin no) и используйте ключи;
- запретите аутентификацию паролем (PasswordAuthentication no);
- ограничьте вход по IP через firewall и AllowUsers/AllowGroups;
- используйте Fail2Ban или эквивалент для автоматической блокировки груб‑форс атак;
- периодически пересматривайте ~/.ssh/authorized_keys и удаляйте неиспользуемые ключи;
- включите двухфакторную аутентификацию для критичных систем, если возможно.
Краткий словарь терминов
- SSH — протокол Secure Shell для защищённого доступа к удалённым системам;
- TTY/PTS — терминальные устройства, pts — псевдотерминал по сети;
- ESTAB/ESTABLISHED — установленное TCP‑соединение;
- wtmp/btmp — системные файлы журнала входов/неудачных входов.
Decision tree для оперативного реагирования (Mermaid)
flowchart TD
A[Найдено подозрительное SSH‑подключение?] -->|Нет| B[Мониторинг]
A -->|Да| C[Собрать данные 'who/ss/journalctl/last']
C --> D{Подключение активно?}
D -->|Да| E[Определить PID и обслуживающую службу]
E --> F[Если аномалия — закрыть соединение, заблокировать IP]
D -->|Нет| G[Проанализировать историю и логи]
G --> H[Оценить риск, обновить правила безопасности]
F --> I[Документировать и сообщить]
H --> IКритерии приёмки
- Можно быстро отобразить список текущих SSH‑пользователей (who/w).
- Можно подтвердить активное TCP‑соединение на SSH‑порту (ss/netstat).
- Можно получить историю логинов за период (last/journalctl).
- При подозрении — можно остановить сеанс и заблокировать IP.
Итог и рекомендации
Регулярный мониторинг SSH‑подключений — простая и эффективная профилактика безопасности. Комбинация who/w для быстрого контроля, last для истории и ss/netstat для сетевой диагностики покрывает большинство задач. Для производства автоматизируйте оповещения, храните журналы централизованно и периодически проводите аудит ключей доступа.
Короткий план действий после обнаружения подозрительного соединения: зафиксировать данные, закрыть соединение при необходимости, заблокировать источник, проверить логи и пересмотреть настройки аутентификации.
Похожие материалы
Исправить ошибку Game Bar — ПК не соответствует требованиям
Диагностика и оптимизация MySQL
Как заблокировать сайт в Google Chrome
Как загрузить видео на YouTube — пошагово
Защита веб‑камеры в Windows 11 — настройка и советы