RHEL 시스템에서 SystemD에 대한 사용자 정의 서비스 정의를 작성하려고 합니다.
現在の出力はJournalに移動しますが、Logstashを使用して解析して渡すためにファイルに保存する必要があります。 (注:Journalbeatは私が制御できない理由のためのオプションではありません。)
サービスログをファイルにするために、次のことを試みました。
- /var/log/myservice ディレクトリを作成します。
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
これまで成功していませんでした。
ベストアンサー1
カスタムサービスを変更できる場合、最も簡単な方法はサービス実行可能ファイルにロギングを実装することです。サービスがすでに制限なく実行されている可能性があるためです。
(サービスの一部の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
。