為您的 WordPress 網站加固 MySQL

已發表: 2023-01-18

WordPress 是最流行的 CMS,運行在 MySQL 上,這是目前最流行的數據庫。 花一些時間確保您的 MySQL 安裝和 WordPress 數據庫配置安裝針對常見的攻擊向量進行了充分強化,可以幫助您降低風險。 如果您自己管理 MySQL 服務器,則尤其如此。

值得注意的是,許多 WordPress 安裝使用 MariaDB,它是 MySQL 的一個分支。 由於兩者的工作方式非常相似,我們將使用 MySQL 來表示 MySQL 和 MariaDB。 無論您運行的是哪種 RDMS,強化 MySQL 都可以幫助您最大限度地降低黑客攻擊的風險。 但是,這不會取代其他安全措施,例如安裝 Web 應用程序防火牆,確保您擁有最新版本的插件、主題和 WordPress,以及加固 WordPress。

注意,本文針對的是運行在 Linux (Ubuntu) 上的 MySQL 8.0。 雖然這些概念將轉化為其他操作系統和 MySQL/MariaDB 版本,但這些示例中使用的命令和文件路徑可能有所不同。 在對生產系統進行任何更改之前,強烈建議在暫存或預生產環境中測試任何更改。

在這篇主要針對那些管理自己的 MYSQL 的文章中,我們提供了一些關於如何保護 MySQL 的技巧和教程。 即便如此,本文中提供的大量最佳實踐對於任何管理 WordPress 網站的人來說都值得一讀。 保護您的 MySQL 服務器是維護 WordPress 安全以及保護您自己免受不同類型的暴力攻擊、惡意軟件注入和其他類型攻擊的關鍵步驟。

目錄

  • 考慮使用數據庫即服務 (DBaaS)
  • 使 MySQL 保持最新
  • 在專用機器上運行 MySQL
  • 將 MySQL 綁定到 IP 地址
  • 限制使用基於網絡的 GUI 工具
  • 使用專用用戶運行 MySQL 守護進程
  • 使用 mysql_secure_installation 腳本
  • 創建專用的 WordPress 數據庫用戶
  • 確保禁用 local_infile
  • 禁用 MySQL 命令歷史記錄
  • 確保 mysqld 未使用 –skip-grant-tables 參數啟動
  • 備份你的數據庫
    • 經常備份
    • 經常驗證備份的完整性
    • 安全地存儲您的備份
  • 啟用和執行 TLS 連接
    • 更改表前綴
    • 如何實施改變
    • 確保您的 WordPress 安全

考慮使用數據庫即服務 (DBaaS)

如果您沒有在託管計劃中託管 WordPress,那麼數據庫即服務非常值得考慮。 它用您連接的服務取代了在本地安裝 MySQL 的傳統模式。 如果您使用提供託管數據庫服務的託管服務提供商來運行 WordPress 網站,這可能適合您的用例。 可用選項通常包括 Amazon RDS、DigitalOcean Managed MySQL 和 Linode Managed MySQL)。 從表面上看,這些服務比自己運行 MySQL 的成本更高。 但是,他們承擔了運行生產級數據庫的所有繁重工作。 大多數服務包括安全最佳實踐預設、持續的安全補丁和維護以及備份。

就安全性和可靠性而言,使用數據庫即服務 (DBaaS) 是最佳選擇之一。 雖然這不是強制性的,但它仍然是一個很好的選擇。 但是,如果您希望自己管理 MySQL,請牢記以下一系列強化技巧。

使 MySQL 保持最新

正如確保您運行最新版本的 WordPress 很重要一樣,讓 MySQL 保持最新也很重要。 與大多數其他軟件一樣,MySQL 服務器的更新會定期發布。 這些更新解決了錯誤、緩解了漏洞並提供了新功能。 您應該使用最新的安全補丁使 MySQL 保持最新狀態,以降低運行具有已知漏洞的軟件的風險。 請記住,一旦更新,您將需要重新啟動“mysql 守護程序”。 這是一個可能會導致停機的過程。 一如既往,提前計劃。

在專用機器上運行 MySQL

許多 WordPress 安裝在同一台機器上運行 MySQL、PHP 和 Web 服務器(例如 Nginx 或 Apache HTTP 服務器)。 這不是最佳的——無論是在性能還是安全方面。 理想情況下,MySQL 應該在專用服務器上運行,以減少攻擊的爆炸半徑。 如果攻擊者設法破壞並提升 Web 服務器上的權限,那麼攻擊者將更難橫向移動並破壞 MySQL 服務器。

將 MySQL 綁定到 IP 地址

