WordPress資安記事

 WordPress 是非常龐雜的系統,資安問題不容易處理,以下是近期處理過的問題,當作備忘錄。

系統資訊

  • 作業系統:Synology DSM 7.2 (Linux)
  • 網站系統:Apache 2.4, PHP 8.2, MariaDB 10.11.6
  • WordPress 5.6.6(自行安裝,不是系統內建版本)

資安問題

改通訊埠沒用,還是要靠防火牆

我習慣會將 DSM 管理介面和 SSH 的通訊埠改掉,想說這樣比較安全。但資訊中心同仁提醒說這只對人類有用,像 SSH 攻擊或 port scanner 會用暴力法每個 port 都試,保險起見還是用防火墻擋起來,限制連線 IP 區間才安全。所以現在就改為僅限校內部分 IP 或網段可以連線 SSH 和管理界面。MySQL/MariaDB 則限制本機連線。

Apache內的陳年古董,一併關掉吧

如果網站伺服器是用 Apache 的話,你可能不知道網址輸入 yoursite.com/icons/ 可以列出一堆古董圖片檔案,那是用在傳統資料夾列表的檔案類型圖示。Apache 伺服器預設允許瀏覽檔案索引(Indexes)可能會洩漏主機內檔案內容、多重視圖(MultiViews)則可能洩漏隱藏檔,都是資安大忌,所以這兩個選項最好關掉。也因此 /icons/ 就等於沒用,可以移除掉,不要留著小漏洞。

關掉 Apache 的檔案索引和多重視圖功能:

資料夾內 .htaccess:
Options -Indexes -MultiViews

全域 .htaccess:
<Directory "路徑">
Options -Indexes -MultiViews
</Directory>

關掉 /icons/ 虛擬路徑:

編輯 /usr/local/etc/apache24/conf/extra/httpd-autoindex.conf
將以下幾行全部加上 # 註解符號,取消作用。

Alias /icons/ "/var/packages/Apache2.4/target//usr/share/icons/"

<Directory "/var/packages/Apache2.4/target//usr/share/icons">
    Options Indexes MultiViews
    AllowOverride None
    Require all granted
</Directory>

若非必要,建議關掉 REST API

除非你用 WordPress 的 REST API 開發應用(例如寫外部程式存取 WordPress 資料),否則最好把 REST API 關掉,要不然駭客會利用它做壞事。以下例子是將所有 /wp-json/* 連結都重導至首頁。不過,因為有些外掛靠 REST API 讀取 WordPress 資料,可能會受到影響。

在全域 .htaccess 加上:

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^wp-json/(.*)$ / [R=301,NC,L]
</IfModule>

防止直接讀取原始碼

像 JavaScaript 原始碼在伺服器端就已經內嵌至 HTML 內,再送到瀏覽器端執行,一般使用者不應該直接讀取 JS 原始碼。如果可以直接讀取或執行,甚至可能夾帶參數,很危險。不需要讓外部使用者直接讀取的檔案都應該加上限制,以下例子是關閉站內所有 js, css 檔案的直接連結。

在全域 .htaccess 加上:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://(.+\.)?yoursite\.com/ [NC]
RewriteRule .*\.(js|css)$ - [F]
</IfModule>

留言