Судя по всему, исправить ksh, сделав невозможным изменение истории, довольно просто. Я видел все рекомендации, чтобы сделать переменные среды HIST * доступными только для чтения, и использование chattr, чтобы сделать файл истории доступным только для добавления (с chattr + a .sh_history).
Bash, однако, имеет две вещи, которые, кажется, делают невозможным предотвращение изменения истории: команда history (с историей -c и history -d) и отделение файла истории от фактической истории выполнения (хранящейся в памяти). . Я также читал здесь о serverfault, что если вы убьете текущую оболочку, история не будет записана.
Есть ли способ предотвратить изменение истории Bash? Я хочу иметь возможность сохранять все пользовательские команды, при этом пользователь не может удалить что-либо из истории вообще.
Также приветствуются любые дальнейшие советы по оболочке Korn. (Я знаю об аудите ksh-93 ... не знаю, можем ли мы его использовать.)
Если вы хотите регистрировать, что делают ваши пользователи, взгляните на любопытный. Он также доступен в виде пакета для установки для CentOS.
Вот решение для отправки всех выполняемых команд на сервер системного журнала.
http://blog.rootshell.be/2009/02/28/bash-history-to-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. Цель состоит в том, чтобы использовать функцию ловушки и вызывать функцию каждый раз, когда пользователь генерирует активность. Функция прерывания (log2syslog) извлечет последнюю команду из истории и записывает ее в системный журнал с помощью команды 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!