🛡️ Аудит истории команд в Linux

Platform Category

Обычный history удобен, но в реальной эксплуатации он недостаточен для аудита:

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


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'

Что это дает:

[!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

Рекомендуемый минимум в проде:

  1. history с таймстампами и histappend.
  2. Отправка команд в journald/rsyslog.
  3. Ротация /var/log/commands.log через logrotate.
  4. Централизованная отправка логов на отдельный сервер.

Короткий чек-лист