删除进程特权

Sam*_*nia 12 process privileges

我有一个由以 root 身份运行的 damon 启动的进程,现在我想将此进程的权限“降级”为普通用户的权限。这可能吗?如果是如何?

PS:在 mac 上运行 unix

小智 15

sudo tcpdump -Z 使用 initgroups(3)、setgid(2) 和 setuid(2) 来删除自己进程的 root 权限。

# code taken from: 
# http://www.opensource.apple.com/source/tcpdump/tcpdump-32/tcpdump/tcpdump.c

/* Drop root privileges and chroot if necessary */
static void
droproot(const char *username, const char *chroot_dir)
{
...
            if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
               setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
                    fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
                        username, 
                        (unsigned long)pw->pw_uid,
                        (unsigned long)pw->pw_gid,
                        pcap_strerror(errno));
                    exit(1);
            }
...
}
Run Code Online (Sandbox Code Playgroud)

  • 正确的。`initgroups`、`setgid`、`setuid`(最后一个!)正是 unix 上的正确范例,应该始终遵循。此外,一个负责的“droproot”函数会检查它的 uid 和 gid 是否确实已设置,即使所有三个主要函数都返回成功。 (3认同)

pol*_*ial 4

进程本身必须调用 setuid(2)。如果还没有的话,您还应该研究在 chroot(8) 内运行它。据我所知,root无法更改另一个进程的uid。

如果您以 root 身份运行它的原因是为了绑定端口,我建议您以普通用户身份在较高端口上运行它,并在 OS X 上使用 ipfw(8) 将端口 80/443/etc 转发到较高端口:

http://support.crashplanpro.com/doku.php/recipe/forward_port_443_to_pro_server_on_mac_osx