Есть одиночная VPS, где крутятся сайты. Доступ к исходникам по SFTP. Разработчики попросили сделать SSH доступ. На всякий случай решил добавить сохранение набранных консольных команд. Решений этой задачи много. Я в своё время делал подборку.
Мне не захотелось ставить какие-то сторонние программы. Централизованной системы управления нет. Поэтому рассматривал 2 варианта, которые я уже раньше использовал:
▪️Через настройку PROMPT_COMMAND
▪️С помощью auditd
Последнее более целостное и надёжное решение. Но лично мне не нравится смотреть логи auditd. Очень ненаглядно, много лишнего. Постоянно вспоминать надо, как сделать выборку, чтобы что-то найти. Решил в итоге использовать первый вариант.
Для этого пользователю, чьи команды мы будем сохранять, добавляем в
~/.bashrc:export PROMPT_COMMAND='EX_CODE=$?; logger -p local6.debug "{\"user\":\"$(whoami)\",\"path\":\"$(pwd)\",\"command\":\"$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")\", \"status\":\"$EX_CODE\"}";'Тут всё просто. Используем возможности bash в виде PROMPT_COMMAND. Значение этой переменной выполняется каждый раз перед появлением приглашения на ввод команды в оболочке. То есть вы ввели какую-то команду, она выполнилась, отработала команда в PROMPT_COMMAND и снова появилось приглашение на ввод. В этот момент мы просто используя logger записываем в системный лог некоторые переменные и очищенный вывод команды
history 1, которая выводит последнюю введённую команду. В итоге получаем то, что надо.Выведем эти логи в отдельный лог-файл. Для этого добавляем конфигурацию в rsyslog. Создаём файл
/etc/rsyslog.d/command-audit.conf:# cat > /etc/rsyslog.d/command-audit.conf <<'EOF'local6.debug /var/log/command-audit.logEOFПерезапускаем rsyslog:
# systemctl restart rsyslogЗаходим пользователем по SSH, что-то делаем в консоли и смотрим результат в файле
/var/log/command-audit.log:2026-10-01T20:03:43.038407+03:00 debian13 devbitrix01: {"user":"devbitrix01","path":"/var/www","command":"free -m", "status":"0"}
2026-10-01T20:03:47.192911+03:00 debian13 devbitrix01: {"user":"devbitrix01","path":"/var/www","command":"htop", "status":"0"}Мне нравится такой формат - просто и наглядно. Ещё и в json сразу обёрнут. У обычного пользователя доступа к этому логу нет, изменить он его не сможет. При желании этот лог легко отправить в централизованное хранилище с помощью любого сборщика логов (vector, alloy и т.д.), если оно используется.
Ничего дополнительно на сервер ставить не надо, что очень удобно. Я не люблю донастраивать и что-то менять в уже введённых в эксплуатацию серверах. Обычно все подобные вещи делаю сразу в момент настройки, чтобы можно было всё проверить.
☝️ Важно понимать, что этот аудит легко отключить самим пользователем, или просто обойти. Он банально может обнулить переменную PROMPT_COMMAND. То есть это не инструмент повышения безопасности, а скорее просто модернизированная версия history для удобства пользователей, особенно если их несколько и администратора.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#ssh #webserver
