MySQL是最受DBA歡迎的數(shù)據(jù)庫之一,易用性和高性能是MySQL數(shù)據(jù)庫的標志。然而,高人氣使得MySQL成為很多惡意個人和組織攻擊的目標。默認安裝的MySQL在安全措施方面存在較大隱患,特別是根密碼空缺和緩沖區(qū)溢出的潛在漏洞,使其成為最容易受攻擊的目標。在本文中,我們將介紹一些簡單而有效的方法來加強數(shù)據(jù)庫的安全性,以抵御本地以及遠程的攻擊。
常見安全行為
作為DBA,與安全相關的工作應當圍繞以下三方面展開:
•打補丁
•限制訪問
•避免有用信息收集
本文剩余部分將會在細節(jié)上討論以上三個行為,并將重點放在對網(wǎng)絡、操作系統(tǒng)以及數(shù)據(jù)庫服務器的限制訪問上。
安全補丁
盡管每個人都會盡最大努力去保護數(shù)據(jù),但永遠會有人發(fā)現(xiàn)可以利用的漏洞。數(shù)據(jù)庫供應商會檢查引起問題的漏洞,并提供相應的漏洞補丁程序。
為MySQL尋找相關安全補丁最好的去處之一便是Oracle的官方網(wǎng)站。你需要經常訪問MySQL論壇,并關注相關動向。它們通常是安全警報最先發(fā)出的地方。
防止對系統(tǒng)的訪問
有四項主要的來源是需要注意的:
•對網(wǎng)絡的訪問
•對數(shù)據(jù)庫的直接訪問
•對備份的訪問
•對操作系統(tǒng)的訪問,包括數(shù)據(jù)和日志文件
以上每一項都有其自身所面臨的挑戰(zhàn)和解決途徑:
對網(wǎng)絡的訪問
如果你所在的局域網(wǎng)或廣域網(wǎng)并不安全,你需要考慮對服務器和客戶端之間的網(wǎng)絡連接進行加密。非授權用戶能夠以某種方式獲得對特權用戶賬戶(例如root) 的訪問權限么,他們可以利用類似tcpdump的工具嗅探發(fā)往MySQL的網(wǎng)絡流并過濾數(shù)據(jù)包。這些數(shù)據(jù)包是會包含查詢和數(shù)據(jù)的。
默認情況下,MySQL是以最佳性能配置的,因此除非對連接進行人工設置,否則所有連接都是非加密的。而通常是采用SSL協(xié)議對所有在MySQL客戶端和服務器之間發(fā)送的數(shù)據(jù)進行加密。
MySQL可以基于每個連接進行加密,因此你可以根據(jù)各個應用程序的需求來選擇使用非加密連接或是安全的加密SSL連接。
對數(shù)據(jù)庫的訪問
對于黑客來說,首要的潛在入口點之一就是root賬戶。因此,對密碼進行重置和對ID重命名是至關重要的。
...當你拿到一個默認安裝的MySQL時,首先要做的就是為root用戶設置密碼。
$ mysqladmin -u root password NEWPASSWORD
一旦設置了密碼,將”root” 改成其他名字,安全性將會更好。一個黑客比較青睞于在MySQL服務器上將root用戶作為目標,既是由于其超級用戶身份,也是因為它是已知用戶。通過改變root用戶名,會讓黑客進行成功攻擊變得更困難。使用以下一系列命令可以重命名“root” 用戶:
mysql> RENAME USER root TO new_user;
除此之外,讓超級用戶的數(shù)量保持在絕對意義上的最小對掌控數(shù)據(jù)庫是非常關鍵的。而太多的超級賬號是存在隱患的,實際上,就關鍵數(shù)據(jù)而言,如果你不小心就有可能失去很多東西。
有一個賬戶類型是DBA們所鐘愛的,即只讀用戶。這是最好用的一類賬戶類型,因為持有它的用戶實際上是無法對數(shù)據(jù)庫或其數(shù)據(jù)造成破壞的。通常,用戶會編造一些理由來解釋他們?yōu)楹涡枰獙憴嘞?。而確定一個特定權限是否有其真正價值的試金石就是在某種程度上將其簡單的移除,然后觀察是否有人對此抱怨。如果什么都不發(fā)生就最好了。以我的經驗,只有很少的用戶渴望權限。而余下的用戶并不需要額外的權限。其實,我并非提倡通過關閉用戶權限來欺瞞你的客戶,我所要闡釋的是要對用戶的工作模式加以正確的分析。有些事情可以通過簡單的質量審計就可以非常輕易的完成。
對備份的訪問
理想情況,只要對備份進行離線存儲,這樣當主站有故障發(fā)生時就不會對備份造成影響。此外,所有保護你數(shù)據(jù)庫服務器網(wǎng)絡的步驟同樣適用于備份系統(tǒng)。有一些優(yōu)秀的軟件模型可以對你的數(shù)據(jù)進行加密,因此,即便是備份文件在不大可能的情況下落入他人之手,其內容對于偷盜者而言也是無用的。
這里是一個用PHP語言寫的加密函數(shù),它利用的是“rijndael-256”模型:
public function encrypt( $msg, $k, $base64 = false ) {
if ( ! $td = mcrypt_module_open('rijndael-256', '', 'ctr', '') ) return false;
$msg = serialize($msg);
$iv = mcrypt_create_iv(32, MCRYPT_RAND);
if ( mcrypt_generic_init($td, $k, $iv) !== 0 ) return false;
$msg = mcrypt_generic($td, $msg); # encrypt
$msg = $iv . $msg; # prepend iv
$mac = $this->pbkdf2($msg, $k, 1000, 32); # create mac
$msg .= $mac; # append mac
mcrypt_generic_deinit($td); # clear buffers
mcrypt_module_close($td); # close cipher module
if ( $base64 ) $msg = base64_encode($msg);
return $msg;
}
對操作系統(tǒng)的訪問
本地操作系統(tǒng)可以使用認證,防火墻以及其他防病毒軟件進行聯(lián)合防護。其他的訪問控制機制包括用戶名密碼策略,受管轄的使用組策略(GPO),以及過濾特定的訪問對象。
Oracle對此有很好的在線資源供參考。
結論
有各種各樣保護MySQL數(shù)據(jù)的方法,在本文中我們只介紹了一些基礎方法。在一場無盡的戰(zhàn)斗中,要讓數(shù)據(jù)庫免受攻擊,一種方法不可能一勞永逸。相反,必須始終保持警惕并保證自己熟悉最新的安全漏洞和相應對策。記住,打造世界上最安全的數(shù)據(jù)庫并不是你的目標,你只需要讓黑客們付出足夠的精力才能攻破你的數(shù)據(jù)庫,這樣黑客們就會轉向更易攻擊的目標。
更多信息請查看IT技術專欄