天天看點

資料庫原理及 MySQL 應用 | 資料庫安全加強

作者:java易

資料庫安全至關重要,可從多方面對資料庫進行加強。

資料庫安全怎麼強調都不過分,可以從以下方面對資料庫進行加強,讓它更安全。

01、作業系統級别

可從以下七方面實作作業系統級别的安全加強。

1、 使用資料庫專用伺服器

使用專用的伺服器安裝 MySQL 服務,解除安裝或删除作業系統上的不必要的應用或服務,避免因為其他應用或服務存在安全漏洞給 MySQL 運作帶來的安全風險,這樣也能減少伺服器的負擔,提高性能。

2、關閉不需要的端口

使用網絡掃描工具(如 nmap 等)掃描伺服器端口,檢查除了 MySQL 需要監聽的端口(預設為 3306)之外,還有哪些端口是打開的,關閉不必要的端口。

3、 不要将資料庫和日志檔案放在系統分區

系統分區是儲存引導檔案和系統檔案的分區,作業系統運作時,會頻繁對系統分區進行讀寫,也是各種病毒、木馬、惡意軟體等最關注的地方。例如 Windows 系統通常是 C 盤,Linux 系統是“/”“/var”“/usr”等,不管是出于安全還是性能上考慮,都不建議将 MySQL 安裝在系統分區,也不要将資料檔案和日志檔案放在系統分區。

4、使用專用的最小權限賬号運作資料庫程序 mysqld

強烈建議使用專用的最小權限賬号運作 mysqld 守護程序,不要用作業系統管理者的身份,提高本地安全性,防止 mysqld 對本地檔案的存取對系統構成威脅。因為任何具有 FILE 權限的資料庫使用者都可以利用此賬号建立檔案,也可以将此賬号能通路的任何檔案讀到資料庫表中。

5、 嚴格管理作業系統賬号

嚴格管理作業系統賬号,防止賬号資訊外洩,尤其是系統管理者和運作 mysqld 守護程序的賬号。配置密碼政策,提高密碼複雜度,定期更改密碼。

6、 不要複用資料庫賬号

運作 MySQL 服務的作業系統賬号不要用來運作其他應用或服務,避免因其他應用或服務被攻擊而給 MySQL 服務帶來的影響。

7、 資料檔案夾及日志檔案權限控制

合理設定 MySQL 的資料檔案夾以及二進制日志檔案、錯誤日志檔案、慢查詢日志檔案、通用日志檔案、審計日志檔案等檔案的通路權限,確定隻有合适的賬号擁有合适的權限,防止資料或日志檔案被誤删除、竊取或破壞。例如,隻讓運作 mysqld 守護程序的專用賬号擁有完全控制的權限,禁用其他所有使用者的讀寫權限。

02、MySQL 級别

可從以下 9 方面實作 MySQL 級别的安全加強。

1. 安全安裝

MySQL 安裝完成之後,建議使用 mysql_secure_installation 工具進行安全性設定,直接在 DOS 指令提示符視窗運作此指令即可。用此工具可以啟用驗證密碼元件(VALIDATE PASSWORD COMPONENT)、評估密碼強度、更改 root 使用者的密碼、删除匿名使用者、限制 root 使用者隻能在本地登入、删除 test 資料庫、重新加載權限表等。

2. 安裝最新的更新檔

可用“SHOW VARIABLES WHERE Variable_name LIKE "version";”或“SELECT VERSION();”指令查詢 MySQL 的版本,如果有需要安裝的更新檔包,要及時安裝。

3. 密碼安全

確定所有使用者都使用非空密碼,盡量不使用固定密碼,每個使用者使用不同的密碼,若需要将密碼儲存在特定全局配置檔案或腳本中時,可用 MySQL 自帶的用于安全加密登入的工具 mysql_config_editor,将密碼加密儲存,避免直接儲存明文密碼。另外,還可以根據需要設定以下幾方面的内容,增加密碼安全性。

1、密碼政策

設定合适級别的密碼政策,強制使用者的密碼符合一定的要求,如密碼長度在 8 位以上,使用數字、大小寫、特殊字元等的随機組合。

可以用“SHOW VARIABLES LIKE 'validate_password%';”指令檢視目前的密碼政策配置,如圖 11-4 所示。其中,validate_password.check_user_name 表示是否需要檢查使用者名;validate_password.dictionary_file 表示密碼政策檔案,隻有密碼政策強度為 STRONG 時才需要;validate_password.length 表示密碼最小長度;validate_password.mixed_case_count 表示大小寫字元長度,至少 1 個;validate_password.number_count 表示數字至少 1 個;validate_password.policy 表示密碼政策強度為 MEDIUM,還可以設定為 LOW 或 STRONG;validate_password.special_char_count 表示特殊字元至少 1 個。

資料庫原理及 MySQL 應用 | 資料庫安全加強

可在 MySQL 指令提示符視窗,用 SET 指令進行修改,其基本文法格式如下所示。

資料庫原理及 MySQL 應用 | 資料庫安全加強

提示

若“SHOW VARIABLES LIKE 'validate_password%';”指令的輸出結果為空集,說明沒有安裝密碼驗證元件,可在 MySQL 中運作下面指令安裝密碼驗證元件。
資料庫原理及 MySQL 應用 | 資料庫安全加強
資料庫原理及 MySQL 應用 | 資料庫安全加強

2、密碼過期及重用政策

根據需要設定密碼過期時間,強制使用者定期更改密碼,可在全局及每個使用者基礎上建立密碼重用政策,儲存已使用過的曆史密碼,限制重複使用以前的密碼。

3、密碼認證機制

