删除进程权限

删除进程权限

我有一个进程由以 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 中的代码,显示了所需的引用:systempopensu

$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 身份启动但稍后删除权限,请参阅这个答案中的代码,它说明了如何在进程中降级权限。

相关内容