Вопрос или проблема
Я читал много обсуждений о расследовании nfs с помощью wireshark, но это не дает мне “глобального” вида всех файлов, к которым идет доступ через NFS.
На сервере NFS я знаю, что процесс NFS использует много активности диска:
выдержка из pidstat -p ALL -d:
05:11:48 PM 0 4970 0.00 1.20 0.45 rsyslogd
05:11:48 PM 0 4983 0.00 4.74 0.00 snmpd
05:11:48 PM 0 6438 26.97 46498.87 44951.28 nfsd
05:11:48 PM 0 6439 29.71 67677.59 52382.44 nfsd
05:11:48 PM 0 6440 32.23 91297.19 59268.11 nfsd
05:11:48 PM 0 6441 34.06 114280.26 65961.18 nfsd
05:11:48 PM 0 6442 35.88 134947.77 74024.66 nfsd
05:11:48 PM 0 6443 39.15 155449.00 83946.33 nfsd
05:11:48 PM 0 6444 45.73 162572.04 97760.24 nfsd
05:11:48 PM 0 6446 55.43 169127.98 130529.82 nfsd
05:11:48 PM 992 6787 5.40 7.09 0.00 java
05:11:48 PM 1002 7497 0.02 15.53 0.00 java
05:11:48 PM 1002 7588 0.11 66.64 4.90 java
обычно мы можем использовать lsof, чтобы узнать, какие файлы открыты процессом, но для nfsd это не отображает ничего интересного (настоящее имя файла или папки не показываются):
6427|nfsd4_callbacks
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nfsd4_cal 6427 root cwd DIR 253,0 4096 128 /
nfsd4_cal 6427 root rtd DIR 253,0 4096 128 /
nfsd4_cal 6427 root txt unknown /proc/6427/exe
==============================
PID|PNAME
6438|nfsd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nfsd 6438 root cwd DIR 253,0 4096 128 /
nfsd 6438 root rtd DIR 253,0 4096 128 /
nfsd 6438 root txt unknown /proc/6438/exe
разве нет способа узнать, какие именно файлы открыты процессом nfsd? ОС может хранить информацию о дисковой активности процесса, но не может указать, какие именно файлы открыты?
может быть, есть способ взглянуть на /proc/6438/exe, чтобы узнать настоящий файл (я не могу, так как у меня нет root прав)?
если это действительно невозможно, есть ли скрипт или команда в wireshark, которая может извлечь из tcpdump все файлы в виде списка (болезненно делать это вручную + у меня есть только имя файла, а не полный путь)?
Ответ или решение
Вопрос, который вы подняли, о том, как определить файлы, доступные процессом nfsd на сервере NFS, и почему lsof не предоставляет необходимых данных, актуален для многих системных администраторов. В системах на основе Red Hat 7.9 есть несколько подходов, которые можно применить для решения этой задачи. Давайте разберём их подробно и предложим возможные решения с учетом вашего описания проблемы.
Теоретическая часть
Сервер NFS (Network File System) предоставляет возможность удалённого доступа к файловым системам через сеть. Процессы nfsd отвечают за обработку запросов на сервере. Поскольку NFS работает на уровне сети, он не привязан к файловой системе сервера так, как это делается в локальных файловых операциях. Это делает трудным доступ к списку конкретных файлов, с которыми работает nfsd, через стандартные инструменты вроде lsof.
Для мониторинга дисковой активности процессов, таких как nfsd, стандартные инструменты, такие как lsof и procfs, могут быть недостаточными, поскольку они настроены на отображение открытых файловых дескрипторов для локальных операций, а не для сети. В случае NFS основная работа происходит через сетевые интерфейсы, а не через файловые дескрипторы в традиционном смысле.
Пример
Вы отметили, что lsof не отображает необходимых данных. Это связано с тем, что nfsd не открывает файлы напрямую на сервере; вместо этого он предоставляет доступ к ним удалённым клиентам. Когда запрос на чтение или запись поступает через NFS, операция обрабатывается на уровне ядра, часто не оставляя информации в контексте процесса.
Попробуем рассмотреть, как можно было бы с этим работать. Допустим, у вас есть tcpdump-сниффинг, который может предоставить сетевой след NFS-трафика. Эти данные можно было бы проанализировать с помощью Wireshark или других анализаторов сетевых пакетов, чтобы попытаться восстановить полную картину взаимодействий. Однако, даже в этом случае возникающие затруднения связаны со сложностью анализа трафика и определения точных файловых путей.
Применение
-
Использование Auditd: Red Hat предоставляет возможность мониторинга файловой системы с помощью auditd. Это может быть очень полезно для отслеживания файловых изменений или доступа к конкретным файлам. Вы можете настроить auditd для мониторинга каталога, экспортируемого NFS, чтобы получить отчёт о доступах:
auditctl -w /path/to/nfs/export -p rwxa -k nfs-access ausearch -k nfs-access
Эта команда добавит правило, которое будет регистрировать все попытки доступа к указанному каталогу.
-
Wireshark: Как вы упомянули, Wireshark, хотя и не предоставляет "глобального" представления, может получить данные о сетевом обмене, которые затем можно анализировать в поисках интересующих файловых операций. Это может быть чрезмерно сложным, но предоставляет другой слой информации.
-
Взаимодействие с сетевым трафиком: Используйте такие утилиты, как tcpdump, чтобы собирать сетевой трафик. Это может помочь в определении команды или IP-адреса клиента, запрашивающего доступ к файлам:
tcpdump -i <interface> host <client_ip> and port 2049
Также стоит отметить, что прямая работа с /proc не даст информации, если вы не обладаете root-доступом, как упомянуто в вопросе.
- Политики SELinux: Если SELinux активирована, можно настроить политики отслеживания сетевых операций на уровне системы безопасности, которые могут помочь в идентификации использования ресурсов.
Каждый из этих методов занимает своё место в наборе инструментов системного администратора и может быть полезен в зависимости от конкретной ситуации и требований конфиденциальности данных. Рекомендуется применять несколько из них в комплексе для получения наиболее полного представления о сетевой активности и доступе к файлам в рамках nfsd.
Таким образом, хотя задача сложная, существует несколько стратегий её решения. Возможно, вы найдете подход, который наиболее эффективно соответствует вашей инфраструктуре и рабочей среде.