SELinux - 프로세스가 새로 생성된 파일을 폴더에 쓰는 것을 방지하는 방법

SELinux - 프로세스가 새로 생성된 파일을 폴더에 쓰는 것을 방지하는 방법

강제 모드를 유지하기 위해 제대로 사용해 본 적은 거의 없지만 selinux, 이로 인해 앱이 제대로 작동하지 않는 문제가 자주 발생합니다.

우리 웹 애플리케이션은 Java 백엔드 및 프론트엔드이며 및 angular에 배포되며 백엔드는 검색 엔진으로 사용되며 재색인이 수행될 때마다 파일 시스템 폴더에 파일을 생성합니다. 아, 그렇습니다. 중요한 경우 서버는 CentOS7입니다.tomcatapache httpdlucene

다른 사람들의 성장을 위해 /var/log/audit/audit.log사람이 아닌 SELinux 로그를 읽는 것은 소용이 없으며 사용하기 전에 이를 사람으로 변환해야 합니다.

sealert -a /var/log/audit/audit.log > /var/log/audit/audit_human_readable.log

제 경우 로그 내용은 다음과 같습니다.

SELinux is preventing /whatever/jre/bin/java from write access on the file /opt/whatever/write.lock

그리고 다음과 같은 방법으로 문제를 해결하는 것이 좋습니다.

If you want to allow java to have write access on the write.lock file
Then you need to change the label on /opt/whatever/write.lock
Do
# semanage fcontext -a -t FILE_TYPE '/opt/whatever/write.lock'
where FILE_TYPE is one of the following: afs_cache_t, initrc_tmp_t, pki_common_t, pki_ra_log_t, pki_tomcat_cert_t, pki_tomcat_etc_rw_t, pki_tomcat_log_t, pki_tomcat_var_lib_t, pki_tps_log_t$
Then execute:
restorecon -v '/opt/whatever/write.lock'

이것은 매우 훌륭하고 완전한 제안처럼 보입니다. 과거에 이 제안을 구현했지만 상위 폴더에서는 이것이 하위 항목에도 적용되기를 바라지만 문제가 지속됩니다.

나는 Lucene이 새로운 재색인이 수행될 때마다 자주 Java 프로세스를 통해 write.lock 파일을 자주 다시 생성하기 때문에 이 문제가 여전히 존재한다고 생각합니다. 이는 새 파일이 웹 애플리케이션에 업로드될 때마다(주요 기능) 그것의 일부. 이 파일을 다시 생성할 때 SElinux 컨텍스트가 올바르게 상속되지 않았습니다.

특정 폴더 아래에 생성된 모든 파일이 상위 디렉터리에서 특정 SElinux 컨텍스트를 상속하도록 어떻게 구성할 수 있나요?

편집: (감사 로그)

type=AVC msg=audit(1528202320.971:33808): avc:  denied  { write } for  pid=31394 comm="java" name="index" dev="dm-0" ino=57073 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=dir
type=AVC msg=audit(1528202320.971:33808): avc:  denied  { remove_name } for  pid=31394 comm="java" name="write.lock" dev="dm-0" ino=57076 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=dir
type=AVC msg=audit(1528202320.971:33808): avc:  denied  { unlink } for  pid=31394 comm="java" name="write.lock" dev="dm-0" ino=57076 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=file
type=SYSCALL msg=audit(1528202320.971:33808): arch=c000003e syscall=87 success=yes exit=0 a0=7f4a549d8db0 a1=7f4a8c92e1c8 a2=0 a3=3536353030303030 items=2 ppid=1 pid=31394 auid=4294967295 uid=91 gid=91 euid=91 suid=91 fsuid=91 egid=91 sgid=91 fsgid=91 tty=(none) ses=4294967295 comm="java" exe="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/bin/java" subj=system_u:system_r:tomcat_t:s0 key=(null)

편집 2: (ps -auxZ)

# ps -auxZ | grep tomcat
system_u:system_r:tomcat_t:s0   tomcat    1026  1.2 30.7 9637644 7535952 ?     Ssl  May09 514:38 /usr/lib/jvm/jre/bin/java -(and so on)
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 31648 0.0  0.0 112712 976 pts/0 S+ 14:58   0:00 grep --color=auto tomcat

답변1

주요 문제는 Java 설치에 태그가 올바르게 지정되지 않았다는 것입니다.

이 문제를 해결하는 가장 쉬운 방법은 tarball/zip 파일을 사용하는 대신 Oracle JRE/JDK RPM을 설치하거나 최소한 다음 위치에 java 디렉토리를 설치하는 것입니다./usr/java

그렇지 않으면 이 스레드에서 tonioc의 답변을 볼 수 /whatever/jre/bin있으므로 디렉토리와 모든 항목에 태그를 지정 bin_t하고 다음을 수행해야 합니다.

# semanage fcontext -a -t bin_t "/whatever/jre/bin(/.*)?"
# restorecon -R -v /whatever/jre/bin

편집하세요. 다음과 같이 할 수도 있습니다.

# semanage fcontext -a -t lib_t "/whatever/jre/lib(/.*)?"

답변2

/opt/whatever에 있는 파일이 everything_t 컨텍스트를 가져오길 원한다고 가정하면 명령은 다음과 같습니다.

# semanage fcontext -a -t whatever_t "/opt/whatever(/.*)?"
# restorecon -R -v /opt/whatever

이것이 당신이 기대하는 것이어야합니다. 바라보다남자 semanage-fcontext

관련 정보