?譯者 | 陳峻
審校 | 孫淑娟
不知您是否發(fā)現(xiàn)一種現(xiàn)象,那些初學滲透測試的人員往往過于關(guān)注應(yīng)用的安全性,而對數(shù)據(jù)庫的安全性不太重視。他們殊不知,沒有數(shù)據(jù)庫的配置與安全測試,應(yīng)用的安全性也就無法得到充分的驗證。在此,我將以最常見的數(shù)據(jù)庫管理系統(tǒng)——MySQL為例,向您介紹如何通過七步驟來安全加固數(shù)據(jù)庫服務(wù)器。
1、使用SSH隧道代替遠程連接
默認情況下,MySQL服務(wù)運行在3306號端口上。在安裝MySQL時,您會注意到3306號端口持續(xù)對所有連接都進行偵聽。就目前而言,由于MySQL的端口是對外開放的,因此您應(yīng)該將MySQL的服務(wù)設(shè)置為,僅偵聽本機地址的模式。
由于服務(wù)器通常是運行在Linux的各種發(fā)行版上的,因此下面我將選取基于Debian發(fā)行版來進行演示。首先,為了使用SSH隧道,而不是遠程連接,您需要在/etc/mysql/my.cnf文件中,關(guān)閉由內(nèi)向外的默認端口。在該文件中,您需要開啟一個名為[mysqld]的字段,并輸入如下命令:
完成之后,請不要忘記保存該文件,并使用如下命令去重新啟動該服務(wù):
至此,MySQL服務(wù)將只會監(jiān)聽本機地址了。如果您使用的是MariaDB,那么可以查看/etc/mysql/mariadb.conf.d/50-server.cnf,并檢查是否有關(guān)于bind-address的定義。

至此,您已將綁定地址設(shè)置為127.0.0.1,即localhost。您可以運行Nmap進行掃描,并能檢查到如下輸出:

由于127.0.0.1代表了本地主機,因此您可以看到MySQL的端口。現(xiàn)在,您可以嘗試著再次更改綁定的地址,以確保其已經(jīng)生效:

在保存了/etc/mysql/my.cnf文件,并重啟了MySQL服務(wù)后,您可以再次執(zhí)行Nmap掃描。此時,您應(yīng)該不會在本地主機上再看到該綁定地址了。

在確認了此類修改是奏效的后,請不要忘了回到第一步的設(shè)置中,將綁定地址改回127.0.0.1,并再次保存。
2、設(shè)置本地文件訪問的屏障
MySQL默認可以與本地文件系統(tǒng)通信。例如,通過使用查詢,您可以在本地文件系統(tǒng)中,查看到文本內(nèi)容,并將查詢結(jié)果寫到磁盤上。而為了防止惡意攻擊者使用此功能,您必須阻止MySQL直接與本地文件系統(tǒng)進行通信。
在實踐中,您可以使用名為local-infile的函數(shù),來采取預(yù)防措施。例如,假設(shè)您有一個名為“/etc/secretfile.txt”的文件,并且您在該文件中存放了密碼。那么,如果您的/etc/mysql/my.cnf文件中的local-infile函數(shù)值在為1時,就意味著訪問權(quán)限是開啟的。您可以基于此去檢查secretfile.txt文件。

出于驗證目的,您可以使用如下命令連接到MySQL上,并檢查其是否可以看到

不難看出,它成功地捕獲了計算機上的文件信息。如下所示,請更改/etc/mysql/my.cnf文件中的local-infile值:

