SELinux:無法將 Firefox 程序限制在 mozilla_t 域
我的目標是在
mozilla_t
域中執行 Firefox 而不是unconfined_t
. 這台機器在強制模式下執行帶有 SELinux 的 Fedora 20。不幸的是,我似乎無法做到這一點。無論我做什麼,該過程總是在
unconfined_t
域中執行。我知道要滿足三個條件:
- 目標文件上下文 (
mozilla_exec_t
) 必須對源域 (unconfined_t
或bin_t
)是可執行的- 目標文件上下文 (
mozilla_exec_t
) 必須標記為目標域 (mozilla_t
)的入口點- 必須允許源域 (
unconfined_t
或) 轉換到目標域 ( )bin_t``mozilla_t
/usr/bin/firefox
目標文件是呼叫的 firefox 腳本/usr/lib64/firefox/run-mozilla.run
,它再次執行二進製文件/usr/lib64/firefox/firefox
。這是ls -Z
這些文件的輸出:-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/bin/firefox -rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/lib64/firefox/run-mozilla.sh -rwxr-xr-x. root root system_u:object_r:mozilla_exec_t:s0 /usr/lib64/firefox/firefox
滿足第一個條件,
unconfined_t
允許執行目標文件上下文mozilla_exec_t
。$ sesearch -s unconfined_t -t mozilla_exec_t -c file -p execute -Ad Found 1 semantic av rules: allow unconfined_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
滿足第二個條件,
mozilla_exec_t
定義為mozilla_t
域的入口點。$ sesearch -s mozilla_t -t mozilla_exec_t -c file -p entrypoint -Ad Found 1 semantic av rules: allow mozilla_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
根據 Fedora 20 中的預設配置,不滿足****第三個條件,因為無法轉換到.
unconfined_t``mozilla_t
$ sesearch -s unconfined_t -t mozilla_t -c process -p transition -Ad (no output)
為了解決這個問題,我編寫了一個簡短的策略模組,該模組授予
unconfined_t
程序轉換到mozilla_t
.module rekado 1.0; require { type unconfined_t; type mozilla_t; class process transition; } allow unconfined_t mozilla_t : process transition ;
現在我應該能夠
mozilla_t
通過直接執行執行檔在域中執行 Firefox 程序/usr/lib64/firefox/firefox
,但該程序仍保留在域中unconfined_t
。這裡發生了什麼?為什麼不是程序上下文
mozilla_t
?
你幾乎擁有它。問題是允許規則
允許 unconfined_t mozilla_t :程序轉換;
允許過渡發生,但不會導致它發生。為此,您需要一個 type_transition 規則:
type_transition unconfined_t mozilla_exec_t : 程序 mozilla_t;
這會導致在 unconfined_t 程序執行 mozilla_exec_t 文件時發生轉換。
完成後,Firefox 將無法執行。我使用 audit2allow 來追踪允許 Firefox 管理臨時文件和套接字所需的附加規則。
這是適用於我基於 CentOS 6 的 VM 的策略。它需要啟用 selinux 布爾 mozilla_read_content(通過:)
setsebool -P mozilla_read_content 1
。module mozilla 1.0; require { role unconfined_r; type unconfined_t; type mozilla_t; type mozilla_exec_t; type tmp_t; type user_tmp_t; type fs_t; class process transition; class file { ioctl getattr setattr create read write unlink open relabelto }; class dir { ioctl getattr setattr create read write unlink add_name remove_name }; class filesystem getattr; class sock_file { getattr setattr create read write unlink }; class unix_stream_socket connectto; } role unconfined_r types mozilla_t; allow unconfined_t self:file relabelto; allow unconfined_t mozilla_t : process transition ; type_transition unconfined_t mozilla_exec_t : process mozilla_t; allow mozilla_t fs_t:filesystem getattr; allow mozilla_t tmp_t:file { ioctl getattr setattr create write unlink open }; allow mozilla_t tmp_t:dir { ioctl getattr setattr create read write add_name remove_name }; allow mozilla_t user_tmp_t:dir { ioctl create write add_name setattr remove_name }; allow mozilla_t user_tmp_t:sock_file { getattr setattr create read write unlink }; allow mozilla_t unconfined_t:unix_stream_socket connectto;
要編譯和安裝它:
checkmodule -M -m -o mozilla.mod mozilla.te
checkmodule:從 rekado.te 載入策略配置 checkmodule:載入策略配置
checkmodule
:將二進製表示(版本 10)寫入 mozilla.mod
semodule_package -o mozilla.pp -m mozilla.mod
sudo semodule -i mozilla.pp