盡量采用新的密碼認證機制。MySQL 不斷加強資料庫的安全性,在 MySQL 8.0 中将之前的 mysql_native_password 機制,更新到新的 caching_sha2_password。

mysql_native_password 是 MySQL 5.6、5.7 預設的密碼認證機制。當使用者連接配接 MySQL 執行個體時,通過 challenge-response 的密碼校驗機制進行認證,使用 SHA1 雜湊演算法進行認證校驗,并将使用者的密碼通過 SHA1(SHA1(password))兩次哈希計算,儲存在表“mysql.user”的列 authentication_string 中,但相同的密碼必然會有相同的哈希值,而且随着時間的推移,SHA1 雜湊演算法也已經變得比較容易破解了。

cache_sha2_password 是 MySQL 8.0 預設的密碼認證機制,它進行了如下幾個方面的改進。

(1) 雜湊演算法更新為更為安全的 SHA256 算法,雜湊演算法的 round 次數從原來的 2 次,提升為 5000 次,round 次數越多,每次計算哈希值的代價越大,破解難度也就越大。

(2) 儲存在列 authentication_string 中的哈希值為加鹽(salt)後的值,這樣就算兩個不同使用者的密碼相同,儲存在 mysql.user 表中的哈希值也不同。

(3) 用 TLS 加密或 RSA 密鑰傳輸方式從用戶端将密碼傳送到服務端。

4.、使用者安全

建立不同類型的使用者賬号,如超級管理者賬号、系統應用賬号(實作備份、監控、審計等)、應用業務賬号、業務人員賬号、開發人員賬号、測試人員賬号、其他專用賬号等,并制定相應的命名規則。

使用者根據密碼政策設定符合要求的密碼,保護好自己的賬号密碼,防止洩露,非必要人員不需要知道賬号的名稱,尤其要控制可以通路所有資料庫的賬号。

對于不必要的使用者,可以先禁用,後删除,做到無匿名賬戶和無廢棄賬戶。

5、 權限安全

熟悉 MySQL 的權限系統,了解權限表中的每個權限,遵循最小權限原則,業務需要什麼給什麼,而不是直接給每個使用者配置設定所有權限。堅持最小權限,是資料庫安全的重要步驟。

以下幾個是比較特殊的權限,應確定隻有資料庫管理者才能擁有。

(1) FILE:表示是否允許使用者讀取資料庫所在主機的本地檔案。

(2) PROCESS:表示是否允許使用者查詢所有使用者的指令執行資訊。

(3) SUPER:表示使用者是否有設定全局變量、管理者調試等進階别權限。

(4) SHUTDOWN:表示使用者是否可以關閉 MySQL 服務。

(5) CREATE_USER:表示使用者是否可以建立或删除其他使用者。

(6) GRANT:表示使用者是否可以修改其他使用者的權限。

另外,要合理控制 DDL 和 DML 語句的授權。因為它們會導緻資料庫結構或資料發生變化,在任何資料庫中都要控制使用者的此類權限,確定隻授權給有業務需求的非管理者使用者。

6、端口安全

MySQL 預設端口是 3306,如果條件允許,建議定期修改。

7、連接配接通路安全

使用專門主機與資料庫連接配接,建立使用者時指定主機資訊,確定通路資料庫的主機為已知使用者或主機,把非法請求阻止在資料庫以外。對已經連接配接的 IP 網段進行規範化、統一化的管理,定期進行權限複核操作,對系統所屬 IP、使用者進行權限梳理工作。

嚴禁開啟外網通路,盡可能禁止遠端網絡連接配接,防止猜解密碼攻擊、溢出攻擊和嗅探攻擊。如果用戶端在外網,不應該直接通路資料庫,而是使用中間件堡壘機或其他替代方案。

有些連入資料庫的應用程式存在後門,會造成資料庫安全隐患,為此要檢查所有連接配接資料庫程式的安全性。

8、限制 LOCAL INFILE/OUTFILE

禁用或限制 LOCAL INFILE/OUTFILE,防止造成任意檔案讀取或 webshell 寫出,防止非授權使用者通路本地檔案。可以在 MySQL 的配置檔案 my.ini 中設定“Local-infile=0”“secure_file_priv=NULL”“secure_file_priv=指定目錄”來禁用或限制通過檔案實作資料的導入和導出。

9、日志審計加強

根據需要啟用二進制日志、錯誤日志、通用查詢日志、慢查詢日志等日志,監控資料庫的運作狀态,查詢出錯原因,進行資料恢複,優化資料庫性能等。對重要業務表的所有行為,最好全部審計。

MySQL 8.0 對于安全做了很多層的加強,除了以上提到的,還有 InnoDB 表空間加密、InnoDB redo/undo 加密、二進制日志加密等

03、網絡級别

可從以下兩方面在網絡級别實作對 MySQL 安全的加強。

1、 使用 SSL 或 X509 加密連接配接

如果對資料保密要求非常嚴格,或 MySQL 資料庫伺服器與應用是跨信任域部署的,則需要考慮在資料庫伺服器與應用伺服器之間建立 SSL 或 X509 加密通道,将傳輸資料進行加密。

2、 限定網絡

資料庫應該隻對應用程式伺服器開放,不要将其開放給整個網絡,通過防火牆或其他白名單和中間件白名單過濾機制,限制對 MySQL 端口的通路。

最後需要強調的是,人才是安全的主導,最好根據具體情況制定詳細的規章制度,對員工進行安全教育訓練,增強員工的系統安全觀念,做到細心操作,安全操作。

原文連結;https://xie.infoq.cn/article/5fde27a595c4da4531529a327

繼續閱讀