什么是 MySQL?MySQL 是一個開源的 RDBMS(關(guān)系數(shù)據(jù)庫管理系統(tǒng))。它基于結(jié)構(gòu)化查詢語言 (SQL),可在許多平臺上運行,包括 Windows、Linux 和 UNIX。MySQL 還在所有流行的公共云平臺上作為服務(wù)提供,包括Amazon、Azure和Google Cloud。
MySQL 是 LAMP 的一部分,LAMP 是一個開源 Web 開發(fā)平臺。LAMP 企業(yè)堆棧由 Linux(操作系統(tǒng))、Apache(Web 服務(wù)器)、MySQL (RDBMS) 和 PHP(面向?qū)ο蟮哪_本語言)、Perl 或 Python 組成。
MySQL 有助于支持各種用例,包括 Web 應(yīng)用程序和在線發(fā)布場景。它為網(wǎng)站、面向消費者和基于企業(yè)網(wǎng)絡(luò)的應(yīng)用程序提供支持,例如 Twitter、YouTube 和 Facebook。
數(shù)據(jù)庫安全威脅
數(shù)據(jù)庫存儲敏感信息,這些信息容易受到許多威脅——包括數(shù)據(jù)丟失和被盜、隱私侵犯、可用性問題以及惡意或意外修改。這些問題可能由于各種原因而發(fā)生,包括外部攻擊者、惡意內(nèi)部人員和意外操作。MySQL 等開源數(shù)據(jù)庫通常會帶來與安全通信和訪問控制相關(guān)的安全問題,以及已知漏洞和零日漏洞等開源安全風險。
訪問和特權(quán)
例如,過多的權(quán)限可以讓用戶獲得對機密信息的不必要的訪問權(quán)限。此問題可能會升級為權(quán)限濫用,使授權(quán)用戶能夠濫用其權(quán)限來執(zhí)行未經(jīng)授權(quán)的操作。雖然您可以使用訪問控制策略和查詢級訪問控制來緩解這些威脅,但可能會出現(xiàn)更多問題。例如,它可能無法阻止威脅參與者將低級別訪問升級為高級權(quán)限。
漏洞和攻擊
平臺和操作系統(tǒng)通常包含漏洞,可能導(dǎo)致泄漏和數(shù)據(jù)損壞。您可以使用補丁管理流程和漏洞評估來緩解這種情況。但是,漏洞評估無法阻止威脅行為者使用 SQL 注入發(fā)送未經(jīng)授權(quán)的數(shù)據(jù)庫查詢以誘騙服務(wù)器泄露信息。您需要使用準備好的 SQL 語句來減輕這種威脅。數(shù)據(jù)庫也會受到拒絕服務(wù) (DoS) 攻擊,這些攻擊會使資源和數(shù)據(jù)庫不可用,從而拒絕用戶訪問數(shù)據(jù)或應(yīng)用程序。
MySQL 安全最佳實踐
以下最佳實踐可以幫助您增強 MySQL 數(shù)據(jù)庫的安全性。
修改端口映射
MySQL 的默認映射是在端口 3306 上運行。您應(yīng)該在安裝 MYSQL 后更改此設(shè)置以隱藏運行關(guān)鍵服務(wù)的端口。攻擊者通常首先針對默認設(shè)置,因此修改它們以避免漏洞利用非常重要。
避免使用 root 權(quán)限運行 MySQL
您應(yīng)該在包含運行服務(wù)所需的最小權(quán)限的專用用戶帳戶下運行 MySQL。不要讓 MySQL 直接作為根服務(wù)器運行。除了日志記錄和審計的優(yōu)勢之外,避免 root 級權(quán)限有助于確保攻擊者無法劫持 root 用戶帳戶以獲得訪問權(quán)限。
在云中保護 MySQL
如果您在云環(huán)境中運行 MySQL,您的云提供商可能會提供安全服務(wù)來保護您的數(shù)據(jù)庫。例如,Azure 允許您使用 Microsoft Defender 來保護您的開源關(guān)系數(shù)據(jù)庫,以檢測可能表明惡意嘗試訪問服務(wù)器的異常行為。AWS 提供 AWS Shield 來幫助保護應(yīng)用程序和數(shù)據(jù)庫免受分布式拒絕服務(wù) (DDoS) 攻擊。
禁用和刪除您的 MySQL 歷史記錄
默認情況下,MySQL 在安裝時會創(chuàng)建一個歷史文件,將其存儲在 ~/.mysql_history 下。您應(yīng)該刪除此文件,因為它詳細說明了您的安裝和配置歷史。如果受到破壞,惡意行為者可以使用它來暴露關(guān)鍵的數(shù)據(jù)庫用戶密碼。您還應(yīng)該創(chuàng)建從歷史文件到空設(shè)備的軟鏈接,以防止 MySQL 將事件記錄到文件中。
鎖定可疑活動的用戶帳戶
MySQL 8.0.19 引入了臨時帳戶鎖定功能。您可以將 MySQL 設(shè)置為根據(jù)登錄嘗試失敗次數(shù)和帳戶鎖定時間等變量來鎖定用戶帳戶。
在創(chuàng)建用戶帳戶時運行以下腳本以啟用帳戶鎖定:CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘userpassword’ FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 10;
失敗登錄嘗試變量后面的值指定鎖定帳戶之前所需的失敗嘗試次數(shù)。密碼鎖定時間變量后面的值指定帳戶將被鎖定的時間(以天為單位)。您還可以將“無界”指定為密碼鎖定時間值,以使帳戶無限期鎖定,直到手動解鎖為止。
使用身份驗證插件
身份驗證插件使用戶能夠選擇他們喜歡的身份驗證方法。MySQL 支持許多可插入的身份驗證選項,您可以將它們組合起來以獲得更高的安全性。您可以在 ALTER USER 或 CREATE USER 等語句旁邊使用身份驗證插件。
例如:CREATE USER ‘user_7’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
此查詢使用本機密碼散列來實現(xiàn)身份驗證。
限制或禁用數(shù)據(jù)庫可見性
SHOW DATABASES 命令允許用戶查看敏感信息。您應(yīng)該限制使用此命令以防止遠程用戶和惡意行為者收集有關(guān)您的數(shù)據(jù)庫的數(shù)據(jù)。您可以通過在 [mysqld] 部分中指定“skip-show-database”來限制或刪除 MYSQL 配置文件中的此功能。
加密靜態(tài)和傳輸中的數(shù)據(jù)
默認情況下,MySQL 在服務(wù)器和客戶端之間使用未加密的通信,這為攻擊者提供了通過中間人 (MitM) 攻擊攔截數(shù)據(jù)的機會。同樣,數(shù)據(jù)庫中未加密的任何用戶數(shù)據(jù)都可能危及用戶的完整性和隱私。
您可以使用 TLS/SSL 加密來保護網(wǎng)絡(luò)之間的 MySQL 通信。受保護網(wǎng)絡(luò)內(nèi)的通信可能不需要加密。MySQL 還允許您對靜態(tài)數(shù)據(jù)進行加密,以在服務(wù)器遭到破壞時保護您存儲的數(shù)據(jù)。
實施安全密碼策略
MySQL 允許您應(yīng)用密碼策略,要求非特權(quán)用戶在輸入當前密碼時設(shè)置新密碼。此功能可以保護您的數(shù)據(jù)庫免受多種威脅,例如入侵主機并嘗試使用 Web Shell 訪問用戶數(shù)據(jù)庫會話的攻擊者。啟用密碼策略更改后,攻擊者無法鎖定目標用戶,除非他們擁有用戶的現(xiàn)有密碼。
MySQL 默認不啟用 Change Current Password 策略。您可以基于單個用戶或全局控制此策略(在所有非特權(quán)用戶帳戶中強制執(zhí)行)。建議全局設(shè)置策略,或至少覆蓋所有非特權(quán)用戶。使用 my.cnf 服務(wù)器文件啟用全局當前密碼策略。