我正在尝试使用 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 时出现问题。