CentOS の restorecon は fcontext の順序に従わない

CentOS の restorecon は fcontext の順序に従わない

ファイル コンテキストを試していると、奇妙な動作が発生し、何かが欠けているように見えます。私が行ったことは次のとおりです。

たくさんのディレクトリとファイルを作成する

# mkdir -p /virtual/www/cgi-bin
# touch /virtual/www/cgi-bin/script
# touch /virtual/www/webpage

いくつかのルールをゼロから設定する

# semanage fcontext -D
# semanage fcontext -a -t httpd_sys_script_exec_t '/virtual/www/cgi-bin(/.*)?'
# semanage -a -t httpd_sys_content_t '/virtual/www(/.*)?'

試して!

# restorecon -vr /virtual
restorecon reset /virtual/www context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/cgi-bin context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/cgi-bin/script context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/webpage context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

cgi-bin のより具体的なルールにもかかわらず、すべてのファイル/ディレクトリは httpd_sys_content_t タイプになります。ただし、cgi-bin ディレクトリが必要なのに、その下には httpd_sys_script_exec_t タイプがあります。何が間違っているのでしょうか?

CentOS 6 と RedHat 7 でテストした結果は同じでした。

答え1

selinux で使用されるパターンは並べ替えることができないため (例:.*bと比較b.*)、selinux はルールを特定度ではなく、最後に追加されたもの、最後に適用されたものの順に並べ替えます。

残念ながら、semanage fcontext -l は単純な文字列比較によってルールを順序付けます。これはルールを見つけるのに役立ちますが、複数の一致するルールをデバッグする必要がある場合には役立ちません。

実際に適用される順序は

cat /etc/selinux/targeted/contexts/files/file_contexts.local

したがって、最初により一般的なルールを追加し、次により具体的なルールを追加する必要があります。または、さらに良い方法として、ファイルごとに 1 つのルールのみが一致するような方法でルールを構築するように最善を尽くしてください。

関連情報