Можно ли узнать, какая программа или скрипт создали данный файл?

Вопрос или проблема

В моей домашней директории внезапно появилось три файла с названиями “client_state.xml”, “lockfile” и “time_stats_log”. Последние два пустые. Мне интересно, как они там оказались. Это не первый раз, когда такое происходит, но в последний раз это было недели назад; я удалил эти файлы, и ничего не сломалось и не стало жаловаться. Я не могу вспомнить, чем я занимался в тот момент, о котором сообщается в stat $filename. Есть ли способ выяснить, откуда они пришли?

В качестве альтернативы, есть ли способ отслеживать домашнюю директорию (но не поддиректории) на предмет создания файлов?

Вы можете наблюдать за всем, что происходит в файловой системе, получая доступ к ней через LoggedFS. Это наслоенная файловая система, которая регистрирует каждый доступ к дереву директорий.

loggedfs -l /var/tmp/$USER-home-fs.log ~

Однако регистрация всей вашей домашней директории может замедлить вашу систему. Вам, по крайней мере, стоит написать файл конфигурации с строгими фильтрами.

Если у вас есть доступ к root, на Linux вы можете использовать аудитную подсистему для регистрации большого количества событий, включая доступ к файловой системе. Убедитесь, что демон auditd запущен, затем настройте то, что вы хотите регистрировать с помощью auditctl. Каждая зарегистрированная операция записывается в /var/log/audit/audit.log (на типичных дистрибутивах). Чтобы начать отслеживание конкретного файла:

auditctl -w /path/to/file

или в длинной форме

auditctl -a exit,always -F path=/path/to/file

Если вы установили наблюдение за директорией (с помощью -w или -F dir=), файлы в ней и ее поддиректориях будут также находиться под наблюдением.

Не верю, что есть способ определить, какая программа создала файл.

Что касается вашего альтернативного вопроса: вы можете наблюдать за повторным созданием файла, используя inotify. inotifywait — это командный интерфейс для подсистемы inotify; вы можете указать ему искать события create в своей домашней директории:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Настройка наблюдений.
Наблюдения установлены.
/home/mmrozek/ CREATE making-a-test-file

Вы, вероятно, захотите запустить его с опцией -m (монитор), которая указывает ему не выходить после первого события

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

Один из вариантов — использовать sysdig: приложение для мониторинга системы с открытым исходным кодом. Используя его, вы можете отслеживать активность по имени файла. Предположим, вы хотите увидеть, какой процесс создает файл с именем /tmp/example.txt:

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

Из этого вывода вы можете увидеть, что процесс с именем touch с pid 5470 открыл файл.

Если вы хотите больше информации, вы можете запустить в “режиме захвата”, где собирается трассировка системных вызовов:

# sysdig -w /tmp/dumpfile.scap

Затем подождите, пока файл будет создан, а потом остановите sysdig и выполните:

# csysdig -r /tmp/dumpfile.scap

Это позволит вам исследовать все, что произошло. Вы можете нажать <F2> и выбрать Files, затем нажать <F4> для поиска имени файла, а затем нажать <F6> для “доски” (что покажет вам вывод, аналогичный вышеуказанной команде). С помощью этого вы можете использовать тот же подход, чтобы найти информацию о процессе, который фактически создал файл.

Существует GUI-версия csysdig, называемая sysdig-inspect, если это больше в вашем духе.

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

У вас нет inotify, так что вы можете написать скрипт, который будет проверять наличие файла в цикле:

#!/bin/sh

while [ true ]; do                     # Запускать столько, сколько необходимо
  if [ -f /path/to/file ]; then        # Если файл существует
    echo "Файл найден"                  # Уведомить и прекратить мониторинг
    exit 0
  fi
  sleep 5                             # Иначе подождите 5 секунд
done

Вы можете использовать Систему аудита Linux, чтобы получить информацию и события, происходящие с файлами.

touch hello.txt
sudo auditd
sudo auditctl -w $PWD/hello.txt -p warx -k hello-file
echo 'hello world' > hello.txt
sudo ausearch -k hello-file

Вы можете использовать inotifywait в сочетании с lsof, чтобы выяснить, какой процесс создал файл, если вы сможете заранее выполнить следующую команду – т.е. подождать, пока файл будет создан. Предположим, что вы не знаете имя файла, но знаете директорию, вы можете использовать эту команду:

inotifywait -e create /tmp | tee /dev/stderr | grep CREATE | cut -d ' ' -f 3 | xargs -I {} lsof /tmp/{}

Замените два случая /tmp абсолютным путем к директории, которую вы хотите отслеживать.

После создания правила с помощью

auditctl -w /home/me/mysterious_file -k watch_for_mysterious_file

Я использую этот скрипт для получения уведомлений на рабочем столе через notify-send:

#!/bin/bash

# /usr/local/bin/audit-monitor.sh

