專案

一般

設定檔

動作

Redmine、Phusion Passenger、Ruby Enterprise Edition、Apache 和... SELinux

免責聲明:在應用以下步驟之前,請確保您了解其詳細資訊。當出現問題時,我不承擔任何責任!!尤其是像安全增強型 Linux 這樣的軟體可能會導致系統的任何部分發生故障。請確保您在可以負擔重新安裝的環境中進行測試,或者您能夠以其他方式將系統還原到良好的狀態。請記住,這是針對 CentOS 5.5 編寫的。其他發行版可能會有所不同。話雖如此,這些說明對我來說效果很好。

本指南已使用以下軟體和版本進行測試

我不會詳細介紹如何安裝這些專案。前三者在其網站上都有很好的說明文件,而後三者則隨作業系統一起提供。

我想要完成的目標

大多數情況下,當 SELinux 造成問題時,一般的建議是停用它。我知道,這可能很麻煩!但它也可以提供很多額外的安全性,所以我希望盡量讓它保持運行,至少在目標模式下。某些系統在這種設定下可能會出現問題,例如受虛擬主機軟體控制的伺服器。在嘗試此操作之前,請考慮這些因素。我建議先使用測試環境。

假設

  • 您至少對 *chown、chmod、chcon*(更改所有權、更改權限、更改 SELinux 安全性標籤)等命令有一定的經驗。
  • 上述軟體已按照其網站上的說明以幾乎預設的方式安裝。
  • 當 SELinux 被停用或在寬鬆模式下運行時,軟體運行良好。
  • 系統上的同一個使用者帳戶用於運行 Apache、Phusion Passenger,以及 Redmine。如果不是,請適當調整。
  • root 使用者是網站檔案的所有者,而 apache 是群組所有者,這意味著 Apache 不能隨意寫入任何檔案或目錄。如果不是,請適當調整。

在執行以下命令之前,您需要停止 Apache,並在完成後重新啟動它。

縮寫和路徑

  • Ruby Enterprise 將簡稱為 RE,並安裝在名為 ${RE} 的路徑中。
  • Phusion Passenger 將簡稱為 PP,安裝在名為 ${PP} 的路徑下。這可能是 RE 下面的某個路徑,例如 ${RE}/ruby/gems/1.8/gems/passenger-x.x.x。
  • Redmine 將簡稱為 RM,安裝在名為 ${RM} 的路徑下。

權限

我們將在此處理兩組不同的權限。首先是檔案系統權限。檔案必須可由網路伺服器使用者讀取,也許可寫入,甚至可執行。其次是 SELinux 權限。如果檔案系統權限不允許存取,則不允許存取。如果檔案系統權限允許存取,則 SELinux 仍然可以根據其自身的一組規則拒絕存取。

Apache 使用者使用 SELinux 可以理解的特定安全性標籤執行。根據此安全性標籤,允許或不允許某些操作。例如,SELinux 策略(= 規則資料庫)規定以安全性標籤 *httpd_t*(= apache)執行的程序可以監聽端口 80。該策略還允許它讀取標記為 *httpd_sys_content_t* 的檔案。

我們將確保檔案系統權限以及 SELinux 權限在需要的地方允許讀取/寫入/執行權限,僅使用現有的 SELinux 標籤,並且兩組權限彼此一致。

Ruby Enterprise Edition 和 Phusion Passenger

基本權限

首先,我們將授予 root 使用者所有權,並撤銷 REE 檔案的所有執行權限。然後,我們將僅恢復目錄上的執行權限,以便可以進入它們。接下來,我們將設置預設的 SELinux 使用者和標籤,以便可以正常使用 REE(實際上,您還需要按照以下步驟操作才能使其正常工作)。

  1. 授予 root 使用者所有權
    chown -R root:root ${RE}
  2. 撤銷所有執行權限,但允許所有者讀取/寫入,以及其他所有人讀取
    chmod -R u=rw,g=r,o=r ${RE}
  3. 僅恢復目錄的執行權限(*請注意,此處 a+X 中的 X 是**大寫**的 X*)
    chmod -R a+X ${RE}
  4. 設定預設的 SELinux 使用者和標籤
    chcon -R -u system_u -t usr_t ${RE}

函式庫

現在,我們將恢復 REE 系統函式庫上的執行權限,並為它們指定函式庫類型的 SELinux 標籤。

  1. 設定所有 "*.so" 檔案的執行權限
    find -P ${RE} -type f -name "*.so*" -exec chmod a+x {} \;
  2. 在 "*.so" 檔案上設定 SELinux 函式庫標籤
    find -P ${RE} -type f -name "*.so*" -exec chcon -t lib_t {} \;
  3. 設定所有 "*.a" 檔案的執行權限
    find -P ${RE} -type f -name "*.a" -exec chmod a+x {} \;
  4. 在 "*.a" 檔案上設定 SELinux 函式庫標籤
    find -P ${RE} -type f -name "*.a" -exec chcon -t lib_t {} \;

二進位檔案

