我试图在RHEL系统上为SystemD编写一个自定义服务定义。
目前,输出进入日刊,但我需要它在文件中解析并使用logstash转发它。(注:出于我无法控制的原因,新闻业不是一种选择)。
为了将服务日志改为文件,我尝试:
StandardOutput=append:/var/log/myservice服务定义中设置SystemD指令当我尝试启动服务时,status=209/STDOUT会失败。经过一些调试,我发现是SELinux阻止了这种情况:
Additional Information:
Source Context system_u:system_r:init_t:s0
Target Context system_u:object_r:var_log_t:s0
Target Objects mylogfile.log [ file ]
Source (myservice)
Source Path /usr/lib/systemd/systemd
Port <Unknown>
Host myhost.mydomain.net
Source RPM Packages systemd-239-45.el8.x86_64
Target RPM Packages
SELinux Policy RPM selinux-policy-targeted-3.14.3-67.el8.noarch
Local Policy RPM selinux-policy-targeted-3.14.3-67.el8.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
<... truncated ...>
Raw Audit Messages
type=AVC msg=audit(1628237958.525:23268): avc: denied { create } for pid=323316 comm="(myservice)" name="mylogfile" scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file permissive=0
type=SYSCALL msg=audit(1628237958.525:23268): arch=x86_64 syscall=openat success=no exit=EACCES a0=ffffff9c a1=55e0d96f2230 a2=541 a3=1a4 items=0 ppid=1 pid=323316 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm=(myservice) exe=/usr/lib/systemd/systemd subj=system_u:system_r:init_t:s0 key=(null)我理解它告诉我,SystemD (与上下文system_u:system_r:init_t:s0一起运行)不能在我的目录(system_u:object_r:var_log_t:s0)中创建一个文件。
该目录当前为空:
# ls -alZ /var/log/myservice/
total 12
drwxr-xr-x. 2 root root system_u:object_r:var_log_t:s0 6 Aug 6 09:11 .
drwxr-xr-x. 19 root root system_u:object_r:var_log_t:s0 8192 Aug 6 03:13 ..问:允许SystemD将日志写入/var/log的正确方式(策略)是什么?
我尝试过几种使用semanage fcontext的方法,但到目前为止都没有成功。
发布于 2021-12-11 17:59:18
当您可以更改您的自定义服务时,最简单的方法就是在服务的可执行文件中实现日志记录,因为它很可能已经不受限制地运行了。
(除非您已经为您的服务编写了一些SELinux策略)
这也将增加灵活性,例如支持日志文件轮换。我的意思是,我不认为StandardOutput=append:/会支持切换到一个新的文件,以防文件变大。
或者,您可以让专门的日志工具(如Apache的rotatelogs )将服务的标准输出写入/var/log/myservice。
示例:
[Service]
Type=simple
ExecStart=/bin/bash -c 'exec /opt/bin/yourservice > >(exec /sbin/rotatelogs a_few_options /var/log/myservice/logfile rottime_or_size )'这样,您就不必更改服务可执行文件。但是,如果您的服务已经不受限制地运行,那么这样的日志记录助手也应该如此。
另请参阅另一个答案,以了解rotatelogs的一些替代方案。
https://unix.stackexchange.com/questions/663552
复制相似问题