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)
进程本身必须调用 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