其流程去缓和权限通过setuid()
和setgid()
似乎没有继承的UID / GID他们设置了组成员。
我有一个服务器进程,必须以root用户身份执行才能打开特权端口。后,它的去升级到一个特定的非privilleged UID / GID,1 -例如,其的用户foo
(UID 73)。用户foo
是组的成员bar
:
> cat /etc/group | grep bar
bar:x:54:foo
因此,如果我以登录foo
,则可以读取/test.txt
具有以下特征的文件:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
但是,std=gnu99
当以root 身份运行时,以下C程序(compile ):
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
始终报告“ 权限被拒绝”。我想这与它是一个非登录过程有关,但是在某种程度上限制了权限的工作方式。
1.这通常是服务器的SOP,我认为应该有一种解决方法,因为我发现有人用apache 进行报告 – apache已添加到音频组中,并且显然可以使用声音系统。当然,这很可能发生在fork中,而不是原始过程中,但实际上在我的上下文中情况是一样的(这是setuid调用后分叉的子过程)。
setgid(54)
而不是setgid(73)
(如/etc/groups
,组bar
中的ID为54),是否有效?
setuid()
这样做之后您将无法再做...但是,嗯...我想您可以seteuid()
……
setuid()
/setgid()
呼叫。