【问题标题】:Determine UID that last modified a file in Linux?确定最后在 Linux 中修改文件的 UID?
【发布时间】:2010-10-14 00:01:15
【问题描述】:

我正在编写一个程序来监视选定文件和目录的更改。有些文件是全局可写的,有些是所有者,有些是组。

我需要做的是找出最后一个修改(不仅仅是访问)文件的人。不知何故,我认为这很简单,因为我们知道文件的 inode .. 但是我似乎找不到任何方法来获得它。我认为有一种实用的方法可以将任何给定的 inode 与上次访问它的 uid 关联起来。

我想我已经挤压了谷歌的所有内容。

感谢任何帮助。我正在用 C 语言编写程序。

编辑:

在修改文件的任何程序的 PID 早已消失后,我需要能够执行此操作。

【问题讨论】:

  • 回复:你的编辑,你问的根本不可能。
  • 是的,我知道。我只是想在编写更多代码以在访问文件后立即捕获 pid 之前进行检查。

标签: c linux inode


【解决方案1】:

如果您使用的是 2.6 内核,则可以利用内核的 auditd 守护程序。 Check this URL out。它可能会给你一些关于如何完成你想要做的事情的提示。我确定你可以在 C 中使用 API。

【讨论】:

  • 谢谢,我现在正在获取它的源代码,看看它是如何与内核交互的。
  • 您搜索的信息不会直接存储。但是,如果您打开了审计,审计跟踪可以(如果这样配置)显示写入文件的最后一个进程(及其 AUID、EUID、RUID)。这是否真的改变了它是未知的,但它可能改变了它。
【解决方案2】:

据我所知,任何常见文件系统都不会存储此信息,但您应该能够挂接到 inotify 并保留哪些进程接触哪些文件的审计跟踪。

【讨论】:

  • 我没有看到任何从inotify获取修改进程的uid/gid/pid的方法?我只是修改了事件和路径。
  • 当内核调用您的代码时,您可以查看谁打开了文件并将消息写入日志
【解决方案3】:

好的,直接使用带有普通文件系统的旧标准 Linux,您将无法做到这一点。该信息不会存储在任何地方(请参阅man lstat 了解 存储的内容。)

正如@pablo 所建议的,您可以在启用安全审核的情况下执行此操作。他指出的链接是一个好的开始,但它的要点是:

  • 您打开了审计守护进程,它可以从内核进行审计
  • 您配置规则文件以捕获您想要的内容
  • 您可以在审核文件中搜索所需的事件。

这里的困难在于,如果您开始审核所有文件的所有文件操作,审核将会变得很大。

那么你想要满足的实际需求是什么?

【讨论】:

  • Auditd 将在一定程度上复制我正在做的事情,但成本更高。我正在编写的程序提供近乎实时的可能入侵通知。我正在获取 auditd 的源代码,以查看它如何与内核交互,我应该能够重用该代码。
【解决方案4】:

非常基本,但它有效: 你可以很容易地写一个小c程序来做你想做的事 此示例检索文件或目录或链接的 UID, 试着找到你想要的属性。

编译:

gcc -x c my-prog.c -o my-prog

然后:

./my-prog /etc

这样可以获得很多其他的信息

它并不坚固。但无论如何,我知道如何使用它, 并在 bash shell 中进行检查:-)

[ -x /etc ] && my-prog /etc

源代码:

# retrieve the uid of a file
# source code: my-prog.c
#
#include <stdio.h> 
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char **argv) {
  struct stat buffer;
  int status;
  char *fname;
  fname=argv[1];
  status = stat(fname, &buffer);
  printf("%i",buffer.st_uid);
  return 0;
}

【讨论】:

  • stat 缓冲区的 st_uid 字段包含文件的所有者,而不是最后修改它的用户的 UID。
猜你喜欢
  • 2012-05-13
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多