Как записать все команды Bash всеми пользователями на сервере?

21

Наша небольшая компания использует Ubuntu Server 11.10, к которому пару человек имеют доступ по SSH. Иногда используются и фактические терминалы. Как мы можем локально регистрировать все выполняемые команды Bash вместе с пользователем и отметкой времени?

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

Банка
источник

Ответы:

32

Для оболочек BASH отредактируйте общесистемный файл конфигурации среды выполнения BASH:

sudo -e /etc/bash.bashrc

Добавьте в конец этого файла:

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

Настройте ведение журнала для "local6" с новым файлом:

sudo -e /etc/rsyslog.d/bash.conf

И содержание ...

local6.*    /var/log/commands.log

Перезапустите rsyslog:

sudo service rsyslog restart

Выйти. Войти. Вуаля!

Но я забыл про ротацию логов:

sudo -e /etc/logrotate.d/rsyslog

Есть список файлов журналов, чтобы вращаться так же ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Поэтому добавьте новый файл журнала команд bash в этот список:

/var/log/commands.log

Сохранить.


источник
Забыл про ротацию логов, которую я добавил в ответ.
1
Этот способ работает, но я мог бы придумать способ вокруг него (возможно, с помощью csh, .bash_logout). Я бы пошел с решением acct Сабакон. Они были отлично читает: linuxjournal.com/article/6144 и beginlinux.com/blog/2010/01/...
2
Я полагаю, что это может быть легко деактивировано пользователем, просто сбрасывая или сбрасывая или выполняя PROMPT_COMMANDоболочку не-bash.
Стефан Ласевский
1
@Benubird похоже, что есть несколько предустановленных уровней обслуживания, 8 из которых являются local0-local7: en.wikipedia.org/wiki/Syslog . 0 означает аварийную ситуацию, 7 означает отладку, а 6 - просто 7, «нормальные рабочие сообщения».
munchybunch
1
@yukashima, потому что журналы могут стать большими файлами, если их не удалить, вращение означает вращение файлов журналов и удаление старых, чтобы журналы были меньше ...
Бадр Элмерс
4

Система учета процессов может быть полезна в этом отношении, особенно пакет acct , который предоставляет команды lastcomm и ac.

Команды ac выводят статистику о времени подключения пользователей в часах. Это количество времени, которое пользователь был подключен к системе, либо удаленно через SSH или последовательный терминал, либо находясь на консоли.

Команда lastcomm отображает информацию о ранее выполненных командах. Самые последние записи приведены вверху списка. Также отображается общее количество процессорного времени, используемого каждым процессом.

Старый учебник, который может быть полезен, находится здесь:

http://www.linuxjournal.com/article/6144?page=0,1

Другие команды учета, такие как last и так далее, можно найти в этом уроке:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

Sabacon
источник
lastcomm довольно бессмысленно как командный логгер. Он только записывает исполняемый файл, который был запущен. Никакие аргументы, ключи или пути не зарегистрированы.
Phil_1984_
3

Вы могли бы использовать Snoopy .

Snoopy logger может удовлетворить ваши цели. Он не является неизбежным решением для ведения журнала, а скорее полезным инструментом для прилежных администраторов, которые предпочитают отслеживать свои собственные действия.

Раскрытие информации: я любопытный сопровождающий.

Бостян Скуфча
источник
Пожалуйста, предоставьте инструкции по установке и использованию в ответе.
Муру
1
Подробные инструкции по установке доступны на странице snoopy github, которая сейчас является основным ресурсом snoopy : github.com/a2o/snoopy . Я снова даю инструкции по установке в других местах, так как основное расположение поддерживается проектом, а другие нет. Кстати, Readme был обновлен, чтобы стать более структурированным.
Bostjan Skufca
1
Может быть и так. Но даже без краткого изложения шагов, необходимых для его использования, этот ответ предназначен только для ссылок и может быть удален.
Муру
1
Ну, я дал указатель на альтернативное и жизнеспособное решение. Если это не то, для чего предназначен этот сайт, то он обязательно должен быть удален вместе с моей учетной записью.
Bostjan Skufca
2
@BostjanSkufca не нужно обижаться. Это просто обмен стеками, чтобы иметь хотя бы разумно автономные ответы. Если вы так категорически против добавления шагов, это ваше желание. Мой пониженный голос остается. Кто-то, вероятно, скажет это.
Муру
3

Вы можете найти здесь скрипт для входа все Баш команды / встроенных модулей в текстовом файл или системный журнал сервер без использования патча или специальный исполняемого инструмента.

Очень прост в развертывании, так как это простой сценарий оболочки, который нужно вызывать один раз при инициализации bash .

Это бесплатно, и я надеюсь, что это соответствует вашим потребностям.

Франсуа Шойрер
источник
1
Это хороший ответ, но желательно указывать шаги и сценарий в теле ответа, а не ссылаться на свой блог. Можете ли вы отредактировать свой ответ, чтобы включить это?
Том Броссман
2
Сайт сейчас недоступен
Gaia
0

Чтобы позаботиться о нескольких сеансах, не перезаписывая файл истории, вы должны будете поместить «shopt -s histappend» в файл запуска Bash. Смотрите также этот вопрос по той же проблеме.

ПРП
источник
0

Попробуйте это (решения выше не будут работать на 100% с Bash 4.3):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

это делает регистрацию И предотвращает регистрацию меток времени, которые используются для файла истории bash. ловушка необходима, так как bash отправит сигналы «subjob» после многократного нажатия strg + c (протестировано с bash 4.3). это приведет к выходу из системы текущего пользователя (например, вошел в систему с помощью sudo)

Ханс-Йоахим Климек
источник
0

Вы также можете попробовать установить acct. Acct ведет подробный журнал аудита того, что делается в ваших системах Linux.

sudo apt-get install acct
edwinksl
источник