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);
}
CAP_SETUID
ただし、13の必須機能は非常に広範囲であり、ほとんどのユーザーにはIDの変更を許可するなどの機能はありません。
明らかに、このコードは良いアイデアであり、rsyslogdがrootで始まる場合は、必要な機能を除くすべての機能を削除します。ただし、root 以外のユーザーとして起動したり、特定の機能がない場合、呼び出しは残酷ですexit()
。
解決策は、ソースからrsyslogdをダウンロードし、設定オプション--enable-libcap-ng
(デフォルトでは存在しない)を追加せずに再構築することです。
capng_apply()
あるいは、ゼロを返すように単純なシムダンミ呼び出しを作成することもできます。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 ...