使用過 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
Great content! Super high-quality! Keep it up! 🙂
屌上台GG,就不更新QQ