請重啟MySQL服務(wù),并重新連接MySQL。再次執(zhí)行上述步驟,您會發(fā)現(xiàn)自己已不能看到文件內(nèi)容了。
當然,如果用戶本身就沒有對本地文件的讀寫權(quán)限,那么他們同樣無法看到該文件。不過,這不應(yīng)該成為您忽略的理由。它仍然是您應(yīng)該在滲透測試和數(shù)據(jù)庫安全性中需要檢查的內(nèi)容之一。
3、設(shè)置應(yīng)用用戶和密碼
值得注意的是,數(shù)據(jù)庫的管理用戶和訪問數(shù)據(jù)庫的MySQL用戶必須互不相同。換句話說,如果您直接使用root用戶,將應(yīng)用連接到MySQL上,則是極其危險的。如果可能的話,請定義那些無法單獨執(zhí)行UPDATE或INSERT操作的用戶,并分配給應(yīng)用。
除了用戶,我們再來考慮用戶的密碼。與其他領(lǐng)域類似,MySQL用戶的密碼也需要具有復(fù)雜且不可預(yù)測的特性。如果您在此方面缺乏經(jīng)驗的話,可以使用現(xiàn)成的密碼生成器系統(tǒng)。
4、刪除匿名用戶
您在保持默認設(shè)置情況下去安裝MySQL時,會產(chǎn)生一些匿名用戶。顯然,您需要刪除或阻止他們對于數(shù)據(jù)庫的訪問。對于MySQL服務(wù)器的安全而言,您應(yīng)該留意從如下查詢中獲得的響應(yīng):
對于查詢到的結(jié)果,您應(yīng)當立即刪除這些匿名用戶。例如,如果在名為“l(fā)ocalhost”的數(shù)據(jù)庫環(huán)境中有一個名為“anonuser”的匿名帳戶,那么您就可以使用如下命令來刪除之:
5、檢查MySQL的本地文件權(quán)限
假設(shè)您是一名數(shù)據(jù)庫管理員,想檢查一周前的數(shù)據(jù)。您可能必須通過SSH,連接到數(shù)據(jù)庫服務(wù)器,并更改所需的MySQL文件。在執(zhí)行此操作的過程中,如果您使用Linux的root用戶權(quán)限,那么數(shù)據(jù)文件的所有權(quán)和查詢權(quán)限就發(fā)生了更改。
為了避免此類情況,您需要查看/var/lib/mysql目錄,以檢查授予權(quán)限的狀態(tài),并通過如下命令,審查所有文件的所有者是否為MySQL用戶。

顯然,此類文件的讀寫權(quán)限應(yīng)該只被分配給MySQL用戶,而其他用戶不應(yīng)具有任何權(quán)限。
6、使用MySQL SSL
想象一下,在ABC地區(qū),有許多不同的服務(wù)器,其中一臺服務(wù)器一旦被惡意黑客接管了。那么黑客將在ABC區(qū)域進行內(nèi)部掃描。通過這種方式,他可以收集到各個服務(wù)器的信息。
如果他在此過程中檢測到MySQL服務(wù)器,那么就可以對目標服務(wù)器發(fā)起中間人攻擊(MitM)。這意味著他們可以竊取連接到該服務(wù)器的應(yīng)用和用戶之間的會話信息。避免這種情況的一種最佳方法是在MySQL服務(wù)器上啟用SSL。
7、日志和歷史文件
您可以使用MySQL日志來分析和查找各類錯誤。如下所示,您可以通過進入my.cnf文件,來編輯日志的保存位置。
您可以按需更改mylogfiles的名稱或位置。而當您在Linux終端上連接到MySQL服務(wù)器,并鍵入各種命令時,各種查詢將被保存在mysql_history文件中。如果運行以下命令,您將可以在MySQL終端中看到正在使用的查詢信息:cat ~/.mysql_history。
如果您不想提供有關(guān)自己在服務(wù)器內(nèi)部進行查詢的類型等信息,則可以通過如下命令刪除該文件的內(nèi)容。
在完成后,您可以通過再次運行上述命令,去檢查文件的內(nèi)容。
8、得數(shù)據(jù)庫者得系統(tǒng)
無論屬于哪個領(lǐng)域的應(yīng)用,由于數(shù)據(jù)庫里可能存放著包括:客戶信息、銀行帳戶和賬號密碼等數(shù)據(jù),它們都是惡意攻擊者想盡一切辦法要獲得的信息。因此,無論是數(shù)據(jù)庫開發(fā)人員、還是管理人員,都至少需要了解他們在滲透測試中可能涉及到的基礎(chǔ)知識。希望上述向您介紹的七步加固MySQL服務(wù)器安全的建議,能夠助您一臂之力。
原文鏈接:https://www.makeuseof.com/mysql-database-security-checklist/?
譯者介紹
陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實施經(jīng)驗,善于對內(nèi)外部資源與風險實施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗。?





















