WordPress on SELinux

使用過 SELinux 的人一定對這套軟體又愛又恨,愛的是他可以協助系統免於惡意傷害,但是往往在防止別人傷害前先傷害了自己人。

2019 年要離開交通大學的實驗室,必須移除在交通大學占用的 IP 地址,因此將網站伺服器轉至 Linode 上。但是轉上去的過程中碰到了蠻多嚴重問題的,原版三台伺服器,由最前端 Proxy 導流量交給後端 Web 伺服器,並讓 Web 伺服器獨立跟 DB 伺服器溝通。

但是上了 Linode 之後就要節省每個月的開銷,三台伺服器合成一台機器使用(希望沒有人想破壞我的伺服器)。這時候就碰到了 SELinux 摧毀 WordPress 的慘狀。

伺服器環境

伺服器 : CentOS 8.0
VPS 廠商:Linode
在目前台灣兩大 VPS 提供商中,Linode 真的比較優秀,除了他在日本有兩個機房以外,他還是少數已經提供 CentOS 8.0 的廠商

安裝指令

如果 CentOS 8 是乾淨安裝的話,管理 SELinux 的指令 semanage 並不會被安裝上去,因此在此要先安裝指令。

可以先利用 yum 查看指令是歸於哪一個套件,這樣才方便後續安裝。

$ yum whatprovides semanage
Last metadata expiration check: 16:26:18 ago on Wed 20 Nov 2019 09:45:45 AM JST.
policycoreutils-python-utils-2.8-16.1.el8.noarch : SELinux policy core python utilities
Repo        : BaseOS
Matched from:
Filename    : /usr/sbin/semanage

由上述結果可以知道指令是在 policycoreutils-python-utils 此套件之中。因此只需安裝此套件即可,但要注意在 CentOS 8 與 CentOS 7 中的 semanage 是在不同套件中,並不可以混用。

yum install -y policycoreutils-python-utils

等待安裝完畢後就可以嘗試使用

semanage -h

SELinux 設定

首先依據 wordpress 的讀寫權限來看,將 wordpress 目錄中的檔案分成可以同時讀寫與唯讀兩個部分。

wordpress 整體目錄屬於唯讀檔案,而可寫入的只有以下一個目錄與兩個檔案。

  • wp-content 目錄,存放網站資料,或是 plugin 以及 theme
  • .htaccess 檔案,用於轉址
  • wp-config.php 檔案, 設定 wordpress 的基本資料

因此依照上述的特徵,將檔案權限規則寫入系統。

#semanage fcontext -a -t httpd_sys_content_t "/var/www/wordpress(/.*)?"
#semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wordpress/wp-content(/.*)?"
#semanage fcontext -a -t httpd_sys_rw_content_t /var/www/wordpress/.htaccess
#semanage fcontext -a -t httpd_sys_rw_content_t /var/www/wordpress/wp-config.php

運行新的規則

#restorecon -R -v /var/www/wordpress/

到此寫入與讀取權限設定完成,接下來開啟 httpd 的特殊功能,利用以下指令查看當前 httpd 的設定。

#getsebool -a | grep 'httpd'

這裡會羅列出所有有關 httpd 在安全相關設定。

如果 DB 不是存在於本機器上,則要讓 httpd 與外部 DB 溝通

#setsebool -P httpd_can_network_connect_db on

因為 plugin 與 theme 頁面都是連接到 api.wordpress.org 上,所以 httpd 必須也可以使用 network connect 功能。

#setsebool -P httpd_can_network_connect on

以下是我沒有開,不過可以試試看的。

httpd 統一處理所有內容檔案

#setsebool -P httpd_unified on

httpd 的寄信功能

#setsebool -P httpd_can_sendmail on

httpd 使用外部 LDAP 帳號認證功能

#setsebool -P httpd_can_connect_ldap on

httpd 使用外部 ftp 檔案傳輸功能

#setsebool -P httpd_can_connect_ftp on

完成並測試

這時候去外掛頁面嘗試看看是否可以 search 或是安裝,同時試試看 wordpress 重新安裝,如果如果一切順利那就正確完成 SELinux 的修正了。

資料來源

wordpress-selinux
semanage command not found in CentOS 8 / RHEL 8

在〈WordPress on SELinux〉中有 2 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *