9

有没有办法在多线程进程中仅更改一个线程的 UID/GID?

这样做的原因是编写一个文件服务应用程序 - 除非调用者的 uid/gid 设置为正确的用户,否则不会强制执行 ACL 和配额,没有使用正确的 uid/gid 创建新文件/目录等。

网络应用程序通常可以在开始时自己 fork() 并在单独的进程中处理每个用户请求。如果需要共享数据,它必须经过某种共享内存。但是,例如 FUSE(linux 用户文件系统)默认使用多线程,并且与 python 绑定结合使用分叉模型是不切实际的。

整个进程的“一致”UID 似乎符合 POSIX 标准,但是旧的 Linux 不遵循 POSIX 并允许不同线程使用不同的 uid。新内核似乎遵循 POSIX,有什么方法可以允许旧的“损坏”行为吗?

4

2 回答 2

9

Linux 特定的setfsuid()/setfsgid()是每个线程而不是每个进程的。它们专为此用例(文件服务器)而设计。

请注意,它access()仍然会使用真实的 uid 和 gid 检查访问权限 - 这是设计使然(它旨在回答“运行此二进制文件的用户是否应具有对该文件的给定访问权限”的问题)。对于setfsuid()/setfsgid()情况,您应该只尝试请求的操作并检测由于当时缺乏权限而导致的失败。

于 2009-08-04T02:26:49.690 回答
9

要仅更改一个线程的 uid,您需要直接使用系统调用: syscall(SYS_setresuid, ...); libc 函数 setresuid() 将为所有线程同步它(使用它发送给所有线程的信号)!

于 2014-09-19T11:48:08.907 回答