root 用户的 systemd 权限问题

root 用户的 systemd 权限问题

我正在尝试使用 rpm 文件或源代码在 fedora 中设置 hylafax+。 hylafax+ 没有为 systemd 做好准备,所以我编写了以下文件“/etc/systemd/system/hylafax-faxgetty-ttyACM0.service”,该文件在 ubuntu 和 Opensuse 中运行良好:

[Unit]
Description=HylaFAX faxgetty for ttyACM0, ...

[Service]
User=root
Group=root
Restart=always
RestartSec=30
ExecStart=/usr/sbin/faxgetty ttyACM0

[Install]
WantedBy=multi-user.target

但给了我错误“无法设置权限(uid)“在 Fedora 中。当我运行代码时:

/usr/sbin/faxgetty -D ttyACM0

手动以 root 身份运行,它似乎可以运行(该过程仍然存在)。

我在 hylafax+ 的源代码中找到了生成错误消息的单个位置,并对其进行了稍微修改以提供更多信息,如下所示:

faxApp::setupPermissions(void)
{
    if (getuid() != 0)
        faxApp::fatal("The fax server must run with real uid root.\n");
    uid_t euid = geteuid();
    const passwd* pwd = getpwnam(FAX_USER);
    if (!pwd)
        faxApp::fatal("No fax user \"%s\" defined on your system!\n"
            "This software is not installed properly!", FAX_USER);
    if (euid == 0) {
        if (initgroups(pwd->pw_name, pwd->pw_gid) != 0)
            faxApp::fatal("Can not setup permissions (supplementary groups)");
        if (setegid(pwd->pw_gid) < 0)
            faxApp::fatal("Can not setup permissions (gid)");
        if (seteuid(pwd->pw_uid) < 0) {
            char buf[50];
            sprintf(buf,"Perm.for %s %d euid: %d",FAX_USER, pwd->pw_uid, euid);
//          faxApp::fatal("Can not setup permissions (uid)");
            faxApp::fatal(buf);
        }

现在它给了我:

FaxGetty[6359]: Perm.for uucp 10 euid: 0

我的密码文件的相应条目:/etc/passwd:

uucp:x:10:10:Facsimile Agent:/var/spool/hylafax:/bin/bash

/etc/组:

uucp:x:10:uucp

谁能告诉我可能出了什么问题吗?

答案1

从您的输出来看,似乎发生了以下情况:

  • 您的应用程序正在以 root 身份运行。
  • 它能够将组更改为权限较低的组
  • 它尝试切换到权限较低的用户但失败。

第一的,塞特伊德就像系统调用的分配设置错误号这会告诉你实际的错误。最好将其作为错误消息的一部分打印出来,以获取失败的实际原因。

但是,这很可能是权限错误。据您所知,权限错误表明他们有权执行该操作(这对于 root 来说很奇怪,因为他们应该能够执行任何操作),这表明 selinux(或类似的服务,如 apparmour)正在工作。它们是我所知道的唯一可以阻止 root 用户执行某些操作的服务。

判断selinux是否有问题的最快方法(我对apparmour不太熟悉)是检查它是否打开(即“强制”)

sestatus

然后在审核日志中检查 avc 拒绝

sudo grep avc /var/log/audit/audit.log

如果返回任何内容,则 selinux 正在阻止某些内容。您可以通过以下方式暂时将 ti 设置为 permissive 来进一步证明它是 selinux

sudo setenforce 0

如果您现在能够满足您的要求,那么它绝对是 selinux。你现在有两个选择;永久将 selinux 设置为宽松降低系统的安全性(不鼓励)或生成您的应用程序所需的规则

答案2

您应该将User=root和保留Group=root在您的服务文件中。对于作为系统服务启动的进程(它们已经以 root 身份启动)而言,这些是不必要的,并且可能会导致您的进程在更改为另一个 euid 时出现问题。

相关内容