Очень часто администраторы дают пользователям выполнять некоторые команды с повышенными привелегиями с помощью инструментов вроде sudo или doas. Часто даже не имея прав суперпользователя пользователь может нанести определённый ущерб работающим сервисам. Поэтому в пообных случаях желательно иметь лог команд для последующего анализа инцидентов.
Хорошим решением для логирования команд является инструмент snoopy, выполненный в виде библиотеки, вещающей хук на определённые системные вызовы и логирующей их.
В Ubuntu для установки snoopy надо использовать команду:
sudo apt install snoopy
В процессе установки будет предложено сразу включить snoopy. Если понадобится изменить эти настройки то необходимо использовать команду:
dpkg-reconfigure snoopy
Кроме того можно вручную отредактировать файл "/etc/ld.so.preload", добавив/удалив строку с указанием полного пути к библиотеке "libsnoopy.so". После изменения настроек необходимо перезагрузить компьютер.
По умолчанию snoopy пишет сообщения в journald. Это не всегда удобно, да и формат записи по умолчанию несколько избыточен. Поэтому скорее всего вы захотите настроить snoopy. Настройки хранятся в файле "/etc/snoopy.ini" и после изменения файла сразу вступают в силу.
Файл содержит очень подробные комментарии, которых достаточно чтобы самостоятельно настроить snoopy по своему желанию. Но мы всё же рассмотрим небольшой пример конфигурации.
Что мы хотим: убрать лишнюю информацию из строк логов и логировать только команды из терминала (команды выполняемые демонами вроде cron нам не нужны). Для этого необходимо привести файл конфигурации к виду:
[snoopy] ; Формат строки в логе message_format = "[login: %{login}, %{tty_username} as %{eusername}]: %{cmdline}" ; Фильтр событий filter_chain = "only_tty"
Сразу после этого лог начнёт наполняться. Просмотреть его можно командой:
journalctl -xe -t snoopy
Вывод будет выглядеть примерно вот так:
авг 30 17:32:08 server snoopy[323]: [login: moose, moose as moose]: -bash авг 30 17:32:08 server snoopy[326]: [login: moose, moose as moose]: cat /home/moose/.ssh/known_hosts авг 30 17:32:10 server snoopy[334]: [login: moose, moose as moose]: free -m авг 30 17:32:12 server snoopy[336]: [login: moose, moose as moose]: df -h авг 30 17:32:14 server snoopy[337]: [login: moose, moose as moose]: sudo su - авг 30 17:32:14 server snoopy[338]: [login: moose, moose as root]: su - авг 30 17:32:14 server snoopy[347]: [login: moose, moose as root]: groups авг 30 17:32:14 server snoopy[349]: [login: moose, moose as root]: lesspipe авг 30 17:32:14 server snoopy[350]: [login: moose, moose as root]: basename /usr/bin/lesspipe авг 30 17:32:14 server snoopy[352]: [login: moose, moose as root]: dirname /usr/bin/lesspipe авг 30 17:32:14 server snoopy[354]: [login: moose, moose as root]: dircolors -b авг 30 17:32:14 server snoopy[355]: [login: moose, moose as root]: mesg n авг 30 17:32:17 server snoopy[356]: [login: moose, moose as root]: ps aux авг 30 17:32:22 server snoopy[357]: [login: moose, moose as root]: journalctl -xe -t snoopy
Следует иметь ввиду что в логи всё равно попадает достаточно много мусора. Это связано с тем что при логин пользователя выполняется достаточно большой набор команд из файлов вроде "~/.bashrc". Но в любом случае такой журнал будет очень полезен при расследовании инцидентов.
На этом всё. Приятной работы!