SELinux - プロセスが新しく作成されたファイルをフォルダに書き込むのを防ぐ方法

SELinux - プロセスが新しく作成されたファイルをフォルダに書き込むのを防ぐ方法

強制モードを維持するために正しく使用したことはほとんどありませんがselinux、これはアプリが正しく動作しないという問題を頻繁に引き起こします。

私たちのWebアプリケーションは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ファイルを頻繁に再生成するため、この問題はまだ存在すると思います。これは、新しいファイルが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インストールにタグが正しく指定されていないことです。

この問題を解決する最も簡単な方法は、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

関連情報