您可以將 MySQL 配置為僅接受來自特定 IPv4 或 IPv6 接口的 TCP/IP 連接。 您需要做的就是將綁定地址配置選項設置為特定的 IP 地址。 這對客戶端應用程序(在我們的例子中是 WordPress)如何連接到 MySQL 提供了額外的控制和限制。 默認情況下,此設置設置為 *,這意味著開箱即用的 MySQL 將偵聽所有接口。

如果沒有配置監聽特定IP,所有IP都可以用來連接MySQL。 如果你在同一台機器上運行 MySQL 作為你暴露給 Internet 的 Web 服務器(在這種情況下,你應該將 bind-address 設置為 127.0.0.1 以便 MySQL 僅在本地主機上偵聽),則此設置尤為重要。 .

例如,如果您希望 MySQL 服務器僅接受特定 IPv4 地址上的連接,您可以添加類似於以下示例的條目。 您應該在服務器的 /etc/mysql/mysql.conf.d/mysqld.cnf 配置文件中的 [mysqld] 選項組下輸入它。

綁定地址=192.168.0.24

請注意,一旦您設置了此項,您將需要重新配置 WordPress 以使用此 IP 地址連接到數據庫(除非它已經這樣做),因為不允許連接到其他服務器主機地址。

限制使用基於網絡的 GUI 工具

許多 WordPress 安裝包括基於 Web 的前端圖形管理工具。 常見示例包括 Cpanel、phpMyAdmin 或 Adminer。 這些工具使管理 MySQL 和底層基礎設施的其他方面變得更加容易。 雖然基於 Web 的圖形界面可以幫助您管理 MySQL 數據庫,但這些界面可以通過添加另一個向量來增加攻擊面。 此外,存在被攻擊者發現和濫用以對您的數據庫運行破壞性或惡意 SQL 查詢的風險。 攻擊甚至可能導致完全接管您的 WordPress 網站。

唯一安全的服務器是關閉和拔掉插頭的服務器——但是,風險是可以控制的。 卸載非關鍵系統是一種選擇; 但是,這些也可以被鎖定和限制以將風險降至最低。

可以通過多種方式限制對這些工具的訪問。 您可以為 WordPress 遠程安裝 phpMyAdmin,從而最大限度地降低 Web 服務器的風險。 或者,您可能還想考慮在本地計算機上使用 MySQL Workbench 或 Beekeeper Studio 等工具,並通過 SSH 隧道連接到數據庫服務器。

使用專用用戶運行 MySQL 守護進程

與在服務器上運行的其他服務一樣,您可以在專用用戶下運行 MySQL 守護進程。 當您使用專用用戶運行 MySQL 時,您可以精確地定義該用戶在系統中被授予的權限。 在專用用戶下運行 MySQL 也遵循最小權限原則,因為這減少了 MySQL 漏洞的爆炸半徑。 它還減少了錯誤配置被利用的可能性,因為受限用戶將無法訪問與 MySQL 無關的資源(例如操​​作系統配置和機密)。

好消息是,通過包管理器(例如 apt 或 yum)進行安裝會在安裝 MySQL 時自動完成此步驟。 驗證 MySQL 是否在專用用戶下運行的快速方法是在運行 MySQL 守護程序的機器上運行以下命令。

ps-ef | egrep “^mysql.*$”

如果 MySQL使用專用用戶運行,您應該期望看到至少返回 ps 輸出的一行。

使用 mysql_secure_installation 腳本

mysql-server 包附帶一個名為 mysql_secure_installation 的 shell 腳本實用程序。 您可以使用此腳本為 MySQL 服務器設置安全起點。 因此,您應該在全新安裝 MySQL 後運行它。 此實用程序可幫助您:

  • 為根帳戶設置密碼
  • 刪除可從本地主機外部訪問的根帳戶
  • 刪除匿名用戶帳戶
  • 刪除測試數據庫(默認情況下,匿名用戶可以訪問)

要調用 mysql_secure_installation,請運行以下命令:

須藤 mysql_secure_installation

設置過程開始後,您將看到幾個提示,詢問您是否要啟用驗證密碼插件,該插件用於測試您為 MySQL 用戶選擇的密碼強度。 建議您啟用此插件。

啟用驗證密碼插件後,腳本會要求您指定密碼驗證策略。 在這裡,您應該選擇強密碼策略。 隨後將要求您重置 root 用戶的密碼。

接下來,該腳本將提示您刪除匿名 MySQL 用戶。 這對於減少攻擊者通過利用匿名 MySQL 用戶訪問數據庫服務器的機會非常重要。

