创建需要 root 和其他用户的启动进程

创建需要 root 和其他用户的启动进程

我正在尝试创建一个启动进程的服务。

我希望进程的启动能够以 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;
}

相关内容