SELinux: 사용자 정의 Systemd 서비스는 StandardOutput을 사용하여 /var/log 디렉토리에 쓸 수 없습니다.

SELinux: 사용자 정의 Systemd 서비스는 StandardOutput을 사용하여 /var/log 디렉토리에 쓸 수 없습니다.

RHEL 시스템에서 SystemD에 대한 사용자 정의 서비스 정의를 작성하려고 합니다.

현재 출력은 Journal로 이동하지만 Logstash를 사용하여 구문 분석하고 전달할 수 있도록 파일에 저장해야 합니다. (참고: Journalbeat는 제가 통제할 수 없는 이유로 인해 옵션이 아닙니다.)

서비스 로그를 파일로 만들기 위해 다음을 시도했습니다.

  1. /var/log/myservice 디렉터리를 만듭니다.
  2. StandardOutput=append:/var/log/myserviceSystemD 서비스 정의의 지시어 설정

서비스를 시작하려고 하면 다음 오류가 발생합니다 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.

관련 정보