Як я можу відслідковувати виконувані файли, створені моїм користувачем у Linux?


11

Використовуючи Linux, я хотів би відслідковувати виконувані файли, які виконуються на моє ім’я, включаючи весь командний рядок (на практиці кожен виконавець * (), виконаний як мій власний користувач). Програма, якою я не керую, передбачається, щоб впоратися із завданням, виконати програму, яку я передаю, але я хочу переконатися, що вона це робить, і які параметри вона використовує. Програма, якою я не керую, є хиткою і, здається, змінює поведінку залежно від назви програми, яку вона повинна виконати для виконання завдання, тому я не можу передати скрипт оболонки, який би записував інформацію та викликав справжню програма.

Чи можна мені повідомити про всі виконані файли exec * () як мого користувача в системі в Linux, включаючи повний командний рядок? Не вистачає бігу psв циклі, тобто. Я вважаю за краще це робити безпосередньо в системі, в якій я працюю, і не вимагаю доступу до коренів, але, якщо це потрібно, я можу породити систему, на якій у мене є кореневий доступ, встановити програми та дослідити там.

Використання Ubuntu 12.4 LTS.


Я задаю тут питання, а не задавати Ubuntu, оскільки це скоріше питання Unix / Linux, ніж справжнє питання Ubuntu.
П'єр Лебеопін

1
Наскільки підступна програма? Чи намагається виявити чи обійти налагоджувачі? Це динамічно пов'язане? Якщо він занадто підлий, можливо, вам доведеться використовувати віртуальну машину, де ви root. (Це може бути найпростіша стратегія навіть для програми, яка не є особливо підступною.)
Жил "SO- перестань бути злим"

@Gilles Це справді можливість, я спробую VM, а потім оновіть питання, чи виявиться це працездатним.
П’єр Лебеопін

Примітка: вам здається, що насправді ви хочете назву програми та аргументи, на які відповідає відповідь 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 були б корисні, наприклад, якщо користувач зробить a suабо sudoвикорінити корінь. У цій ситуації буде багато матеріалів, що працює як 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
"Зауважте, що у мене немає доступу до кореня". (Інакше це буде гарною відповіддю.)
Жил "SO- перестань бути злим"

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

Дякую, що спрацювало. Додам, що мені довелося встановити auditctl 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

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