damonがrootとして実行するプロセスを始めましたが、そのプロセスの権限を一般ユーザーの権限として「ダウングレード」したいと思います。可能ですか?それではどうでしょうか?
PS:MacでUnixを実行する
答え1
sudo tcpdump -Z
独自のプロセスから root 権限を削除するには、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)内で実行してみてください。私が知っている限り、rootは他のプロセスの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;
子プロセスをrootとして起動する必要がありますが、後で権限が削除される場合は、次を参照してください。この回答のコード、プロセス内で権限をダウングレードする方法について説明します。