譯者 | 陳峻
不知您是否發現一種現象,那些初學滲透測試的人員往往過于關注應用的安全性,而對數據庫的安全性不太重視。他們殊不知,沒有數據庫的配置與安全測試,應用的安全性也就無法得到充分的驗證。在此,我將以最常見的數據庫管理系統——MySQL為例,向您介紹如何通過七步驟來安全加固數據庫服務器。
1、使用SSH隧道代替遠程連接
默認情況下,MySQL服務運行在3306號端口上。在安裝MySQL時,您會注意到3306號端口持續對所有連接都進行偵聽。就目前而言,由于MySQL的端口是對外開放的,因此您應該將MySQL的服務設置為,僅偵聽本機地址的模式。
由于服務器通常是運行在linux的各種發行版上的,因此下面我將選取基于Debian發行版來進行演示。首先,為了使用SSH隧道,而不是遠程連接,您需要在/etc/mysql/my.cnf文件中,關閉由內向外的默認端口。在該文件中,您需要開啟一個名為[mysqld]的字段,并輸入如下命令:
復制
[mysqld]
bind-address=127.0.0.1
完成之后,請不要忘記保存該文件,并使用如下命令去重新啟動該服務:
復制
sudo systemctl restart mysqld
# or
sudo systemctl restart mariadb.service
至此,MySQL服務將只會監聽本機地址了。如果您使用的是MariaDB,那么可以查看/etc/mysql/mariadb.conf.d/50-server.cnf,并檢查是否有關于bind-address的定義。
至此,您已將綁定地址設置為127.0.0.1,即localhost。您可以運行Nmap進行掃描,并能檢查到如下輸出:
由于127.0.0.1代表了本地主機,因此您可以看到MySQL的端口。現在,您可以嘗試著再次更改綁定的地址,以確保其已經生效:
復制
[mysqld]
bind-address=127.5.5.
在保存了/etc/mysql/my.cnf文件,并重啟了MySQL服務后,您可以再次執行Nmap掃描。此時,您應該不會在本地主機上再看到該綁定地址了。
在確認了此類修改是奏效的后,請不要忘了回到第一步的設置中,將綁定地址改回127.0.0.1,并再次保存。
2、設置本地文件訪問的屏障
MySQL默認可以與本地文件系統通信。例如,通過使用查詢,您可以在本地文件系統中,查看到文本內容,并將查詢結果寫到磁盤上。而為了防止惡意攻擊者使用此功能,您必須阻止MySQL直接與本地文件系統進行通信。
在實踐中,您可以使用名為local-infile的函數,來采取預防措施。例如,假設您有一個名為“/etc/secretfile.txt”的文件,并且您在該文件中存放了密碼。那么,如果您的/etc/mysql/my.cnf文件中的local-infile函數值在為1時,就意味著訪問權限是開啟的。您可以基于此去檢查secretfile.txt文件。
出于驗證目的,您可以使用如下命令連接到MySQL上,并檢查其是否可以看到
復制
secretfile.txt文件:
SELECT LOAD_FILE("/etc/secretfile.txt");
不難看出,它成功地捕獲了計算機上的文件信息。如下所示,請更改/etc/mysql/my.cnf文件中的local-infile值:
復制
[mysqld]
local-infile=0
請重啟MySQL服務,并重新連接MySQL。再次執行上述步驟,您會發現自己已不能看到文件內容了。
當然,如果用戶本身就沒有對本地文件的讀寫權限,那么他們同樣無法看到該文件。不過,這不應該成為您忽略的理由。它仍然是您應該在滲透測試和數據庫安全性中需要檢查的內容之一。
3、設置應用用戶和密碼
值得注意的是,數據庫的管理用戶和訪問數據庫的MySQL用戶必須互不相同。換句話說,如果您直接使用root用戶,將應用連接到MySQL上,則是極其危險的。如果可能的話,請定義那些無法單獨執行UPDATE或INSERT操作的用戶,并分配給應用。
除了用戶,我們再來考慮用戶的密碼。與其他領域類似,MySQL用戶的密碼也需要具有復雜且不可預測的特性。如果您在此方面缺乏經驗的話,可以使用現成的密碼生成器系統。
4、刪除匿名用戶
您在保持默認設置情況下去安裝MySQL時,會產生一些匿名用戶。顯然,您需要刪除或阻止他們對于數據庫的訪問。對于MySQL服務器的安全而言,您應該留意從如下查詢中獲得的響應:
復制
SELECT * FROM mysql.user WHERE USER="";
# Example Output
Empty set (0.001 sec)
對于查詢到的結果,您應當立即刪除這些匿名用戶。例如,如果在名為“localhost”的數據庫環境中有一個名為“anonuser”的匿名帳戶,那么您就可以使用如下命令來刪除之:
復制
DROP USER 'anonuser'@'localhost';
5、檢查MySQL的本地文件權限
假設您是一名數據庫管理員,想檢查一周前的數據。您可能必須通過SSH,連接到數據庫服務器,并更改所需的MySQL文件。在執行此操作的過程中,如果您使用Linux的root用戶權限,那么數據文件的所有權和查詢權限就發生了更改。
為了避免此類情況,您需要查看/var/lib/mysql目錄,以檢查授予權限的狀態,并通過如下命令,審查所有文件的所有者是否為MySQL用戶。
復制
sudo ls -al /var/lib/mysql
顯然,此類文件的讀寫權限應該只被分配給MySQL用戶,而其他用戶不應具有任何權限。
6、使用MySQL SSL
想象一下,在ABC地區,有許多不同的服務器,其中一臺服務器一旦被惡意黑客接管了。那么黑客將在ABC區域進行內部掃描。通過這種方式,他可以收集到各個服務器的信息。
如果他在此過程中檢測到MySQL服務器,那么就可以對目標服務器發起中間人攻擊(MitM)。這意味著他們可以竊取連接到該服務器的應用和用戶之間的會話信息。避免這種情況的一種最佳方法是在MySQL服務器上啟用SSL。
7、日志和歷史文件
您可以使用MySQL日志來分析和查找各類錯誤。如下所示,您可以通過進入my.cnf文件,來編輯日志的保存位置。
復制
# /etc/mysql/my.cnf
[mysqld]
log =/var/log/mylogfiles
您可以按需更改mylogfiles的名稱或位置。而當您在Linux終端上連接到MySQL服務器,并鍵入各種命令時,各種查詢將被保存在mysql_history文件中。如果運行以下命令,您將可以在MySQL終端中看到正在使用的查詢信息:cat ~/.mysql_history。
如果您不想提供有關自己在服務器內部進行查詢的類型等信息,則可以通過如下命令刪除該文件的內容。
復制
sudo echo "cleaned" > ~/.mysql_history
在完成后,您可以通過再次運行上述命令,去檢查文件的內容。
8、得數據庫者得系統
無論屬于哪個領域的應用,由于數據庫里可能存放著包括:客戶信息、銀行帳戶和賬號密碼等數據,它們都是惡意攻擊者想盡一切辦法要獲得的信息。因此,無論是數據庫開發人員、還是管理人員,都至少需要了解他們在滲透測試中可能涉及到的基礎知識。希望上述向您介紹的七步加固MySQL服務器安全的建議,能夠助您一臂之力。
原文鏈接:https://www.makeuseof.com/mysql-database-security-checklist/
譯者介紹
陳峻 (Julian Chen),51CTO社區編輯,具有十多年的IT項目實施經驗,善于對內外部資源與風險實施管控,專注傳播網絡與信息安全知識與經驗。