Как я могу отслеживать исполняемые файлы, созданные моим пользователем в Linux?


11

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

Могу ли я получить информацию обо всех exec * (), выполненных моим пользователем в системе в Linux, включая полную командную строку? Если не считать psцикла, то есть. Я бы предпочел сделать это непосредственно в системе, в которой я работаю, и мне не требуется root-доступ, но при необходимости я могу создать систему, в которой у меня есть root-доступ, установить программы и провести там исследование.

Использование Ubuntu 12.4 LTS.


Я спрашиваю здесь, а не спрашиваю Ubuntu, так как это скорее вопрос Unix / Linux, чем настоящий вопрос Ubuntu.
Пьер Лебопен

1
Насколько подлая программа? Он пытается обнаружить или обойти отладчики? Это динамически связано? Если он слишком подлый, вам может понадобиться использовать виртуальную машину, где вы root. (Это может быть самой простой стратегией даже для программы, которая не является особенно хитрой.)
Жиль "ТАК - перестань быть злым"

@ Жиль Это действительно возможно, я собираюсь попробовать ВМ, а затем обновить вопрос, если это окажется работоспособным.
Пьер Лебопен

Примечание. По-видимому, вам действительно нужны имя программы и аргументы, которые auditдает ответ , но «целая командная строка» в оболочке также может повлиять на дочерний процесс, используя параметры перенаправления / конвейера и envvar, а также содержащие подстановки / расширения, несущественное цитирование и расстояние, и структуры управления, как doa && dob, и вы не получите их.
dave_thompson_085

Ответы:


10

Вам необходимо настроить auditdзапись execveсобытий. Пример на RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

Я игнорирую предупреждение об арке, и это не имеет значения, но вы можете использовать -F arch=b64или-F arch=b32 установить его, если хотите.

Результатом вышесказанного является:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

Это очевидно быстро и грязно, но это основы того, как вы это делаете. Что именно нужно делать, вероятно, сильно зависит от того, что именно вы пытаетесь сделать. Вы можете уменьшить поток аудита, используя различные фильтры вauditctl команде, но я не знаю этой информации, поэтому не знаю, что включить. Если вам нужно что-то более конкретное, я бы посоветовал вам проверить страницу руководства или оставить комментарий к этому ответу, и я обновлю его еще немного.

Надеюсь, что это поможет вам в правильном направлении.

РЕДАКТИРОВАТЬ:

Поскольку ваш вопрос связан с просмотром конкретного пользователя, я могу показать вам, что:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Идентично вышесказанному, но только тот execve, кто работает с эффективным идентификатором пользователя, 16777216будет зарегистрирован. Если вам нужно указать значение пользователя loginuid(от которого он изначально вошел в систему), тогда вы будете использовать auidвместо этого:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Фильтры AUID / loginuid были бы полезны, например, если пользователь сделает suили sudoroot. В этой ситуации будет много вещей, запущенных от имени пользователя root, но вас интересует только то, что было запущено данным пользователем. auditctlтакже позволяет стек фильтров , так что вы можете фильтровать как euidи auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"

1
«Обратите внимание, что у меня нет root-доступа». (В противном случае это был бы хороший ответ.)
Жиль "ТАК - перестань быть злым"

Черт ... так близко ...
Братчли

Спасибо, что сработало. Я должен добавить, что мне пришлось установить auditl с помощью apt-get, он не был предварительно установлен в Ubuntu.
Пьер Лебопен

Благодарю. Хорошие примеры. Но есть ли способ получить код выхода из журнала аудита?
Каос

0

Вы спросили что-то простое. Я сделал пример с, mplayerно я думаю, что он может быть адаптирован к другим ситуациям:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Как вы можете видеть, это очень просто: он анализирует первый аргумент, так как это файл, журнал создается в центральном файле $LOGи объединяется в файл (который всегда имеет одинаковое имяmplayer.log в одном и том же каталоге.

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


В Q специально сказано, что замена скрипта не будет работать.
dave_thompson_085

Возможно, но это подходит для моей ситуации: у меня нет проблем с безопасностью, и я могу выбрать скрипт, который я запускаю. Как бы невероятно это ни казалось, у меня есть хотя бы самое простое решение, может быть, кому-то еще будет интересно не заниматься вещами только для гиков. Я признаю, что предыдущее решение является более безопасным!
MUY Бельгия
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.