user_to_notify="me"

# Ключ аудита, который использует ausearch
audit_key="watch_for_mysterious_file"

# Файл для хранения времени, после которого ausearch должен искать события.
# При выходе из этого скрипта мы обновим файл текущей датой и временем
last_run_file="/tmp/last_audit_check"

# Инициализируем время последнего запуска, если его нет,
# мы можем использовать специальные временные значения ausearch, такие как
# "вчера", "в этом году", "недавно" и т.д.
if [ ! -f "$last_run_file" ]; then
    echo yesterday > "$last_run_file"
fi

# Ищем в журнале аудита записи с указанным ключом после времени последнего запуска.
# Нам нужно передать строку из last_run_file без кавычек, чтобы --start получал два параметра: дату и время, разделенные
new_events=$(ausearch -k "$audit_key" --start $(cat "$last_run_file"))

# Если есть новые события, отправьте уведомление указанному пользователю
if [[ -n "$new_events" ]]; then

  # Получите имена исполняемых файлов, вызывающих новые события, разделенные запятыми
  exe_names=$(grep -oP 'exe="\K[^"]+' <<< "$new_events" | sort | uniq | sed -z 's/\n/, /g; s/, $/\n/')

  id_of_user_to_notify=$(id -u "$user_to_notify")

  sudo -u "$user_to_notify" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$id_of_user_to_notify"/bus notify-send "Событие аудита сработало" "Обнаружено новое событие для ключа: $audit_key. Имена исполняемых файлов: $exe_names"
  echo "Обнаружено новое событие для ключа: $audit_key"
fi

# Обновите время последнего запуска, смотрите "man ausearch" для правильного формата даты и времени
date '+%x %H:%M:%S' > "$last_run_file"

Затем я создал службу systemd, которая вызывает скрипт:

# /etc/systemd/system/audit-monitor.service
[Unit]
Description=Служба мониторинга событий аудита
After=auditd.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/audit-monitor.sh

Таймер запускается каждую минуту:

# /etc/systemd/system/audit-monitor.timer
[Unit]
Description=Запуск скрипта мониторинга событий аудита периодически

[Timer]
OnCalendar=*:0/1

[Install]
WantedBy=timers.target

Включите и запустите таймер с помощью

systemctl daemon-reload && systemctl enable --now audit-monitor.timer

Если auditd еще не включен и не запущен:

systemctl enable --now auditd.service

Ответ или решение

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

Анализ Проблемы

Вы упомянули, что в вашем домашнем каталоге появились несколько файлов, включая «client_state.xml», «lockfile» и «time_stats_log», из которых два последних пустые. Это может вызывать беспокойство, особенно если такие ситуации происходили и ранее. Файлы могут быть созданы различными программами, сервисами или сценариями автоматизации.

1. Проверка метаданных файла

Первый шаг — это использование утилиты stat, как вы уже делали. Данная команда предоставит информацию о времени создания, изменения и доступа к файлу, что может помочь понять, когда файл был создан:

stat <имя_файла>

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

2. Использование inotify

Если вам нужно отследить создание файлов в вашем домашнем каталоге, можно воспользоваться системой мониторинга inotify. Утилита inotifywait позволяет отслеживать события файловой системы, включая создание файлов.

inotifywait -m -e create ~/

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

3. Auditd для более глубокой аналитики

Если вы обладаете правами администратора, вы можете воспользоваться подсистемой аудита Linux (auditd). Она позволяет записывать действия с файловой системой, которые могут показать, какая программа взаимодействует с определенным файлом.

Чтобы начать мониторинг, выполните следующие команды:

sudo service auditd start
sudo auditctl -w /path/to/file -p warx -k name_of_your_key

Здесь -w указывает файл для отслеживания, а -p warx задает разрешения на запись, чтение и выполнение. По истечении времени вы сможете просмотреть журнал с помощью команды:

sudo ausearch -k name_of_your_key

4. Sysdig для мониторинга в режиме реального времени

Еще одним мощным инструментом является sysdig, который позволяет отслеживать системные вызовы в реальном времени. С помощью него можно получить информацию о процессе, создающем файл

sysdig fd.name=<имя_файла>

Такое решение позволить вам узнать, какой процесс создает интересующий вас файл.

Заключение

Хотя нет прямого способа определить, какая именно программа создала файл после его создания, использование инструментов, таких как stat, inotify, auditd и sysdig, может помочь вам прояснить ситуацию и понять, что происходит в вашем окружении. Наблюдая за активностью вашего компьютера, вы сможете более эффективно отслеживать и предотвращать несанкционированные изменения файлов.

В конечном итоге, создание системы мониторинга ваших файлов — это разумный шаг к обеспечению безопасности и контроля за работой вашего программного обеспечения.

Оцените материал
Добавить комментарий

Капча загружается...