下一個提示將詢問您是否要在對 MySQL 服務器進行遠程身份驗證時禁用使用 root 用戶登錄。 使用 root 用戶進行遠程身份驗證很危險,而且很少需要。 相反,您應該通過 SSH 連接到 MySQL 並使用服務器上的 MySQL 客戶端以 root 用戶身份進行身份驗證,或者最好使用 SSH 隧道將遠程 MySQL 端口轉發到本地計算機並使用本地客戶端進行連接。

接下來,系統會要求您刪除 MySQL 附帶的默認數據庫(如果存在)。 這是生產 MySQL 服務器的推薦做法。

刪除默認數據庫

最後,系統會詢問您是否要為所有已應用生效的更改重新加載權限表。

創建專用的 WordPress 數據庫用戶

安全最佳實踐規定按職責或角色分離用戶和權限。 這意味著每個使用數據庫的應用程序都應該有自己的專用用戶,這些用戶具有執行其工作所需的最少 MySQL 數據庫權限。 因此,您將確保用戶權限不會超過所需權限。

這種做法應該擴展到運行多個 WordPress 網站的部署——每個 WordPress 網站都應該有自己的專用數據庫和 MySQL 用戶。 這樣可以確保在任何時候,一次只有一個用戶可以訪問一個數據庫,用戶不能訪問其他數據庫,從而避免未經授權的訪問和數據洩露。

以下 SQL 語句(替換 <host> 和 <password> 和 <database> 以滿足您的需要)可用於為您的 WordPress 網站創建專用用戶並授予常規使用權限。 請記住,某些 WordPress 插件、主題和 WordPress 更新有時可能需要額外的權限才能正常運行(有關更多信息,請參閱官方 WordPress 指南)

確保禁用 local_infile

LOAD DATA 語句允許您將數據文件加載到數據庫表中。 在特定情況下,這可能會被濫用以從 MySQL 服務器讀取文件。 因此,除非您在 WordPress 站點中有特定的用例,否則您應該禁用此功能。

如果 MySQL 和 Web 服務器在同一台機器上運行,則可能允許攻擊者使用 LOAD DATA LOCAL 語句讀取 Web 服務器進程具有讀取權限的任意文件。 這假設攻擊者有能力對 MySQL 運行任意 SQL 語句。 SQL 注入漏洞或通過安裝惡意 WordPress 插件可能就是這種情況。 這是將 Web 服務器和數據庫服務器分開的另一個原因。

默認情況下,local_infile 在 MySQL 8.0 中是禁用的(它在早期版本的 MySQL 中默認是啟用的)。 要防止 MySQL 服務器接受 LOAD DATA LOCAL 語句,請確保 mysqld 守護程序在啟動時禁用 local_infile。

禁用 MySQL 命令歷史記錄

在 Linux 上,交互式執行的 MySQL 客戶端日誌語句被保存到一個歷史文件中(通常位於 $HOME/.mysql_history 中)。 最好禁用 MySQL 命令歷史記錄,因為這會降低洩露敏感信息(如密碼、加密密鑰或其他秘密)的可能性。

要驗證系統中不存在 .mysql_history 文件,請運行以下命令:

找到 /home -name “.mysql_history”
找到 /root -name “.mysql_history”

如果上述命令返回任何輸出,請刪除任何 .mysql_history 文件。 此外,您可以將 $HOME/.mysql_history 設置為 /dev/null 的符號鏈接,如下所示:

ln -s /dev/null $HOME/.mysql_history

確保 mysqld 未使用 –skip-grant-tables 參數啟動

如果 MySQL 的 root 密碼放錯了地方,雖然這不是首選方法,但一些 MySQL 管理員可能會求助於將 MySQL 設置為使用 –skip-grant-tables 參數啟動。 使用此參數啟動 MySQL 時,它將避免在客戶端連接或運行查詢時檢查其授權表,從而有效地允許任何人在任何地方(只要他們可以通過網絡訪問數據庫)在數據庫服務器上執行任何操作。

為確保未啟用 –skip-grant-tables,請打開服務器的 /etc/mysql/mysql.conf.d/mysqld.cnf 配置文件並查找 skip-grant-tables。 該值不應設置,或設置為 skip-grant-tables = FALSE。

備份你的數據庫

備份您的 WordPress 數據庫對於能夠從災難或攻擊中迅速恢復絕對至關重要。 雖然有無數種方法可以備份您的 WordPress 數據庫——從 WordPress 備份插件和服務到定期進行數據庫轉儲的自製腳本——但以下是一些需要牢記的重要提示。

經常備份

進行定期備份非常明顯且不言自明——您進行數據庫備份的頻率越高,從數據丟失事件中恢復就越容易。 雖然備份的頻率取決於您運行的 WordPress 站點的類型,但根據經驗,每天進行備份可以很好地滿足大多數用例。

