Предотвращение изменения истории bash (и ksh) в Linux

Судя по всему, исправить ksh, чтобы сделать невозможным изменение истории, довольно легко. Я видел все рекомендации, чтобы сделать переменные среды HIST* доступными только для чтения, и использование chattr, чтобы сделать файл истории доступным только для добавления (с chattr + a.sh_history).

Однако в Bash есть две вещи, которые делают невозможным предотвращение изменения истории: команда истории (с историей -c и историей -d) и отделение файла истории от фактической истории времени выполнения (хранящейся в памяти), Я также прочитал здесь, на serverfault, что если вы убьете текущую оболочку, то история не будет записана.

Есть ли способ предотвратить изменение истории Bash? Я хочу иметь возможность сохранять все пользовательские команды без возможности удалить что-либо из истории.

Любые дальнейшие советы по оболочке Korn также приветствуются. (Я знаю об аудите ksh-93... не знаю, сможем ли мы его использовать.)

2 ответа

Решение

Вот решение для отправки всех команд, выполненных на сервер системного журнала.

http://blog.rootshell.be/2009/02/28/bash-history-to-syslog/

Выписка из поста в блоге

Вот два способа отправить копию всех команд, выполненных пользователями, на сервер Syslog. Первый будет использовать функцию "ловушки" Bash. Второй патч для применения в исходном коде Bash.

Используя ловушку

Просто добавьте следующие строки в ваш /etc/profile:

function log2syslog
{
   declare command
   command=$(fc -ln -0)
   logger -p local1.notice -t bash -i — $USER : $command
}
trap log2syslog DEBUG

/etc/profile анализируется и выполняется при запуске Bash. Цель состоит в том, чтобы использовать функцию прерывания и вызывать функцию каждый раз, когда пользователь генерирует активность. Функция trap (log2syslog) извлекает последнюю команду из истории и записывает ее в Syslog с помощью команды logger. Очень легко реализовать, но этот метод:

spawns new process at each command logged (can have a negative effect when the server activity is high)
is not transparent to the user (regular users can’t edit /etc/profile but can read it!)

Вот почему второй метод будет предпочтительным.Использование патча

Метод заключается в применении патча к исходному дереву Bash и перекомпиляции оболочки. Это требует среды с компилятором и исходным кодом, но этот метод будет использовать меньше ресурсов процессора и будет полностью прозрачным!

Пример патча доступен здесь. Требуется пять минут, чтобы вручную применить патч к исходному дереву Bash 4.

Вот пример сообщения системного журнала:

Feb 27 19:30:51 honey bash: HISTORY: PID=21099 UID=1000 echo foo!

Если вы хотите регистрировать, что делают ваши пользователи, взгляните на Snoopy. Он также доступен для установки в CentOS.

Другие вопросы по тегам