我几乎没有尝试正确使用selinux
将其保持在强制模式下,但我经常遇到它导致我们的应用程序无法正常工作的问题。
我们的 Web 应用程序是 java 后端和angular
前端,部署在tomcat
和 上apache httpd
,后端用作lucene
搜索引擎,每次执行重新索引时都会在文件系统文件夹中创建一个文件。哦,是的,如果这很重要的话,服务器是 CentOS7。
为了其他人的成长,我说阅读非人类的 SELinux 日志/var/log/audit/audit.log
是没有用的,你必须在使用以下命令将其转换为人类之前:
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 文件,很多时候,每次执行新的重新索引时,这意味着每次将新文件上传到 web 应用程序(这是主要功能的一部分)它的。重新创建此文件时,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安装没有正确标记。
解决此问题的最简单方法是安装 Oracle JRE/JDK RPM,而不是使用 tarball/zip 文件,或者至少将 java 目录安装在/usr/java
否则,您可能应该标记/whatever/jre/bin
目录和所有内容,因为bin_t
您可以在此线程中看到 tonioc 回复并执行以下操作
# 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 中的文件获取上下文whatever_t ,命令将是:
# semanage fcontext -a -t whatever_t "/opt/whatever(/.*)?"
# restorecon -R -v /opt/whatever
这应该符合您的预期。看man semanage-fcontext