Файл .bash_history показывает только команды, которые пользователь ввёл, и только если он не очищал историю. Пользователь может стереть её одной командой и не оставить следов, если только логирование не настроено в месте, к которому у него нет доступа.

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

Рассмотрим способы мониторинга активности пользователей в реальном времени и инструменты, которые надёжнее файла истории из домашнего каталога.

** См. также: [Мониторинг активности пользователей с помощью psacct или acct ]**

1. Просмотр файла истории Bash пользователя

Все команды, которые пользователь выполняет в интерактивной оболочке Bash, обычно сохраняются в скрытый файл .bash_history в его домашнем каталоге.

cat /home/ravi/.bash_history

Так можно увидеть команды, которые пользователь вводил в предыдущих сессиях оболочки.

Однако по умолчанию файл истории не содержит меток времени. Видно, какие команды выполнялись, но не видно, когда именно.

2. Добавление меток времени в историю Bash

Чтобы отображать дату и время для каждой записи в истории, задайте переменную окружения HISTTIMEFORMAT:

export HISTTIMEFORMAT='%F %T '
history

В этом формате используются следующие обозначения:

  • %F показывает дату в формате YYYY-MM-DD.
  • %T показывает время в формате HH:MM:SS.

После этого команда history выводит метки времени рядом с каждой командой, и просматривать активность становится заметно проще.

Чтобы включить такое поведение автоматически для всех пользователей, добавьте следующую строку в /etc/profile или /etc/bash.bashrc:

export HISTTIMEFORMAT='%F %T '

Это повлияет только на новые сессии оболочки после повторного входа пользователей. Важно помнить, что .bash_history нельзя считать надёжным журналом аудита. Файл принадлежит пользователю, поэтому он может очистить его командой history -c, отключить историю, сбросив переменную HISTFILE, или даже отредактировать файл перед выходом из системы.

Метки времени делают историю удобнее для просмотра собственных команд, но они не мешают пользователю удалить или изменить свою историю.

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

** См. также: [Настройка даты и времени для каждой команды в истории Bash ]**

3. Просмотр пользователей, вошедших в систему, и их текущих процессов

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

w

В выводе присутствуют:

  • имена вошедших пользователей;
  • удалённый узел или терминал, с которого выполнено подключение;
  • время входа и время бездействия;
  • команда или процесс, который сейчас выполняется.

Это удобно для быстрой проверки состояния, но нужно помнить, что w показывает только текущее состояние системы. Она не отслеживает активность постоянно и не сохраняет историю команд.

4. Мониторинг команд в реальном времени с помощью Sysdig

Если нужно видеть команды в момент их выполнения, sysdig подходит гораздо лучше. В отличие от истории Bash, он отслеживает системные вызовы в реальном времени, поэтому активность видна сразу.

После установки sysdig выполните:

sysdig -c spy_users

Что означают параметры:

  • sysdig запускает инструмент трассировки системных вызовов.
  • -c spy_users использует встроенный chisel spy_users для отображения интерактивных команд и смены каталогов, выполняемых вошедшими пользователями.

Как только пользователь нажимает Enter, команда сразу появляется на экране. Поэтому sysdig удобен для диагностики и наблюдения за активностью на работающей системе.

5. Запись терминальных сессий пользователей с помощью tlog

Иногда наблюдения за командами в реальном времени недостаточно. Может понадобиться полная запись терминальной сессии пользователя для последующего просмотра. В этом помогает tlog.

tlog записывает терминальные сессии целиком, включая ввод пользователя и вывод терминала, чтобы позже их можно было воспроизвести для аудита или диагностики.

Чтобы вручную запустить запись сессии:

tlog-rec-session

Чтобы воспроизвести записанную сессию:

tlog-play -i session.log

Команды работают так:

  • tlog-rec-session запускает терминальную сессию, которая записывает всё, что пользователь вводит, и всё, что отображается на экране.
  • tlog-play -i session.log воспроизводит записанную сессию с исходным таймингом, поэтому можно точно увидеть, что происходило.

В большинстве production-сред администраторы настраивают tlog через PAM (Pluggable Authentication Modules), чтобы запись запускалась автоматически при входе пользователя, без необходимости вручную запускать tlog-rec-session.

RHEL, Rocky Linux и другие дистрибутивы на базе Red Hat включают tlog в официальные репозитории. Для Debian и Ubuntu инструмент тоже доступен, но его может потребоваться установить вручную.

6. Постоянный аудит с помощью auditd

Если нужен надёжный журнал аудита, который пользователи не могут изменить, подойдёт auditd. Он фиксирует системные события на уровне ядра и сохраняет их в /var/log/audit/audit.log, который обычные пользователи не могут редактировать или удалять.

Чтобы записывать запуск всех программ пользователями в 64-битной системе, добавьте правило аудита:

auditctl -a always,exit -F arch=b64 -S execve

Чтобы посмотреть недавно зафиксированные события запуска программ:

ausearch -m execve -ts recent

Эти команды делают следующее:

  • auditctl -a always,exit -F arch=b64 -S execve добавляет правило, которое записывает каждый системный вызов execve. Он возникает при каждом запуске программы.
  • ausearch -m execve -ts recent ищет в журнале аудита недавно зафиксированные события execve.

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

7. Запись терминальной сессии с помощью script

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

Запуск записи:

script -a session.log

Что означают параметры:

  • -a дописывает данные в существующий файл журнала, а не перезаписывает его.
  • session.log файл, в который сохраняется терминальная сессия.

Всё, что отображается в терминале во время сессии, записывается в файл журнала. Чтобы остановить запись, выполните:

exit

Команда script легковесна и доступна в большинстве дистрибутивов Linux без дополнительной настройки. Однако она записывает только сессии, запущенные вручную.

Для постоянного аудита всей системы или автоматической записи пользовательских сессий лучше подойдут tlog или auditd.

См. также:

  • Советы по усилению безопасности современных Linux-серверов
  • Аудит безопасности Linux-системы с помощью Lynis
  • Лучшие открытые межсетевые экраны для защиты Linux-серверов
  • Практическое руководство по Nmap в Kali Linux

Заключение

История Bash удобна для быстрого просмотра команд, которые выполнял пользователь, но не стоит считать её надёжным журналом аудита, поскольку пользователи могут изменить или удалить её. Для быстрого взгляда на текущую активность команда w показывает, кто вошёл в систему и чем занят.

Если нужен мониторинг в реальном времени, sysdig позволяет видеть команды в момент выполнения. Для долгосрочного аудита и записи сессий tlog и auditd дают заметно более надёжное решение, которое не зависит от истории оболочки пользователя.

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