
プロセスを開始するサービスを作成しようとしています。
プロセスの起動時に、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;
}