带有eventlet的setfs(u/g)id或set(u/g)id(python green thread)

2024-09-28 05:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个使用Eventlet模块的现有项目。在

有一个服务器使用绿色线程处理客户端请求。 所有请求都由单个用户“user a”处理

现在,我需要更改它,以便在线程上执行setfsuid/setfsgid,以便所有底层文件都是以请求用户的所有权创建的。在

我知道我需要setidlinux功能来进行setfsid调用。在

但是setfsid调用是否可以像处理本机线程那样处理绿色线程?在

通过阅读网上关于“绿色线程”的各种文本,我收集不到太多:


Tags: 模块文件项目用户服务器客户端线程eventlet
2条回答

果核对绿线一无所知。如果一个进程有一个uid和gid,它将被作为该进程一部分运行的所有绿色线程使用。在

乍一看,您所要做的就相当于让一个特权进程在打开/创建文件之前执行一个setuid,而不是执行第二个setuid来打开/创建第二个文件等等,所有这些都是为了确保每个文件都拥有正确的所有权。我从未尝试过这样的计划,但听起来非常错误。从安全角度来说,这也是非常糟糕的。您正在以高权限运行,并且可能会发现自己在处理用户X的数据的同时拥有用户Y的uid。在

再看一眼,绿色线程是合作的,这意味着在引擎盖下,你所做的一些操作将产生效果。在这样的收益率之后,您可以更改为另一个绿色线程,该线程将再次更改uid。。。在

底线是,忘了更改绿色线程的uid和gid—根本没有这样的事情。用你拥有的任何ID创建文件,然后chown找到正确的ID。为了安全起见,找到一种不以root用户身份运行的方法。在

所有绿色线程都是从一个操作系统线程执行的。对于内核来说,整个Python程序只有一个线程。在

如果每个请求需要单独的文件系统ID,请启动一个单独的操作系统线程,在其中调用setfsuid(),并在其中执行所需的文件系统调用。在

threading = eventlet.patcher.original('threading')

相关问题 更多 >

    热门问题