无法在 CentOS Stream 9 上以非 root 用户身份运行 rsyslogd

无法在 CentOS Stream 9 上以非 root 用户身份运行 rsyslogd

当我以非 root 用户身份运行 rsyslogd 时,我看到这样的错误。不过我可以在 RHEL 上做到这一点(尝试了 8 和 9)

[drizzlex@ray myrsyslog]$ rsyslogd -f /home/drizzlex/myrsyslog/myrsyslog.conf -i /home/drizzlex/myrsyslog/run/myrsyslog.pid
rsyslog internal message (3,-2455): could not transfer  the  specified  internal posix  capabilities settings to the kernel, capng_apply=-5
 [v8.2102.0-113.el9 try https://www.rsyslog.com/e/2455 ]

这是我的conf文件的样子

[drizzlex@ray myrsyslog]$ cat myrsyslog.conf 
module(load="imtcp")
input(type="imtcp" port="6601")

*.* /home/drizzlex/myrsyslog/mylog

答案1

这似乎是一个不幸的改变,禁止任何人跑步 rsyslogd没有 root 权限的情况下运行。代码是 这里

if ((capng_rc = capng_apply(CAPNG_SELECT_BOTH)) != 0) {
  LogError(0, RS_RET_LIBCAPNG_ERR,
   "could not transfer  the  specified  internal posix  capabilities "
   "settings to the kernel, capng_apply=%d\n", capng_rc);
  exit(-1);
}

但所需的 13 项功能非常广泛,大多数用户不具备,例如: CAP_SETUID允许您更改您的 id。

显然,如果 rsyslogd 以 root 身份启动,则此代码是一个好主意,它会删除除必要功能之外的所有功能。但是,如果您以非 root 身份开始,或者没有某些功能,则调用exit()是残酷的。

解决方案是从源下载 rsyslogd,并重建它而不添加配置选项--enable-libcap-ng(无论如何默认情况下不存在)。

或者,您可以创建一个简单的填充程序来虚拟调用, capng_apply()以便它返回 0。创建一个shim_capng.c包含以下内容的文件:

/*
 * capture calls to a routine and replace with your code
 * https://unix.stackexchange.com/a/747252/119298
 * gcc -Wall -O2 -fpic -shared -ldl -o shim_capng.so shim_capng.c
 * LD_PRELOAD=/path/to/shim_capng.so rsyslogd
 */
#include <stdlib.h>
#include <stdio.h>
#include <cap-ng.h>

int capng_apply(capng_select_t set){
    fprintf(stderr, "not calling real capng_apply\n");
    return 0;
}

并编译它

gcc -Wall -O2 -fpic -shared -ldl -o shim_capng.so shim_capng.c

您可能需要安装一些软件包,例如libcap-ng-devel,名称取决于您的发行版,以获得包含文件cap-ng.h

将 rsyslogd 命令替换为

LD_PRELOAD=/path/to/shim_capng.so rsyslogd ...

相关内容