Linux文件访问监控

Jac*_*ack 30 linux monitoring files

在 unix 中有什么方法可以找出谁在过去 1 周内访问了某个文件?它可能是用户或某些脚本 ftp 到其他地方。我可以获得访问某个文件的用户名列表吗?如何找出谁正在访问特定文件?

Gil*_*il' 45

除非您有非常不寻常的日志记录策略,否则谁访问了未记录的文件(那将是大量信息)。您可以在系统日志中查看谁在什么时间登录;该last命令为您提供登录历史记录和其他日志,例如/var/log/auth.log将告诉您用户如何进行身份验证以及他们从哪里登录(哪个终端,或者远程主机)。

上次读取文件的日期称为其访问时间,或简称为 atime。所有 unix 文件系统都可以存储它,但许多系统不记录它,因为它有(通常很小)性能损失。ls -ltu /path/to/filestat /path/to/file显示文件的访问时间。

如果用户访问了该文件并且没有试图隐藏他的踪迹,他的 shell 历史记录(例如 ~/.bash_history)可能会有线索。

要了解现在打开了什么文件或谁打开了文件,请使用lsof /path/to/file.

要记录将来文件发生的情况,有几种方法:

  • 使用inotifywait。当有人阅读时inotifywait -me access /path/to会打印一行。这个界面不会告诉你谁访问了这个文件;您可以在此行出现后立即调用,但存在竞争条件(访问可能在 lsof 开始时结束)。/path/to/ ACCESS filefilelsof /path/to/file

  • LoggedFS是一个可堆叠的文件系统,它提供了文件系统树的视图,并且可以通过该视图对所有访问执行更漂亮的日志记录。要对其进行配置,请参阅LoggedFS 配置文件语法

  • 您可以使用 Linux 的审计子系统来记录大量事情,包括文件系统访问。确保auditd守护进程已启动,然后配置要使用auditctl. 每个记录的操作都记录在/var/log/audit/audit.log(在典型分布上)。要开始观看特定文件:

      auditctl -w /path/to/file
    
    Run Code Online (Sandbox Code Playgroud)

    如果您将监视放在目录上,则也会监视其中的文件及其子目录递归。

  • 嘿,你可以用这个创建一个很好的循环:`syslogd 访问日志文件 /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n.. .` (3认同)

小智 7

上一个答案不是执行您所要求的最佳实践。Linux 有一个 API。该inotifyAPI http://linux.die.net/man/7/inotify

  1. 您可以编写一个 C 程序来做您想做的事情,只需inotify直接调用API
  2. 您可以使用 kfsmd,http : //www.linux.com/archive/feature/124903 使用的守护进程inotify
  3. 如果您想要跨平台工作的东西(inotify特定于Linux)并且您正在使用 Java,JNotify 可以跨平台工作(Linux、Mac、Windows),抽象本机操作系统的底层 API。

  • [欢迎来到 Stack Exchange](http://unix.stackexchange.com/about)。答案不按时间顺序显示,因此“上一个答案”并不能传达您的意思。我想知道您指的是另外两个中的哪一个:一个没有任何看起来好坏的做法,另一个确实提到了 inotify API。 (3认同)
  • 如 https://unix.stackexchange.com/a/12251/20336 中所述,inotify API 不提供有关 *who* 访问给定文件的信息。加上 inotify 确实无助于找出上周谁访问了该文件。为此,您需要审计功能,这需要使用名为“auditd”的软件(但是,即使这也无助于确定上周谁访问了该文件,除非您上周已经运行了“auditd”)。 (2认同)

Mil*_*ger 7

上面带有 inotifywait 的示例应该是其中之一(有关更多信息,请参见手册页):

inotifywait /path/to/file
inotifywait -e open /pat/to/file
Run Code Online (Sandbox Code Playgroud)

或者使用监控模式和时间戳:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Run Code Online (Sandbox Code Playgroud)