在這裡,我們將恢復 REE 二進位檔案上的執行權限,並設定其 SELinux 標籤。

  1. 設定 *bin* 目錄中所有檔案的執行權限
    find -P ${RE} -type d -name "bin" -exec chmod -R a+x {} \;
  2. 為 *bin* 目錄中的所有檔案設定 SELinux 二進位檔案標籤
    find -P ${RE} -type d -name "bin" -exec chcon -R -t bin_t {} \;

Apache 模組

接下來,我們將確保 Apache 可以將 Phusion Passenger 作為模組載入。SELinux 包含一個用於此目的的標籤(*httpd_modules_t*)。如果模組上沒有此標籤,則 apache 將不允許將其作為模組載入。Phusion Passenger 又會執行一個名為 *ApplicationPoolServerExecutable* 的檔案,該檔案也必須是可執行的。由於它不在 *bin* 目錄中,因此上述操作尚未將該檔案標記為可執行。

  1. 允許 Phusion Passenger 執行 ApplicationPoolServerExecutable
    chmod a+x ${PP}/etc/apache2/ApplicationPoolServerExecutable
    chcon -t bin_t ${PP}/etc/apache2/ApplicationPoolServerExecutable
    
  2. 允許 Apache 將 Phusion Passenger 作為模組執行
    chmod a+x ${PP}/etc/apache2/mod_passenger.so
    chcon -t httpd_modules_t ${PP}/etc/apache2/mod_passenger.so
    

更多關於 Phusion Passenger 的資訊:臨時目錄

Passenger 需要一個可以寫入的臨時目錄。我建議建立一個僅供 PP 使用的目錄,而不是使用系統預設目錄,因為我似乎記得在啟用 SELinux 時,這根本不起作用。有關詳細資訊,請參閱文件中的此部分

PP 臨時目錄由 Apache 配置中的 *PassengerTempDir* 指令設定。在那裡設定它,建立目錄,並調整權限

chown -R apache:apache ${PP_TEMP_DIR}
chmod -R u=rwX,g=rX,o-rwx ${PP_TEMP_DIR}
chcon -R -u system_u -t httpd_tmpfs_t ${PP_TEMP_DIR}

httpd_tmpfs_t 標籤授予 passenger 模組所需的一些額外權限,例如建立特殊檔案,如 sockets 或 fifos。

到目前為止

您可以將我到目前為止描述的步驟下載為 bash 腳本檔案:RubyAndSELinux。請不要直接執行此檔案。請確保您了解它,並根據您的設定更改頂部附近的檔案系統路徑。

還有一個腳本用於使 SELinux 變更在檔案系統重新標記後持續存在:RubyAndSEmanage。請注意,這不會更改任何檔案系統權限,也不會應用策略。它包含 Ruby Enterprise 和 Phusion Passenger 部分中描述的變更,但不包括臨時目錄部分。要應用策略,請執行

touch /.autorelabel
並重新開機。再次強調,請確保您知道自己在做什麼!您可能需要了解一些正則表達式語法才能使此檔案適應您的特定情況。

Redmine

如果您使用這些說明進行到這裡,那麼下一部分將很容易理解。

Redmine 需要一些目錄可寫入才能正常運作。這些是:${RM}/log、${RM}/tmp、${RM}/files 和 ${RM}/public/plugin_assets。

首先,我們設定基本權限(*同樣,ug+X 中的 X 是**大寫** X*)

chown -R root:apache ${RM}
chmod -R u=rw,g=r,o-rwx ${RM}
chmod -R ug+X ${RM}
chcon -R -u system_u -t httpd_sys_content_t ${RM}

然後我們對個別目錄應用權限

chown -R apache:apache ${RM}/log
chcon -R -t httpd_log_t ${RM}/log

chown -R apache:apache ${RM}/tmp
chcon -R -t httpd_tmpfs_t ${RM}/tmp

chown -R apache:apache ${RM}/files
chcon -R -t httpd_sys_script_rw_t ${RM}/files

chown -R apache:apache ${RM}/public/plugin_assets
chcon -R -t httpd_sys_script_rw_t ${RM}/public/plugin_assets

您也可以將我描述的第二部分下載為 bash 腳本檔案:RedmineAndSELinux。請不要直接執行此檔案。請確保您了解它,並根據您的設定更改頂部附近的檔案系統路徑。

總結

  • Ruby Enterprise Edition 的預設安裝似乎對 *.rb 檔案具有一些可執行權限,我認為這些權限不應該存在。我們已經修復了這個問題。
  • Ruby 安裝中檔案的預設 SELinux 標籤已設定為 *usr_t*,函式庫設定為 *lib_t*,可執行檔設定為 *bin_t*,Apache 模組(Phusion Passenger,又名 mod_rails)設定為 *httpd_modules_t*。
  • Phusion Passenger 有一個工作目錄,可以在其中儲存其檔案、上傳和 sockets。
  • Redmine 可以寫入其日誌、檔案目錄、臨時目錄和 plugin_assets 目錄。

備註

我建議堅持使用 Passenger 2.2.15。
雖然可以讓 3.0.2 正常運作,但它會用拒絕訊息淹沒您的審計日誌。

gem uninstall passenger
gem install passenger -v=2.2.15
passenger-install-apache2-module

Sascha Sanches超過 12 年前 更新 · 3 個版本