我有一个进程由以 root 身份运行的 damon 启动,现在我想将该进程的权限“降级”为普通用户的权限。这可能吗?如果是的话怎么办?
PS:在Mac上运行unix
答案1
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);
}
...
}
答案2
进程本身必须调用 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
答案3
您可以使用以下命令以其他用户身份运行命令su
:
su USERNAME -c COMMAND
COMMAND
将以权限下降到 的方式运行USER
。
请注意,默认情况下,su
将使用目标用户的 shell 解释器来运行该命令。相比之下, 的默认行为sudo
是将 视为COMMAND
独立程序,即在当前环境中运行。当然,这些默认行为可以通过各种开关和环境变量来更改。
答案4
如果您正在执行不同的可执行文件,即您正在调用execve
或 函数系列中的另一个,可能是通过像or 之exec
类的函数间接调用,并且子进程从一开始就应该在没有特权的情况下运行,那么最简单的方法是获取shell 涉及,并调用.下面概述了 Perl 中的代码,显示了所需的引用:system
popen
su
$shell_command = quotemeta($path_to_executable) . " --option";
$shell_command =~ s/'/'\\''/; # protect single quotes for the use as argument to su
$su_command = sprintf("su -c '%s' %s", $shell_command, quotemeta($user_name));
open(PIPE, "$su_command |") or die;
如果子进程需要以 root 身份启动但稍后删除权限,请参阅这个答案中的代码,它说明了如何在进程中降级权限。