我们有一个使用 Eventlet 模块的现有项目。
有一个服务器使用绿色线程处理客户端请求。所有请求均由单个用户“用户 A”处理
我现在需要更改它以在线程上执行 setfsuid/setfsgid,以便所有底层文件都由请求用户的所有权创建。
我知道我需要 setid Linux 功能来进行 setfsid 调用。
但是 setfsid 调用会像使用原生线程一样使用绿色线程吗?
通过阅读网上有关“绿色线程”的各种文本,我无法收集到太多信息:(
我们有一个使用 Eventlet 模块的现有项目。
有一个服务器使用绿色线程处理客户端请求。所有请求均由单个用户“用户 A”处理
我现在需要更改它以在线程上执行 setfsuid/setfsgid,以便所有底层文件都由请求用户的所有权创建。
我知道我需要 setid Linux 功能来进行 setfsid 调用。
但是 setfsid 调用会像使用原生线程一样使用绿色线程吗?
通过阅读网上有关“绿色线程”的各种文本,我无法收集到太多信息:(
内核对绿色线程一无所知。如果一个进程有一个 uid 和 gid,它会被作为该进程的一部分运行的所有绿色线程使用。
乍一看,您要做的相当于让特权进程在打开/创建文件之前执行setuid,而不是执行第二个setuid来打开/创建第二个文件等。所有这些都是为了确保每个文件都有正确的所有权。我从未尝试过这样的方案,但这听起来非常非常错误。这也是非常糟糕的安全性。您正在以高权限运行,并且可能会发现自己在处理用户 X 的数据时拥有用户 Y 的 uid。
乍一看,绿色线程是协作的,这意味着在幕后,您所做的一些操作将会产生。在这样的产量之后,您可能会更改为另一个将再次更改 uid 的绿色线程......
底线,忘记更改绿色线程的 uid 和 gid - 没有这样的事情。使用您拥有的任何 ID 创建文件,然后将其更改为正确的 ID。出于安全原因,找到一种无需以 root 身份运行的方法。
所有绿色线程都从一个 OS 线程执行。对于内核来说,你的整个 Python 程序似乎只有一个线程。
如果每个请求都需要单独的文件系统 ID,请启动一个单独的 OS 线程,调用setfsuid()
它并在其中执行所需的文件系统调用。
threading = eventlet.patcher.original('threading')