Вопрос или проблема
В моей домашней директории внезапно появилось три файла с названиями “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
, может помочь вам прояснить ситуацию и понять, что происходит в вашем окружении. Наблюдая за активностью вашего компьютера, вы сможете более эффективно отслеживать и предотвращать несанкционированные изменения файлов.
В конечном итоге, создание системы мониторинга ваших файлов — это разумный шаг к обеспечению безопасности и контроля за работой вашего программного обеспечения.