1. 安裝SELinux管理工具
在Ubuntu上自定義SELinux規則前,需先安裝必要的工具包。執行以下命令安裝selinux-basics
(基礎SELinux管理工具)、selinux-policy-default
(默認策略)及auditd
(審計工具,用于收集拒絕日志):
sudo apt update
sudo apt install selinux-basics selinux-policy-default auditd
2. 啟用SELinux并設置為Permissive模式
Ubuntu默認可能未啟用SELinux,需通過修改配置文件開啟。編輯/etc/selinux/config
文件,取消SELINUX
和SELINUXTYPE
的注釋,并設置為以下值:
SELINUX=permissive # 先設為permissive模式(僅記錄拒絕事件,不阻止操作)
SELINUXTYPE=targeted # 使用targeted策略(針對特定進程,不影響系統整體)
保存后重啟系統使配置生效:
sudo reboot
注:Permissive模式是自定義規則的必要步驟,避免因規則錯誤導致系統無法正常運行。
3. 創建自定義SELinux策略模塊
自定義規則需通過.te
(類型啟用)文件定義。以下以“允許my_script
進程訪問/var/www/html
目錄”為例,步驟如下:
mkdir -p ~/selinux-custom-policy
cd ~/selinux-custom-policy
.te
文件:my_custom_policy.te
文件,內容如下(關鍵部分說明見注釋):policy_module(my_custom_policy, 1.0) # 定義模塊名稱(my_custom_policy)和版本(1.0)
# 聲明類型(若未定義,需手動添加)
type my_script_t; # 進程類型(對應my_script的可執行文件)
type my_script_exec_t; # 可執行文件類型
type httpd_sys_rw_content_t; # 目標目錄類型(Apache默認可讀寫目錄)
# 定義進程域(將進程與可執行文件關聯)
init_daemon_domain(my_script_t, my_script_exec_t)
# 允許規則(允許my_script_t進程對httpd_sys_rw_content_t類型的目錄進行讀寫)
allow my_script_t httpd_sys_rw_content_t:dir { read write };
保存文件后,可通過audit2allow
工具從系統拒絕日志快速生成規則(適用于已知拒絕事件的場景):grep avc /var/log/audit/audit.log | audit2allow -M my_custom_policy
此命令會生成my_custom_policy.te
(類型定義)和my_custom_policy.pp
(編譯后的策略模塊)文件。4. 編譯并加載自定義策略模塊
使用checkmodule
(編譯類型定義)和semodule_package
(打包策略模塊)工具編譯.te
文件:
checkmodule -M -m -o my_custom_policy.mod my_custom_policy.te
semodule_package -o my_custom_policy.pp -m my_custom_policy.mod
編譯完成后,使用semodule
命令加載模塊:
sudo semodule -i my_custom_policy.pp
加載后,模塊會永久保存到SELinux策略中(無需重啟系統)。
5. 應用文件上下文并驗證規則
semanage fcontext
命令為自定義目錄添加上下文(關聯到httpd_sys_rw_content_t
類型),確保進程能識別:sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?"
-a
表示添加規則,-t
指定類型,(/.*)?
表示匹配/var/www/html
及其子目錄。restorecon
命令恢復目錄的實際上下文:sudo restorecon -Rv /var/www/html
-R
表示遞歸處理,-v
顯示詳細過程。sudo ausearch -m avc -ts recent | audit2why
若輸出顯示“avc: denied
”事件消失,則說明規則生效。注意事項