Есть ли простой способ регистрировать все выполненные команды, включая аргументы командной строки?

11

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

Я знаю, что мог бы обернуть исполняемый файл в сценарий оболочки, который бы регистрировал параметры, но мне было интересно, есть ли более специфичный для ядра способ контроля за этим, возможно, обратный вызов файловой системы, который видит, когда конкретный / proc / pid / exe соответствует заданному двоичному файлу?

Питер Грейс
источник
Есть ли способ auditdзаписать аргументы командной строки, а также запустить программу? serverfault.com/questions/765179/…
Нил

Ответы:

16

Да, есть средство ядра: подсистема аудита. auditdДемон делает вырубку, а команда auditctlустанавливает правила ведения журнала. Вы можете регистрировать все звонки на определенную систему alls, с некоторой фильтрацией. Если вы хотите регистрировать все выполненные команды и их аргументы, зарегистрируйте execveсистемный вызов:

auditctl -a exit,always -S execve

Чтобы специально отследить вызов конкретной программы, добавьте фильтр на исполняемый файл программы:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

Логи отображаются в том /var/log/audit.logили ином месте, где их размещает ваш дистрибутив. Вы должны быть пользователем root для управления подсистемой аудита.

Как только вы закончите исследование, используйте ту же командную строку с -dвместо, -aчтобы удалить правило ведения журнала, или запустите, auditctl -Dчтобы удалить все правила аудита.

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

Жиль "ТАК - перестань быть злым"
источник
Почему то -F path=/ust/bin/rrdtool? Я не понимаю, как rrdtoolэто связано с программным обеспечением.
Грэм,
@ Grameme Проблема, описанная в вопросе, была отслеживанием вызова rrdtool. Если вы хотите регистрировать вызовы всех программ, отбросьте -F path=…часть (конечно, вы получите много журналов).
Жиль "ТАК - перестань быть злым"
Правильно ... первая строка вопроса. Благодарю.
Грэм
Это все здорово, но как мне сбросить конфиг в исходное состояние? В противном случае он продолжит заполнять журнал новыми и новыми запущенными командами ... или эта auditctlкоманда действует только до перезагрузки?
Руслан
@Ruslan Эффект auditctlтолько сохраняется до перезагрузки, но в любом случае это хороший момент, я добавил инструкции по их удалению без перезагрузки в свой ответ.
Жиль "ТАК - перестать быть злым"
6

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

Snoopy - более легкое решение, так как не требует взаимодействия с ядром. Все, что нужно, - это динамический загрузчик (dl), который предварительно загружает библиотеку snoopy, путь к которой указан в /etc/ld.so.preload.

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

Бостян Скуфча
источник
Можно ли вести протоколирование команд, прямо или косвенно созданных только из определенной оболочки?
с.в.
Я не уверен, что понимаю ваш вопрос - вы имеете в виду «оболочку» как конкретную программу, которая используется в качестве оболочки (bash, dash, zsh и т. Д.), Или вы хотите записать только конкретный PTY? Snoopy предоставляет инфраструктуру фильтрации, но в настоящее время реализована только пара очень простых фильтров, см. Здесь список: ссылка . Если у вас есть конкретный вариант использования, который может быть применим к другим, пожалуйста, объясните это в запросе к функции, и, кстати, исправления приветствуются :)
Bostjan Skufca
Я имел в виду только конкретный PTY.
с.в.
Не существует специального фильтра для PTY, доступного банкомата. Однако вы можете использовать snoopy для регистрации всего, включая PTY, в котором произошло событие, а затем выполнить фильтрацию в демоне syslog. Я не знаю, какой из них вы используете, но syslog-ng (например) может выполнять регулярное выражение, положительное или отрицательное.
Бостян Скуфча
Конечно, спасибо! Инструмент и подход в целом довольно полезны. Я могу легко выполнить фильтрацию, чтобы получить то, что мне нужно.
с.в.
2

Подсистема «аудита» ядра Linux может делать то, что вам нужно.

например, если вы запускаете эти команды:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

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

например, это результат моего бега tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

Есть некоторые интересные ценности, которые можно увидеть; например, «auid» равен 500, что является моим идентификатором входа в систему, хотя «uid» равно нулю (потому что я работаю под su). Таким образом, даже если пользователь поменял учетную запись, suили sudoмы все равно можем вернуться к его «идентификатору аудита»

Теперь эти auditctlкоманды будут потеряны при перезагрузке. Вы можете поместить их в файл конфигурации (например, в /etc/audit/rules.d/каталог на CentOS 7). Точное местоположение будет зависеть от вашей версии ОС. Страница auditctlруководства должна помочь здесь.

Однако будьте осторожны ... это приведет к генерации большого количества сообщений журнала. Убедитесь, что у вас достаточно места на диске!

При необходимости правила могут быть ограничены конкретным пользователем или конкретной командой.

А также будьте осторожны; если пользователь вводит пароль при выполнении команды (например mysql --user=username --password=passwd), то это будет зарегистрировано.

Стивен Харрис
источник