ルートと他のユーザーの両方を必要とする起動プロセスを作成する

ルートと他のユーザーの両方を必要とする起動プロセスを作成する

プロセスを開始するサービスを作成しようとしています。

プロセスの起動時に、root としていくつかのコマンドを実行し、残りのプロセスを権限の低い非人間ユーザーとして実行できるようにしたいと考えています。

たとえば、apacheポートを使用して Web サーバーを構成したり、さまざまなサーバー プロセスを開始したりするには、ユーザーには root 権限が必要であることはわかっていますが、常に root として実行されるわけではありません。これに似た操作を実行するコードは見つからず、他に使用できる例があるかどうか疑問に思っています。

私の質問は基本的に、特定のルートのみのプロセスを実行するために、非ルート ユーザーに一時的なルート権限を付与するにはどうすればよいですか?

それとも、私はこれを間違って考えているのでしょうか:ユーザーに root 権限を付与せず、代わりに root ユーザーに root 権限が必要なプロセスを実行させるのでしょうか?

答え1

ルート ユーザーとして具体的に何をしているかに応じて、かなりの数のオプションがあります。ただし、自動化されたサービス (「Apache など」) の場合、通常はルートとして開始し、制限されたユーザーに切り替えます。

Debianスタイルの設定(UbuntuとMintを含む)では、/etc/default/にファイルがあります。私のサービス名どのユーザーに切り替えるかを設定します。他の Linux ディストリビューションでは設定を保存する場所が異なりますが、手法は最終的には同じです。

サービスプログラムを自分で書く場合は、setuid()一度setuidを呼び出すと、プロセスはルート権限に戻ることができません。名前でユーザーを検索するそしてまたユーザーのグループを設定する

かなり前に書いたコードを簡略化します:

int lockToUser(const char * user) {
    # Look up the username in /etc/passwd
    struct passwd * pwd = getpwnam(user);
    if (!pwd) {
        # Failed... Could not find user, see errno
        return 0;
    }
    # setuid sets the user
    # setgid sets the main group similar to the group in /etc/passwd
    # Sets the other groups which will grant additional permissions.
    #   similar to the groups in /etc/groups
    if (initgroups(user, pwd->pw_gid) || setgid(pwd->pw_gid) || setuid(pwd->pw_uid)) {
        # Failed... Could not lock down to user, see errno
        return 0;
    }
    return 1;
}

関連情報