Предотвращение изменения истории 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.