プロセスを開始するサービスを作成しようとしています。
一部のコマンドを root として実行し、あまり権限のないユーザー以外のユーザーとして残りのプロセスを実行するプロセスを開始したいと思います。
たとえば、ポートを使用していくつかのWebサーバー構成を実行し、さまざまなサーバープロセスを開始するにはユーザーにroot権限が必要であることがわかりますが、apache
常にrootとして実行されるわけではありません。同様のことをするコードが見つからず、他に利用可能な例があるかどうか疑問に思います。
本質的に私の質問は、特定のルートプロセスを実行するために非rootユーザーに一時的なroot権限を付与する方法は?
それとも私がこれを間違った方法で考えているのでしょうか?ユーザーにroot権限を付与しませんが、rootユーザーがrootを必要とするプロセスを実行できるようにしますか?
答え1
rootユーザーとして実行する操作に応じて、さまざまなオプションがあります。ただし、自動化されたサービス(「apacheなど」)の場合、通常はrootで始まり、制限付きユーザーにダウングレードされます。
Debianスタイルの設定(UbuntuとMintを含む)には/ etc / default /にファイルがあります。私のサービス名切り替えるユーザーを設定します。他のLinuxディストリビューションは設定を保存する場所が異なりますが、技術は最終的に同じです。
サービスプログラムを直接作成する場合は、次を使用します。setuid()。 setuid が呼び出されると、プロセスは root 権限を持つように戻ることはできません。必要です。名前でユーザーを検索そしてユーザーのグループ設定。
ずっと前に書いたいくつかのコードを単純化すると、次のようになります。
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;
}