プロセス権限の削除

プロセス権限の削除

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のコードは以下に説明されており、必要な参照を示しています。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として起動する必要がありますが、後で権限が削除される場合は、次を参照してください。この回答のコード、プロセス内で権限をダウングレードする方法について説明します。

関連情報