当我以非 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 ...