🛡️ Аудит истории команд в Linux
Обычный history удобен, но в реальной эксплуатации он недостаточен для аудита:
- историю можно очистить (
history -c); - часть команд не попадает в журнал при обрыве сессии;
- команды от
rootи от разных пользователей смешиваются и теряются; - не видно, в каком каталоге и с какого IP выполнялась команда.
Ниже — практичная схема, как превратить историю команд в более надежный аудит.
1) Базовая настройка Bash-истории
Добавьте в ~/.bashrc (или в /etc/bash.bashrc для всех пользователей):
# Размер истории
export HISTSIZE=10000
export HISTFILESIZE=200000
# Формат времени в history
export HISTTIMEFORMAT="%F %T "
# Убираем дубликаты и команды с пробелом в начале
export HISTCONTROL=ignoreboth:erasedups
# Не перезаписывать, а дописывать историю
shopt -s histappend
# Мгновенно сохранять и подгружать историю между сессиями
export PROMPT_COMMAND='history -a; history -n'
Примените изменения:
source ~/.bashrc
2) Логирование каждой команды в syslog/journald
Чтобы команды попадали в системные журналы, добавьте в ~/.bashrc:
export PROMPT_COMMAND='\
RET=$?; \
logger -p local6.notice -t bash_audit \
"user=$USER uid=$UID pwd=$PWD ip=${SSH_CLIENT%% *} cmd=$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")"; \
history -a; history -n'
Что это дает:
- фиксируется пользователь и
uid; - фиксируется рабочий каталог (
pwd); - для SSH-сессий фиксируется IP-адрес;
- команда уходит в
journald/rsyslogи ее сложнее «потерять», чем обычный~/.bash_history.
[!IMPORTANT] Если у вас уже есть
PROMPT_COMMAND, объединяйте команды аккуратно, чтобы не потерять существующую логику.
3) Настройка rsyslog для отдельного файла аудита
Создайте файл /etc/rsyslog.d/50-bash-audit.conf:
local6.* /var/log/commands.log
& stop
Перезапустите rsyslog:
sudo systemctl restart rsyslog
Права на журнал:
sudo touch /var/log/commands.log
sudo chown root:adm /var/log/commands.log
sudo chmod 640 /var/log/commands.log
Проверка:
tail -f /var/log/commands.log
4) Защита от очистки истории
Минимальные меры защиты:
# Только добавление в файл, не удаление
chattr +a ~/.bash_history
# Запретить пользователю менять HISTFILE (опционально)
readonly HISTFILE
readonly HISTSIZE
readonly HISTFILESIZE
Снять атрибут при необходимости:
chattr -a ~/.bash_history
[!TIP] Атрибут
+aработает только на поддерживаемых ФС (например, ext4) и не заменяет централизованный аудит.
5) Просмотр аудита
Полезные команды:
# Через journald
journalctl -t bash_audit -S today
# Через файл rsyslog
grep "user=" /var/log/commands.log | tail -n 50
# По конкретному пользователю
grep "user=root" /var/log/commands.log
6) Ограничения и best practice
- Это аудит оболочки Bash, а не всего ОС-события.
- Команды, выполненные вне Bash (например, через бинарники/скрипты напрямую), могут не попасть в такой журнал.
- Для повышенных требований используйте
auditd+ централизованный сбор логов (SIEM/ELK/Graylog).
Рекомендуемый минимум в проде:
historyс таймстампами иhistappend.- Отправка команд в
journald/rsyslog. - Ротация
/var/log/commands.logчерезlogrotate. - Централизованная отправка логов на отдельный сервер.
Короткий чек-лист
- Настроены
HISTSIZE,HISTFILESIZE,HISTTIMEFORMAT. - Включен
histappend. - Настроен
PROMPT_COMMANDсhistory -a; history -n. - Команды пишутся в
journald/rsyslog. - Есть отдельный лог
/var/log/commands.logи корректные права. - Включена ротация логов.