RHEL6:Tomcat 以不受限制的 Java 使用者身分執行

RHEL6:Tomcat 以不受限制的 Java 使用者身分執行

我開始將 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_uSELinux 使用者對應。id -Z正如root將告訴你的。

如果您檢查/etc/init.d/tomcat{6,7},您會發現一個if開關,指出在啟用 SELinux 的系統中runuser必須使用 ,而不是 plain su。但是,此命令不會阻止 java 程序繼承 SELinux 使用者映射tomcat

這是相關的,我將嘗試展示:

抓住selinux-policySRPM,找到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 中沒有,在上游也沒有)。您可以從複製文件開始並從那裡進行實驗。

當然,這不是一件容易的事。

相關內容