在嘗試文件上下文時,我遇到了一種奇怪的行為,在我看來我錯過了一些東西。這就是我所做的:
建立一堆目錄和文件
# 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
因此,您需要先新增更一般的規則,然後再新增更具體的規則。或者,更好的是,盡力以每個文件只能匹配一個規則的方式建立規則。