Как добавить данные подключения к сети или источнику пользователя в записи истории?

8

Я хотел бы изменить настройки истории для всех пользователей в системах, которыми я управляю. Я хотел бы, чтобы он содержал информацию от соединительного терминала, как изwho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

В настоящее время я изменяю свою историю следующими способами. Я знаю, что многие из этих настроек были рассмотрены здесь несколько раз. Однако я давно вытащил этот код из « Рецептов системного администрирования Linux»: Джульетта Кемп .

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend устраняет проблему, когда у вас есть несколько открытых терминалов, информация может быть потеряна.

PROMPT_COMMAND='history -n;history -a' расширяется, чтобы в режиме реального времени добавлять в историю несколько терминалов.

HISTSIZE=100000 HISTFILESIZE=100000 продлевает срок historyхранения

HISTTIMEFORMAT="%m/%d/%y %T «Предисловие каждой строки истории с отметкой времени

Что вы обычно получаете с history

835  ls
836  cd ..

Мои измененные текущие historyрезультаты

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

Возвращение из historyя хотел бы видеть

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

Я не "женат", чтобы увидеть DNSимя. Я бы хотел, чтобы он был там только в том случае, если он извлекает его из whoдругого места, не выполняя поиск или запрос любого рода. Я был бы счастлив с IP-адресом.

002  03/26/12 05:11:30  192.168.0.2    ll

Почему? Я управляю несколькими системами с идентификатором пользователя, который совместно используют несколько пользователей одной группы для выполнения своих повседневных задач. Это позволило бы мне соотнести их реальное местоположение и фактического пользователя в организации с тем, что они делали в истории.

Я знаю, что это не оптимально, и хотел бы изменить его, но, когда вы находитесь на корабле размером с круизный лайнер, вы не пытаетесь сделать крутые повороты. (Примечание: когда вы делаете это, пассажиры пытаются выбросить вас за борт)

В любом случае, пока я не смогу перевести их на лучшее решение, мне бы хотелось иметь эту возможность отслеживания.

Кроме того, если у вас есть какие-либо рекомендации относительно того, что я в настоящее время использую для своих historyмодификаций, я хотел бы услышать это.

Спасибо,

Редактировать: 1

Я не хочу запускать другие программы или настраивать что-либо дополнительно «в пределах разумного».

Я хочу добавить 0накладные расходы, если я должен добавить, он должен быть маленьким.

Я действительно доверяю своим пользователям. Я просто хотел бы (если что-то случится) увидеть, кто из, скажем, 10 пользователей, вошедших в систему с одним и тем же пользователем: пароль сделал это. Или, возможно, это был не пользователь, он мог быть забыт cronв системе, которая выполняет подключение как пользователь, чтобы что-то сделать. Или приложение Ex: BMC Control-Mподключается sshи выполняет задачи. Это не столько поиск "плохих пользователей", сколько возможность найти его с минимальными усилиями.

Изменить 2:

Системы работают на SLES и RHEL

2bc
источник
1
Похоже, учет процессов может быть полезным. История оболочки никогда не была предназначена для регистрации, и если вы хотите использовать ее, вы должны доверять всем своим пользователям. Смотрите соответствующий вопрос о мониторинге деятельности и соответствующий ответ .
jw013
@ jw013 Спасибо за комментарий. Однако, это должно быть настроено и управляться, плюс я дал информацию, которую я прочитал, я был бы лучше всего исключать каталоги как /proc /devи пользовательские /homeкаталоги. Это добавляет накладные расходы. Принимая во внимание, historyчто уже записывается, и информация об их соединении известна системе, соединяющей IP и т. Д. ... Эта информация, если она еще не доступна "статически", может быть установлена ​​таким образом или сохранена в переменной или файле и введена в historyзаписи и снижение производительности будет очень маленьким или 0.
2
Если это в Linux, подумайте об использовании auditd. Я не уверен, что его журналы дадут вам достаточно информации. Сложность того, что вы хотите, заключается именно в том, почему общие учетные записи так осуждены.
Жиль "ТАК ... перестать быть злым"
Это на Linux, я отредактирую свой вопрос, чтобы прояснить это. auditdочень похоже, что inotifyвы должны сказать ему, что следить за изменениями. Отдельные файлы, каталоги и т. Д. Я не хочу переходить на этот уровень конфигурации. На самом деле (я делаю), но по сути дела это не волнует. Я должен puppetсправиться с этим. auditdпоставляется с дополнительной нагрузкой и временем для настройки. Если учетная запись изменяет что-то, я все же хотел бы оглянуться назад в истории и посмотреть, кто или что входит в систему и пытается.
2
2
хм, так как PROMPT_COMMAND=просто запускает обычные команды перед следующим приглашением, вы не могли бы написать функцию, вызывающую sed / awk, которая работает в последней строке файла истории, чтобы добавить информацию. затем вызвать эту функцию, PROMPT_COMMAND=чтобы добавить данные? это было бы хакерски, но надо делать работу.
llua

Ответы:

1

По предложению Луи, мы можем немного больше работать с историей. Добавьте строку в системный RC-файл BASH, возможно, /etc/bash.bashrc.

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Настройте ведение журнала для «local6» в системном журнале. Может быть, что-то вроде этого:

local6.*    /var/log/commands.log

Перезапустите системный регистратор. Возможно, настроить ротацию файла журнала. Выйти; авторизоваться; и история теперь записывается в /var/log/commands.log в таком формате:

дата и время hostger logger: имя пользователя [audit_pid]: команда [return_val]

Это может быть улучшено по вкусу.

Кристофер
источник
1

Следующие параграфы описывают идею в целом и устарели в некоторых аспектах, но вы можете использовать, а затем использовать последние с этой страницы. Давайте используем большой файл ~ / .bash_history.archive (отдельно от HISTFILE = ~ / .bash_history). А затем при выходе из каждого сеанса bash добавляем в него новые строки истории.

Первая проблема с этим подходом была: как заставить bash вызывать этот скрипт при каждом выходе? Конечно, если вы выходите из него, набирая «выход», вы можете использовать псевдоним «выход», но для этого я использую комбинацию клавиш Ctrl-D, и я не смог найти способ переназначить его чему-либо, но не встроенную функцию выхода.

Итак, первая попытка была: запретить Ctrl-D путем

export IGNOREEOF=10

и определить двойную комбинацию Ctrl-X для вызова функции выхода.

Но правильный подход - использовать tramp выхода bash, который является идеальным решением, потому что он вызывается независимо от того, как вы выходите из bash: Ctrl-D, выход, закрытие окна xterm.

trap 'archive_history' EXIT

Следующим шагом является определение начальной строки в нашей bash_history, чтобы мы могли сохранять только новые строки и убедиться, что мы добавляем в файл истории.

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

Это все, что нам нужно при запуске bash - теперь мы знаем, с какой строки истории начинается текущая (свежая) история. Чтобы сохранить историю, добавьте следующий кусок в ваш ~ / .bashrc.

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

Файл ~ / .inputrc должен содержать следующие строки, чтобы переопределить ярлык выхода для Ctrl-x x. С первой попытки вы можете почувствовать, что это ужасный путь, но потом вы привыкнете - поверьте мне.

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

Кроме того, если ваш сеанс bash является сеансом входа в систему, и вы выходите, вызвав ' logout', то вы можете добавить следующую строку в ваш~/.bash_logout

archive_history

После того, как все упомянутые действия будут выполнены, вы можете найти свой ~/.bash_history.archiveфайл, содержащий разделы, подобные этим

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

который в целом может быть прочитан как обычный файл истории, если вы хотите.

Рахул Патил
источник