如果你look in /usr/include/sys/user.h你会看到打开的文件信息可以在当前进程的p_user.u_finfo结构中找到。
走这个结构并非易事。只是look at what the proc filesystem code has to do to look up the attributes of just one open file descriptor。需要大量锁定 - 您不能在运行时简单地遍历数据结构。
而且,以下内容超出了问题的范围,但很重要......
对于它的价值,你正在做的事情是行不通的。它从根本上存在缺陷——在技术上和法律上。
您尝试做的事情 - 跟踪共享用户帐户的用户 - 无论如何都是毫无价值的。您将永远无法证明仅仅因为某个登录会话执行了某些代码,该代码就被执行了,因为登录到该会话的用户故意运行了该代码。 因为任何有权访问该帐户的用户都可以修改共享帐户的环境,从而使恶意软件由其他人运行。他们可以让它看起来就像一个输入的命令。
Shared credentials and accounts violate nonrepudiation.这是您在使用自定义内核跟踪可能产生的任何数据时无法克服的法律缺陷——即使您设法产生了一个万无一失的系统,这不太可能。
如果我登录到一个共享帐户,您可以永远证明我运行的代码是故意运行的。
嗯,这并不完全正确 - 如果您有 完美 审核,您可以将用户所做的每一件事都追踪到磁盘上修改的字节,那么您可以。在这种情况下,“完美”意味着这些用户无权更改审计系统的任何部分。
但是如果你已经有了完善的审计,你不需要编写内核模块来尝试和实现它。
当然,不可能证明你有完美的审计,因为你无法证明你没有漏洞。
看到问题了吗?
我们马上回到“你不能证明我是故意的。”
您最好只使用操作系统提供的审计服务。无论您想出什么办法,都无法证明任何聪明的坏人“是谁干的”——比如想出一种方法将恶意代码插入另一个用户会话的人。并且操作系统审计足以抓住任何不知道如何掩盖其踪迹的人。
但是当涉及共享帐户时,您将无法证明任何知道自己在做什么的坏演员。如果你不能证明这一点,你甚至可能根本无法对你怀疑的人做任何事情。因为真正知道自己在做什么的人可以将明显的责任归咎于无辜的人——如果他们不能隐藏或销毁不良行为的证据的话。
如果您发现共享的.profile 文件中有一行在某个日期后将敏感数据通过电子邮件发送到一次性电子邮件帐户,但仅当登录来自某个 IP 时,您会怎么做地址?
共享该帐户的任何用户都可以将其放入其中。
世界上没有任何审计系统可以解决这个问题,除非它是完美的并且跟踪每个文件更改。
如果您要保护的数据很重要,那么任何要求您通过编写自定义内核模块来解决问题的人都需要开发大脑并解决真正的问题 - 共享用户帐户。摆脱它们。
每个安全指南都说不要使用共享帐户是有原因的,而且我见过的每个安全审计都会使任何使用共享帐户的人失败。