Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 这是否可以切换应用程序线程的用户和组?_Multithreading_Unix_Rust_File Permissions_Setuid - Fatal编程技术网

Multithreading 这是否可以切换应用程序线程的用户和组?

Multithreading 这是否可以切换应用程序线程的用户和组?,multithreading,unix,rust,file-permissions,setuid,Multithreading,Unix,Rust,File Permissions,Setuid,我想在Rust中构建一个小型web应用程序,它应该能够代表用户读写文件。用户应使用其UNIX凭据进行身份验证,然后只能读/写他们有权访问的文件 我的第一个想法(对我来说也是最安全的)是切换应用程序线程的用户上下文,并在那里执行所有读/写操作。这可能吗 如果这是可能的,性能会是什么样子?我假设每次请求传入时生成一个操作系统线程可能会有很高的开销。有更好的方法吗 我真的不想以root用户身份运行整个应用程序并手动检查权限。在GNU/Linux上,仅为进程的单个线程切换UID和GID是不可能的。Lin

我想在Rust中构建一个小型web应用程序,它应该能够代表用户读写文件。用户应使用其UNIX凭据进行身份验证,然后只能读/写他们有权访问的文件

我的第一个想法(对我来说也是最安全的)是切换应用程序线程的用户上下文,并在那里执行所有读/写操作。这可能吗

如果这是可能的,性能会是什么样子?我假设每次请求传入时生成一个操作系统线程可能会有很高的开销。有更好的方法吗


我真的不想以root用户身份运行整个应用程序并手动检查权限。

在GNU/Linux上,仅为进程的单个线程切换UID和GID是不可能的。Linux内核维护每个线程的凭据,但POSIX要求每个进程有一组凭据:POSIX
setuid
必须更改所有线程的UID,否则不更改。glibc尽了很大的努力来模拟POSIX行为,尽管这相当困难


您必须为每个请求创建一个全新的进程,而不仅仅是一个新线程。进程创建在Linux上非常便宜,但它仍然可能是一个性能问题。您可以保留一个进程池,以避免重复创建进程的开销。另一方面,许多年前,许多网站(包括一些相当大的网站)都使用CGI生成网页,通过简单的设计,您可以走得更远。

在GNU/Linux上,仅为进程的单个线程切换UID和GID是不可能的。Linux内核维护每个线程的凭据,但POSIX要求每个进程有一组凭据:POSIX
setuid
必须更改所有线程的UID,否则不更改。glibc尽了很大的努力来模拟POSIX行为,尽管这相当困难


您必须为每个请求创建一个全新的进程,而不仅仅是一个新线程。进程创建在Linux上非常便宜,但它仍然可能是一个性能问题。您可以保留一个进程池,以避免重复创建进程的开销。另一方面,许多年前,许多网站(包括一些相当大的网站)使用CGI生成网页,你可以通过简单的设计走得更远。

我认为@Florian在最初的回答中把这一点倒过来了<代码>人2 setuid显示

C库/内核差异

在内核级别,用户ID和组ID是每个线程的属性。但是,POSIX要求进程中的所有线程 共享相同的凭据。NPTL线程实现处理 POSIX通过为各种 系统调用该更改过程 UID和GID。这些包装函数(包括setuid()的包装函数)采用基于信号的技术来确保 线程更改凭据,进程中的所有其他线程 还要更改他们的凭据。有关详细信息,请参见nptl(7)

由于libc在整个过程中都进行信号舞蹈,因此您必须进行直接的系统调用来绕过它


请注意,这是特定于linux的。大多数其他unix变体似乎在内核级别上遵循posix,而不是在libc中模拟它。

我认为@Florian在最初的回答中把这一点颠倒了过来<代码>人2 setuid显示

C库/内核差异

在内核级别,用户ID和组ID是每个线程的属性。但是,POSIX要求进程中的所有线程 共享相同的凭据。NPTL线程实现处理 POSIX通过为各种 系统调用该更改过程 UID和GID。这些包装函数(包括setuid()的包装函数)采用基于信号的技术来确保 线程更改凭据,进程中的所有其他线程 还要更改他们的凭据。有关详细信息,请参见nptl(7)

由于libc在整个过程中都进行信号舞蹈,因此您必须进行直接的系统调用来绕过它


请注意,这是特定于linux的。大多数其他unix变体似乎在内核级别遵循posix,而不是在libc中模拟它。

我澄清了我的答案。对于GNU/Linux,我指的是带有GNU(glibc)用户区的Linux内核。其他libc的行为可能有所不同。glibc可能无法通过直接系统调用对UID/GID更改做出良好反应。我澄清了我的答案。对于GNU/Linux,我指的是带有GNU(glibc)用户区的Linux内核。其他libc的行为可能有所不同。glibc可能无法通过直接系统调用对UID/GID更改做出良好反应。