經常驗證備份的完整性

您的備份只有在有效時才有用。 當您正處於試圖恢復數據的事件中時,您可能不想知道。 對此的簡單補救措施是通過每隔一段時間進行測試恢復來經常驗證您的備份是否確實有效。 執行此操作的一個好方法是每隔幾個月設置一個日曆事件來執行還原過程,以確保您的備份仍按預期工作。 此外,記錄數據庫恢復步驟也是一個好主意——在響應事件時猜測越少越好。

安全地存儲您的備份

永遠不要在您的網絡或數據庫服務器上(尤其是在您的網絡服務器上)保留您的 WordPress 站點的備份。 備份是攻擊者進行垃圾箱潛水的好地方。 強烈建議將備份存儲在安全的異地位置。 如果要定期進行數據庫轉儲,請考慮將數據庫轉儲存儲在對象存儲服務上。 這些可能包括 Amazon S3、Cloudflare R2、DigitalOcean Spaces、Linode Object Storage 等。採用這種方式可能是存儲數據庫備份的一種經濟高效的好方法。 但是,請格外小心,不要讓您正在使用的存儲桶可公開訪問。

啟用和執行 TLS 連接

除非您在與 Web 服務器相同的機器上運行 MySQL(正如我們上面已經提到的,這不是理想的安全實踐),否則強烈建議使用傳輸層安全性(TLS 證書)加密 WordPress 和 MySQL 之間的數據,以前稱為安全套接字層(SSL 證書)。

默認情況下,當您安裝 MySQL 時,它會自動為您生成一個自簽名證書。 您可以通過運行以下命令來驗證這一點(或者,您可以使用 mysql_ssl_rsa_setup 腳本生成新證書)。

您需要將 ca.pem 從上面的列表(例如,通過 SCP)複製到運行您的 WordPress 網站的服務器。 將 ca.pem 文件上傳到 WordPress 服務器後,您需要將證書移至操作系統的證書信任庫並按如下方式更新證書信任庫。

注意,CA 證書的文件名必須以 .crt 文件擴展名結尾(例如 mysql-ca.crt 有效,但 mysql-ca.pem.crt 或 mysql-ca.pem 無效)。

sudo mv ca.pem /usr/local/share/ca-certificates/mysql-ca.crt
sudo 更新-ca-證書

接下來,您需要將 WordPress 配置為在連接到 MySQL 時使用 TLS,方法是將以下內容添加到 WordPress 安裝的 wp-config.php 文件中。

定義('MYSQL_CLIENT_FLAGS',MYSQLI_CLIENT_SSL);

更新 wp-config.php 後,WordPress 將使用 TLS 啟動與 MySQL 服務器的連接。

接下來,建議您通過將以下內容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 文件來使用 require_secure_transport 系統變量強制與 MySQL 服務器建立 TLS 連接。

require_secure_transport = 開

最後,重新啟動 MySQL 以使更改生效。

systemctl 重啟mysql

更改表前綴

默認情況下,所有 WordPress 表都是使用“wp_”前綴創建的。 這可以使攻擊者更容易在某些攻擊中獲得成功,例如 SQL 注入,因為他們知道數據庫表的名稱。 雖然僅此一項並不能保護您,但這是一個簡單的練習,被許多人推薦為最佳 WordPress 安全實踐。

您可以在安裝過程中或之後的任何時候更改數據庫前綴,儘管後者稍微複雜一些。 無論哪種方式,您都可以找到有關更改 WordPress 數據庫前綴的在線教程。

如何實施改變

希望本文為您提供了在運行 WordPress 網站的上下文中 MySQL 安全強化的概述。 雖然在網站安全方面沒有靈丹妙藥,但通過一些努力,採用分層、縱深防禦的安全方法將使攻擊者更難攻擊您的網站。
雖然本指南介紹了許多 MySQL 強化技術,但 MySQL 只是 WordPress 生態系統的一個組成部分。 因此,您還應該考慮我們的 WordPress 安全強化指南中涵蓋的 WordPress 安全的其他方面。 這與經過驗證的安全措施(例如 WordPress 雙因素身份驗證)相結合,將幫助您確保盡可能安全。

如果感覺要接受很多東西,請記住您可以(並且可能應該)逐漸應用本指南中涵蓋的各種強化技術。

確保您的 WordPress 安全

請記住,攻擊者通常是在尋找軟目標,因為他們不需要花費太多精力來利用安全性較弱的網站。 比下一個 WordPress 網站的安全態勢領先一步會讓您成為一個不太有吸引力的目標。