MySQL 因其速度和整體易用性而成為開發(fā)人員和管理員最受歡迎和喜愛的數(shù)據(jù)庫。不幸的是,這種易用性是以犧牲安全為代價(jià)的。即使 MySQL 可以配置有嚴(yán)格的安全控制,你的普通默認(rèn) MySQL 配置可能不會(huì)使用它們。在本文中,我將介紹強(qiáng)化 MySQL 數(shù)據(jù)庫應(yīng)采取的五個(gè)重要步驟。
第一步:設(shè)置強(qiáng)密碼
對(duì)于所有數(shù)據(jù)庫用戶來說,使用強(qiáng)密碼很重要。鑒于大多數(shù)人不會(huì)經(jīng)常手動(dòng)登錄數(shù)據(jù)庫,請(qǐng)使用密碼管理器或命令行工具 pwgen 為你的數(shù)據(jù)庫帳戶創(chuàng)建一個(gè)隨機(jī)的 20 個(gè)字符的密碼。即使你使用額外的 MySQL 訪問控制來限制特定帳戶可以登錄的位置(例如將帳戶嚴(yán)格限制為 localhost),這依然很重要。
設(shè)置密碼的最重要的 MySQL 帳戶是 root 用戶。默認(rèn)情況下,在許多系統(tǒng)中,該用戶沒有密碼。特別是,基于 Red Hat 的系統(tǒng)在安裝 MySQL 時(shí)不會(huì)設(shè)置密碼;雖然基于 Debian 的系統(tǒng)會(huì)在交互式安裝期間提示您輸入密碼,但非交互式安裝(就像您可能使用配置管理器執(zhí)行的那樣)會(huì)跳過它。此外,你仍然可以在交互式安裝期間跳過設(shè)置密碼。
你可能認(rèn)為讓 root 用戶不輸入密碼并不是什么大的安全風(fēng)險(xiǎn)。畢竟,用戶設(shè)置為 “root@localhost”,你可能認(rèn)為這意味著你必須先 root 計(jì)算機(jī),然后才能成為該用戶。不幸的是,這意味著任何可以從 localhost 觸發(fā) MySQL 客戶端的用戶都可以使用以下命令以 MySQL root 用戶身份登錄:
*$ mysql — user root*
因此,如果你不為 root 用戶設(shè)置密碼,那么任何能夠在您的 MySQL 機(jī)器上獲得本地 shell 的人現(xiàn)在都可以完全控制你的數(shù)據(jù)庫。
要修復(fù)此漏洞,請(qǐng)使用 mysqladmin 命令為 root 用戶設(shè)置密碼:
$ sudo mysqladmin password
不幸的是,MySQL 以 root 用戶身份運(yùn)行后臺(tái)任務(wù)。一旦你設(shè)置了密碼,這些任務(wù)就會(huì)中斷,除非采取額外的步驟將密碼硬編碼到 /root/.my.cnf 文件中:
1 2 |
|
但是,這意味著你必須將密碼以純文本形式存儲(chǔ)在主機(jī)上。但是你至少可以使用 Unix 文件權(quán)限將對(duì)該文件的訪問限制為僅 root 用戶:
1 2 |
|
第二步:刪除匿名用戶
匿名帳戶是既沒有用戶名也沒有密碼的 MySQL 帳戶。你不希望攻擊者在沒有密碼的情況下對(duì)你的數(shù)據(jù)庫進(jìn)行任何形式的訪問,因此請(qǐng)?jiān)诖嗣畹妮敵鲋胁檎沂褂每瞻子脩裘涗浀娜魏?MySQL 用戶:
1 2 3 4 5 6 7 8 9 10 |
|
在這些根用戶中間有一個(gè)匿名用戶( localhost ),它在 User 列中為空。你可以使用下面命令清除特定的匿名用戶:
1 2 |
|
如果你發(fā)現(xiàn)任何其他匿名用戶,請(qǐng)確保將其刪除。
第三步:遵循最小特權(quán)原則
最小特權(quán)原則是一項(xiàng)安全原則,可以總結(jié)如下:
只為賬戶提供執(zhí)行作業(yè)所需的訪問權(quán)限,而不提供更多權(quán)限。
此原則可以通過多種方式應(yīng)用于 MySQL。首先當(dāng)使用 GRANT 命令向特定用戶添加數(shù)據(jù)庫權(quán)限時(shí),請(qǐng)確保僅限制該用戶需要訪問數(shù)據(jù)庫的權(quán)限:
1 2 |
|
如果該用戶只需要訪問一個(gè)特定的表(例如,users 表),用mydb.users 或者任何你的表的名字替換 mydb.*(授予對(duì)所有表的權(quán)限)。
許多人會(huì)授予用戶對(duì)數(shù)據(jù)庫的完全訪問權(quán)限;但是如果你的數(shù)據(jù)庫用戶僅僅只需要讀取數(shù)據(jù)而不需要更改數(shù)據(jù),則需要額外的步驟授予對(duì)數(shù)據(jù)庫的只讀訪問權(quán)限:
1 2 |
|
最后,許多數(shù)據(jù)庫用戶不會(huì)從 localhost 訪問數(shù)據(jù)庫,通常管理員會(huì)創(chuàng)建他們,像這樣:
1 2 |
|
這將允許 「someuser」從任何網(wǎng)絡(luò)訪問數(shù)據(jù)庫。但是,如果你有一組定義明確的內(nèi)部 IP,或者 - 甚至更好 - 已經(jīng)設(shè)置了 VLANS ,以便你所有應(yīng)用程序服務(wù)器與其它主機(jī)位于不同的子網(wǎng)中,那么就可以利用這個(gè)優(yōu)勢(shì)來限制 「someuser」,使得該賬戶只能從特定網(wǎng)絡(luò)訪問數(shù)據(jù)庫:
1 2 |
|
第四步:?jiǎn)⒂?TLS
設(shè)置強(qiáng)密碼僅只有攻擊者可以在網(wǎng)絡(luò)上讀取你的密碼或者其他敏感數(shù)據(jù)的情況下才能達(dá)到此目的。因此,使用 TLS 保護(hù)你的所有網(wǎng)絡(luò)流量比以往任何時(shí)候都更加重要。
MySQL 也不例外。
幸運(yùn)的是,在 MySQL 中啟用 TLS 比較簡(jiǎn)單。一旦你有了你的主機(jī)的有效證書,只需要在你的主 my.cnf 文件的 [mysqld]部分添加以下幾行 :
1 2 3 4 |
|
為了額外的安全性,還可以添加 ssl-cipher 配置選項(xiàng),其中包含一個(gè)被認(rèn)可的密碼列表,而不是只接受默認(rèn)的密碼列表,這可能包括較弱的 TLS 密碼。我推薦使用 Mozilla Security/Server Side TLS page 所推薦的現(xiàn)代或者中級(jí)密碼套件。
一旦服務(wù)器端設(shè)置了 TLS ,你可以限制客戶端必須采用 TLS 進(jìn)行連接,通過在 GRANT 語句中添加 REQUIRE SSL :
1 2 3 |
|
第五步:加密數(shù)據(jù)庫密鑰
雖然現(xiàn)在很多人都知道使用單向散列(理想情況下是像 bcrypt 這樣慢速散列 ),保護(hù)用戶數(shù)據(jù)庫存儲(chǔ)的密碼有多重要,但通常沒過多考慮使用加密來保護(hù)數(shù)據(jù)庫上其他的敏感數(shù)據(jù)。事實(shí)上,許多管理員會(huì)告訴你他們的數(shù)據(jù)庫是加密的,因?yàn)榇疟P本身是加密的。這實(shí)際上會(huì)影響你的數(shù)據(jù)庫加固,不是因?yàn)榇疟P加固有缺陷或糟糕的做法,而是因?yàn)樗鼤?huì)給你一種錯(cuò)誤的信任感。
磁盤加密保護(hù)你的數(shù)據(jù)庫數(shù)據(jù),以防止有人從你的服務(wù)器竊取磁盤(或者你買了二手磁盤后忘記擦除磁盤),但是磁盤加密并不能在數(shù)據(jù)庫本身運(yùn)行時(shí)保護(hù)你,因?yàn)轵?qū)動(dòng)器需要處于解密狀態(tài)才能被讀取。
要保護(hù)數(shù)據(jù)庫中的數(shù)據(jù),你需要采取額外的措施,在存儲(chǔ)敏感字段之前對(duì)它們進(jìn)行加密。這樣如果攻擊者找到了某種方法來轉(zhuǎn)存完整的數(shù)據(jù)庫,你的敏感字段仍然會(huì)受到保護(hù)。
有許多加密數(shù)據(jù)庫中字段的方法,而且 MySQL 支持本地加密命令。無論你采取哪種加密方法,我都建議避免你需要將解密密鑰存儲(chǔ)在數(shù)據(jù)庫本身的加密方法。
理想情況下,你會(huì)把解密的密鑰存儲(chǔ)在應(yīng)用服務(wù)器上,作為本地GPG密鑰(如果你使用GPG進(jìn)行加密)或者將其存儲(chǔ)為應(yīng)用程序服務(wù)器上的環(huán)境變量。這樣即使攻擊者可能找到一種方法來破壞應(yīng)用程序服務(wù)器的服務(wù)器,他也必須將攻擊轉(zhuǎn)換為本地shell訪問,以此來獲取你的解密密鑰。
MySQL 加固原則:掌握最小權(quán)限原則
有很多方法來鎖定你的MySQL服務(wù)器。確切地說,你如何實(shí)施這些步驟取決于你如何設(shè)置自己的數(shù)據(jù)庫,以及它在網(wǎng)絡(luò)中的位置。
雖然前面的五個(gè)步驟將有助于保護(hù)你的數(shù)據(jù)庫,但我認(rèn)為更需要掌握的最重要的整體步驟是最小權(quán)限原則。你的數(shù)據(jù)庫可能存儲(chǔ)來一些非常有用的數(shù)據(jù),如果你確保用戶和應(yīng)用程序只具有執(zhí)行其工作的所需的最小訪問權(quán)限,那么你將限制攻擊者能夠做什么,如果黑客找到來危害該用戶或者應(yīng)用程序的方法。