Назад | Перейти на главную страницу

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

Судя по всему, исправить 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!