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

因此,您需要先新增更一般的規則,然後再新增更具體的規則。或者,更好的是,盡力以每個文件只能匹配一個規則的方式建立規則。

相關內容