
我開始將 RHEL6 配置為強化的 Tomcat 伺服器並套用 SELinux 策略進行存取控制。安裝 RHEL6 和 Tomcat6(獨立,無 httpd)後,我注意到 Tomcat 進程會以 unconfined_java_t 執行。如何將 Tomcat 限制在所選域中?
答案1
從 RHEL6 開始,預設的 SELinux 使用者對應如下
# semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
git_shell_u user s0 s0 git_shell_r
guest_u user s0 s0 guest_r
root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
sysadm_u user s0 s0-s0:c0.c1023 sysadm_r
system_u user s0 s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
如果您使用標準targeted
策略(檢查/etc/selinux/config
或執行sestatus
以找出答案),則很可能會root
使用unconfined_u
SELinux 使用者對應。id -Z
正如root
將告訴你的。
如果您檢查/etc/init.d/tomcat{6,7}
,您會發現一個if
開關,指出在啟用 SELinux 的系統中runuser
必須使用 ,而不是 plain su
。但是,此命令不會阻止 java 程序繼承 SELinux 使用者映射tomcat
。
這是相關的,我將嘗試展示:
抓住selinux-policy
SRPM,找到java
模組原始碼(檔案上下文、介面和類型執行):
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.fc
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.if
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.te
第一個是不言自明的。它包含在本例中將被標記的路徑java_exec_t
:來自標準和可選位置的二進位檔案和函式庫。
第二個可能是最難理解的。它定義了該策略模組內允許的域轉換。有一個片段與您的問題相關:
template(`java_role_template',`
gen_require(`
type java_exec_t;
')
type $1_java_t;
domain_type($1_java_t)
domain_entry_file($1_java_t, java_exec_t)
role $2 types $1_java_t;
domain_interactive_fd($1_java_t)
userdom_manage_tmpfs_role($2, $1_java_t)
allow $1_java_t self:process { ptrace signal getsched execmem execstack };
dontaudit $1_java_t $3:tcp_socket { read write };
allow $3 $1_java_t:process { getattr ptrace noatsecure signal_perms };
domtrans_pattern($3, java_exec_t, $1_java_t)
corecmd_bin_domtrans($1_java_t, $3)
dev_dontaudit_append_rand($1_java_t)
files_execmod_all_files($1_java_t)
fs_dontaudit_rw_tmpfs_files($1_java_t)
optional_policy(`
xserver_role($2, $1_java_t)
')
')
如該範本的文件所述,「該範本會建立派生域用於java應用程式”,其中“使用者網域的前綴(例如,user是user_t的前綴)”、“與使用者網域關聯的角色”和“使用者網域的類型”均取自執行該指令的SELinux使用者Java 應用程式。
最後,第三個檔案包含類型強制規則和布林定義。
現在,如果您的目的是使用受限的 SELinux 用戶運行 Java 應用程序,則需要編寫自訂策略,因為在當前的參考策略中沒有這樣的東西(我認為在 RHEL6 中沒有,在上游也沒有)。您可以從複製文件開始並從那裡進行實驗。
當然,這不是一件容易的事。