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