Как записать каждую команду Linux на сервер журналов

13

Я хочу, чтобы каждая введенная команда шла на сервер журналов. Уже настроен syslog-ng для отправки всех журналов на сервер журналов.

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

Лео
источник

Ответы:

29

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

Например, пользователь может запустить почтовый клиент (например, единственная зарегистрированная команда pine), там он выбирает «Compose», который запускает VI, и из VI он запускает любую команду, через которую хочет :!cmd. Эта команда нигде не регистрируется, и с точки зрения системы она похожа на любое вспомогательное приложение, вызываемое VI, например, grep или sort. Единственная команда, зарегистрированная оболочкой, была pine.

Кажется, что вы на самом деле хотите, называется одитингом . Включите подсистему аудита и используйте auditctlкоманду и auditdдемон из пакета аудита для управления тем, что регистрируется. Более подробная информация находится на странице руководства audctl (8) .

Обратите внимание, что регистрация каждого экземпляра процесса также может быть неоптимальной. Например, простой ./configureдля пакета программного обеспечения (созданный с помощью автоинструментов) отличается тем, что создает тысячи экземпляров процессов. Это наполнит журнал аудита таким большим шумом, что потом будет очень трудно его анализировать.

Жулиано
источник
13

Установите acctпакет (имя пакета зависит от дистрибутива, также известного как учет процессов) и используйте lastcomm <username>:

[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
tr                     sernin   pts/2      0.02 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
fortune                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xmodmap                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xrdb                   sernin   pts/2      0.00 secs Fri Nov 12 12:02
sh                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
cpp                    sernin   pts/2      0.00 secs Fri Nov 12 12:02

Вы также можете искать по tty или имени команды. Как обычно, man lastcommдля получения дополнительной информации.

Сэм Халике
источник
11

Если вы хотите немного программировать на C, вы можете сделать это, написав библиотеку, которая упаковывает execve, регистрирует в syslog, а затем dlopen - библиотека, содержащая настоящий execve syscall. Затем в / etc / environment установите LD_PRELOAD путь к библиотеке, которую вы создали.

Вы должны быть осторожны при вводе цикла здесь, так что вы можете либо регистрировать только exec определенных двоичных файлов, либо исключать других (таких как syslog) из журнала.

отметка
источник
На самом деле, это довольно полезно. Первый поиск в execve-оболочке вызывает snoopy ( sourceforge.net/projects/snoopylogger ). Это кажется близким к тому, что я искал, хотя немного многословно. После тестирования я вижу, что мне нужно одобрение руководства, чтобы внедрить это в производственную среду. (Предупреждение всем вам гнусным типам)
Лев
@Leo Начиная с версии 2.0.0 Snoopy поддерживает пользовательскую спецификацию формата журнала при выполнении ./configure, поэтому чрезмерная детализация больше не должна быть проблемой. Раскрытие: сопровождающий Snoopy здесь.
Бостян Скуфка,
7

Похоже, вы ищете что-то вроде rooth ( man page ). Чтобы процитировать man страницу:

Rootsh - это оболочка для оболочек, которая записывает все повторяющиеся нажатия клавиш и вывод терминала в файл и / или в системный журнал.

Несмотря на название, это может быть использовано для любого пользователя.

Андрей М.
источник
2

Вероятно, лучше, если пользователи будут использовать sudo (или аналогичные) для запуска команд, которые вам интересны, и доверять пользователям на каком-то уровне. По мере того, как вы приближаетесь к «полному контролю» вещей, становится сложнее отследить, что они делают. Например, недавно я смотрел на такие инструменты. В основном они просто создают журналы, которыми трудно управлять, если у вас достаточно пользователей и компьютеров, чтобы сделать такую ​​вещь стоящей. :)

Учитывайте всю информацию, которую вы будете генерировать. Насколько это тебя волнует? Вероятно, очень мало - поэтому вы создаете журналы, которые в основном бесполезны. Аудит того, что вам действительно небезразлично, как предлагают другие, вероятно, приведет вас к лучшему конечному состоянию.

dannysauer
источник
1

Bash может быть скомпилирован с поддержкой syslog начиная с 4.1.

Это не надежно (учет процессов может быть лучше для этого), но это в основном взаимодействие с пользователем; объем должен быть более управляемым, и вы сможете переключиться на что-то более подробное, если подозреваете что-то ненормальное.

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

Tobu
источник
0

Также есть sudosh ( http://sudosh.sourceforge.net ), который будет вести логи сеанса. У вас есть возможность запустить его как определенную оболочку для пользователя или через sudo. Он также отслеживает время для каждого сеанса, так что вы можете воспроизвести сеанс и просмотреть его (включая редактирование сеансов и еще много чего).

Придерживаться
источник