damon이 루트로 실행하는 프로세스를 시작했는데 이제 해당 프로세스의 권한을 일반 사용자의 권한으로 "다운그레이드"하고 싶습니다. 가능합니까? 그렇다면 어떨까요?
추신: Mac에서 Unix 실행
답변1
sudo tcpdump -Z
자체 프로세스에서 루트 권한을 제거하려면 initgroups(3), setgid(2) 및 setuid(2)를 사용하십시오.
# 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) 내에서 실행해 보아야 합니다. 내가 아는 한 루트는 다른 프로세스의 uid를 변경할 수 없습니다.
루트로 실행하는 이유가 포트를 바인딩하기 위한 것이라면 일반 사용자로 더 높은 포트에서 실행하고 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
대상 사용자의 쉘 해석기가 이 명령을 실행하는 데 사용됩니다. 이와 대조적으로 의 기본 동작은 sudo
이를 독립 실행형 프로그램으로 처리하는 것입니다 COMMAND
. 즉, 현재 환경 내에서 실행됩니다. 물론 이러한 기본 동작은 다양한 스위치와 환경 변수를 통해 변경될 수 있습니다.
답변4
다른 실행 파일을 실행하는 경우, 즉 or와 같은 함수를 execve
통해 간접적으로 또는 함수 계열에서 다른 실행 파일을 호출 exec
하고 하위 프로세스가 처음부터 권한 없이 실행되어야 하는 경우 가장 쉬운 방법은 다음을 얻는 것입니다. 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;
하위 프로세스를 루트로 시작해야 하지만 나중에 권한이 제거되는 경우 다음을 참조하세요.이 답변의 코드, 프로세스 내에서 권한을 다운그레이드하는 방법을 설명합니다.