Вопрос или проблема
Если я вошёл в систему как root
, как я смогу увидеть историю других пользователей. Я пытался использовать su -c
, но команда history не возвращает ничего. Например, если я выполню следующую команду от имени root:
root@server:#su -c 'who am i' user1
user1 pts/0 2019-08-12 10:30
root@server:#su -c 'history' user1
эта команда ничего не возвращает.
Я хочу увидеть временные метки в истории пользователя, что невозможно, просто просмотрев /home/user1/.bash_history
, и именно поэтому я хочу использовать команду history, чтобы получить вывод с временными метками.
Единственное место, где bash по умолчанию хранит историю команд, – это .bash_history
, и в этом файле временные метки не сохраняются. Когда история загружается из файла истории, она загружается с временной меткой, когда оболочка была запущена.
Я не совсем уверен, почему выполнение history
из su
не работает, но это не имеет значения. Вы не увидите ничего, что бы вы не могли получить, просмотрев файл истории пользователя напрямую.
Я хочу увидеть временные метки в истории пользователя, что невозможно, просто просмотрев
/home/user1/.bash_history
Временные метки могут или не могут быть в этом файле. Больше нигде (если пользователь намеренно не использовал другой файл; я предполагаю, вы определили правильный файл). Из man 1 bash
:
HISTTIMEFORMAT
Если эта переменная установлена и не пуста, её значение используется как строка формата дляstrftime(3)
, чтобы распечатать временную метку, связанную с каждой записью истории, отображаемой встроенной командойhistory
. Если эта переменная установлена, временные метки записываются в файл истории, так что они могут сохраняться между сеансами оболочки. Это использует символ комментария истории для различения временных меток от других строк истории.
Если user1
имел переменную, установленную и не пустую (например, HISTTIMEFORMAT="%F %T: "
), записи в /home/user1/.bash_history
выглядели бы так:
#1568346641
ls -hls /
где число 1568346641
– это “секунды с 1970-01-01 00:00:00 UTC
” (как в date +%s
, см. man 1 date
). Это те временные метки, которые вы ищете. Если в файле нет таких записей, то уже слишком поздно: информация о временной метке не была сохранена, она потеряна.
На практике вы можете выполнить следующее:
# как root
cp /home/user1/.bash_history /root/user1_history
chmod -w /root/user1_history
HISTFILE="/root/user1_history"
HISTTIMEFORMAT="%F %T: "
history -c
history -r
history | less
(Последняя команда начинается с пробела, поэтому её не сохранят в текущей истории, которую вы собираетесь увидеть).
Если в файле есть временные метки, вы увидите их в читаемой форме (в соответствии с HISTTIMEFORMAT
, который мы использовали). Отсутствующие временные метки будут заменены временем, когда ваша текущая оболочка была запущена, и вы ничего не сможете с этим сделать.
Обратите внимание, что /home/user1/.bash_history
не является надежным способом увидеть, что делал пользователь. Пользователь мог:
- использовать другую оболочку,
- использовать другой файл,
- решить не сохранять файл,
- заставить оболочку не запоминать определенные команды,
- подделать “контрафактный” файл.
В зависимости от того, что вы хотите найти, возможно, вам повезет с /var/log/auth.log
(Debian и подобные) или /var/log/secure
(некоторые другие дистрибутивы, как я полагаю). В моем Debian я могу видеть в логах, кто (и когда) запускал sudo vipw
или sudo bash
, но я не могу видеть команды, которые они вызвали в оболочке, запущенной с помощью sudo bash
. Есть решения, которые могут помочь (например, auditd
), но их нужно настраивать заранее.
history
– это встроенная команда bash, которая может извлекать:
- команды, выданные в этой самой сессии bash (так что для недавних команд её нужно запускать из процесса оболочки, который выдал команды).
- команды, выданные в предыдущих, завершенных сеансах, с использованием файла
~/.bash_history
. Это предполагает, что эти команды были сохранены в истории (но это можно отключить, не устанавливая переменную HISTFILE(*)). Кроме того, насколько я знаю, история текущей сессии добавляется в файл истории только когда оболочка завершается.
Другими словами, просмотр файла истории дает вам возможность увидеть команды, выданные в относительно далеком прошлом, и вы не можете увидеть команды, выданные в текущей работающей сессии.
(*) На практике это не сильно ограничивает, большинство запросов на команды сделаны в текущей сессии.
Ответ или решение
Как администратор системы, работающий под учетной записью root, вы можете столкнуться с необходимостью отслеживания действий обычных пользователей. В данной статье мы обсудим методы, позволяющие вам увидеть историю команд, выполненных пользователем, а также ограничения, связанные с этим процессом.
1. Понимание механизма хранения истории
Bash, по умолчанию, сохраняет историю выполненных команд в файле ~/.bash_history
для каждого пользователя. Однако этот файл не содержит временных меток по умолчанию. Для того чтобы хранить временные метки команд в истории, необходимо установить переменную окружения HISTTIMEFORMAT
.
Пример установки переменной:
export HISTTIMEFORMAT="%F %T: "
При активированной переменной, временные метки будут добавляться в файл истории в виде строк, начинающихся с символа решетки (#
).
2. Просмотр истории других пользователей с временными метками
Попробуйте выполнить следующие шаги:
-
Скопируйте файл истории пользователя:
cp /home/user1/.bash_history /root/user1_history
-
Установите права, чтобы файл не мог быть изменен:
chmod -w /root/user1_history
-
Установите переменную
HISTFILE
иHISTTIMEFORMAT
:HISTFILE="/root/user1_history" HISTTIMEFORMAT="%F %T: "
-
Отключите текущую историю и загрузите вашу сохраненную историю:
history -c history -r
-
Теперь вы можете просмотреть историю с человечными временными метками:
history | less
3. Ограничения и альтернативы
Заметьте, что:
- История интерактивных сессий: Команда
history
работает только на текущем сеансе Bash. Если пользователь все еще активен, вы не сможете видеть его команды. - Файлы истории могут отсутствовать: Пользователь мог выбрать не сохранять историю (например, сбросив переменную
HISTFILE
). - Различные оболочки: Если пользователь использует другую оболочку (например, zsh или fish), команда history не подойдет.
- Логи системы: Для внешнего мониторинга операций пользователей вы можете просмотреть системные логи, такие как
/var/log/auth.log
или/var/log/secure
, чтобы увидеть, какие команды были выполнены с правами superuser.
4. Установка аудита
Для более надежной регистрации команд и действий пользователей, рекомендуется рассмотреть применение инструмента auditd
. Это позволяет отслеживать действия по заданным правилам и предоставляет детализированные отчеты о выполненных пользователем командах.
Заключение
Просмотр истории команд пользователей из-под root является сложной задачей, учитывающей множество факторов. Важно помнить о правилах конфиденциальности и законодательства. Используйте предложенные методы, чтобы обеспечить выполнение задач, связанных с безопасностью в вашей среде.