gpt4 book ai didi

c - 如何通过进程属性限制对 Linux 目录的写访问?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:31 27 4
gpt4 key购买 nike

我们遇到的情况是,将对日志目录的写入访问权限限制为特定的用户进程子集是有利的。我们修改了这些特定进程(例如,telnet 等),以便在发生重要用户操作(如远程连接等)时生成日志记录。我们不希望用户通过复制和编辑现有日志记录来手动创建这些记录。

syslog 接近但仍允许用户生成虚假记录,SELinux 似乎有道理,但有一个难以管理的野兽的可怕名声。

欢迎任何见解。

最佳答案

以 root 身份运行本地日志守护进程。让它监听 Unix 域套接字(通常是 /var/run/my-logger.socket 或类似的)。

编写一个简单的日志记录库,其中事件消息通过 Unix 域套接字发送到本地运行的守护进程。对于每个事件,还通过辅助消息发送流程凭证。参见 man 7 unix了解详情。

当本地日志守护进程收到一条消息时,它会检查辅助消息,如果没有,则丢弃该消息。凭据的 uidgid 准确地告诉了谁在运行发送日志请求的进程;这些都是由内核本身验证的,所以它们不能被欺骗(除非你有 root 权限)。

聪明的地方来了:守护进程还检查凭据中的 PID,并根据它的值 /proc/PID/exe。它是发送消息的进程正在执行的实际进程二进制文件的符号链接(symbolic link),用户无法伪造。为了能够伪造一条消息,他们必须用自己的二进制文件覆盖实际的二进制文件,而这应该需要 root 权限。

(存在一种可能的竞争条件:用户可以制作一个执行相同操作的特殊程序,并立即 exec() 发送他们知道允许的二进制文件。为避免这种竞争,您可以需要让守护进程在检查凭据后做出响应,并且日志记录客户端发送另一条消息(带有凭据),以便守护进程可以验证凭据是否仍然相同,并且 /proc/PID/exe symlink 没有改变。我个人会用它来检查消息的准确性(记录器使用随机 cookie 请求确认事件,并让请求者用校验和和 cookie 响应事件校验和是否正确。包括随机 cookie 应该使得不可能在 exec() 之前将确认填充到套接字队列中。)

使用 pid 您还可以做进一步的检查。例如,您可以通过跟踪父进程来跟踪进程父子关系以查看人类用户是如何连接的,直到您检测到通过 ssh 或控制台登录为止。这有点乏味,因为您需要解析 /proc/PID/stat/proc/PID/status 文件,并且不可移植。 OSX 和 BSD 有一个 sysctl 调用,可用于查找父进程 ID,因此您可以通过编写特定于平台的 parent_process_of(pid_t pid) 函数使其可移植.

这种方法将确保您的日志守护进程确切地知道 1) 日志请求来自哪个可执行文件,以及 2) 哪个用户(以及如何连接,如果您进行进程跟踪)运行了该命令。

由于本地日志守护进程以 root 身份运行,它可以将事件记录到仅 root 目录中的文件,和/或将消息转发到远程机器。

显然,这并不完全是轻量级的,但假设每秒发生的事件少于十几个,日志记录开销应该完全可以忽略不计。

关于c - 如何通过进程属性限制对 Linux 目录的写访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12788754/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com