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

Нет, это не возможно.

Причина состоит в том, что оболочка читает в блоках файла, поскольку это выполняет его, и блок мог бы содержать код оболочки, который Вы хотите выполнить в другой оболочке, но с тех пор ее уже считанный первой оболочкой, второй наклон оболочки считал его, если это должно было принять выполнение сценария. (Это могло работать, если бы оболочка имела способность к lseek() файл, но языки оболочки просто не усовершенствованный),

Однако существует грязный способ сделать это; zsh.
zsh назвали команду emulate который позволяет Вам переключить языки оболочки на лету. Но использование zsh только для эмуляции tcsh и удара просто грязно, не говоря уже о чрезмерно сложном.

.

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

11
06.11.2014, 02:33
3 ответа

Да, существует средство ядра: контрольная подсистема. 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, или везде, где Ваше распределение помещает их. Необходимо быть корнем для управления контрольной подсистемой.

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

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

16
27.01.2020, 19:57
  • 1
    Почему -F path=/ust/bin/rrdtool? Я не добираюсь как rrdtool даже связанное программное обеспечение. –  Graeme 27.02.2014, 14:28
  • 2
    @Graeme проблема, описанная в вопросе, отслеживал вызов rrdtool. Если Вы хотите зарегистрировать вызовы всех программ, отбросьте -F path=… часть (Вы получите много журналов, конечно). –  Gilles 'SO- stop being evil' 27.02.2014, 14:37
  • 3
    Право... первая строка вопроса.Спасибо. –  Graeme 27.02.2014, 14:40

Вы можете использовать Snoopy .

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

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

6
27.01.2020, 19:57

Подсистема «аудита» ядра 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)то это будет зарегистрировано.

2
20.08.2021, 13:08

Теги

Похожие вопросы