我正在尝试创建一个启动进程的服务。
我希望进程的启动能够以 root 身份执行一些命令,然后以特权较低的非人类用户身份运行进程的其余部分。
例如:我知道apache
用户需要一些 root 权限才能使用端口进行一些 Web 服务器配置并启动各种服务器进程,但它不会始终以 root 身份运行。我找不到任何执行与此类似的操作的代码,并且想知道是否还有其他可以使用的示例。
本质上我的问题是,如何授予非 root 用户临时 root 权限来运行特定的 root 进程?
或者我是否以错误的方式思考这个问题:我是否不授予用户 root 权限,而是让 root 用户运行需要 root 的进程?
答案1
有很多选项,具体取决于您作为根用户所做的事情。然而,对于自动化服务(“如 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;
}