千萬級數據并發如何處理?進入學習
長期以來,數據庫一直是你的平衡架構的重要組成部分,并且可以說是最重要的部分。如今,壓力已經朝向你的大部分一次性和無狀態的基礎設施,這給你的數據庫帶來了更大的負擔,既要可靠又安全,因為所有其他服務器不可避免地會連同其余數據一起在數據庫中存儲有狀態信息。
你的數據庫是每個攻擊者想要獲取的大獎。隨著攻擊變得更加復雜和網絡變得更加敵對,采取額外步驟來強化數據庫比以往任何時候都更加重要。
MySQL 因其速度和整體易用性而成為開發人員和管理員最受歡迎和喜愛的數據庫。不幸的是,這種易用性是以犧牲安全為代價的。即使 MySQL 可以配置有嚴格的安全控制,你的普通默認 MySQL 配置可能不會使用它們。在本文中,我將介紹強化 MySQL 數據庫應采取的五個重要步驟。
第一步:設置強密碼
對于所有數據庫用戶來說,使用強密碼很重要。鑒于大多數人不會經常手動登錄數據庫,請使用密碼管理器或命令行工具 pwgen 為你的數據庫帳戶創建一個隨機的 20 個字符的密碼。即使你使用額外的 MySQL 訪問控制來限制特定帳戶可以登錄的位置(例如將帳戶嚴格限制為 localhost),這依然很重要。
設置密碼的最重要的 MySQL 帳戶是 root 用戶。默認情況下,在許多系統中,該用戶沒有密碼。特別是,基于 Red Hat 的系統在安裝 MySQL 時不會設置密碼;雖然基于 Debian 的系統會在交互式安裝期間提示您輸入密碼,但非交互式安裝(就像您可能使用配置管理器執行的那樣)會跳過它。此外,你仍然可以在交互式安裝期間跳過設置密碼。
你可能認為讓 root 用戶不輸入密碼并不是什么大的安全風險。畢竟,用戶設置為 “root@localhost”,你可能認為這意味著你必須先 root 計算機,然后才能成為該用戶。不幸的是,這意味著任何可以從 localhost 觸發 MySQL 客戶端的用戶都可以使用以下命令以 MySQL root 用戶身份登錄:
*$ mysql — user root*
因此,如果你不為 root 用戶設置密碼,那么任何能夠在您的 MySQL 機器上獲得本地 shell 的人現在都可以完全控制你的數據庫。
要修復此漏洞,請使用 mysqladmin 命令為 root 用戶設置密碼:
$ sudo mysqladmin password
不幸的是,MySQL 以 root 用戶身份運行后臺任務。一旦你設置了密碼,這些任務就會中斷,除非采取額外的步驟將密碼硬編碼到 /root/.my.cnf 文件中:
[mysqladmin] user = rootpassword = yourpassword
但是,這意味著你必須將密碼以純文本形式存儲在主機上。但是你至少可以使用 Unix 文件權限將對該文件的訪問限制為僅 root 用戶:
sudo chown root:root /root/.my.cnf sudo chmod 0600 /root/.my.cnf
第二步:刪除匿名用戶
匿名帳戶是既沒有用戶名也沒有密碼的 MySQL 帳戶。你不希望攻擊者在沒有密碼的情況下對你的數據庫進行任何形式的訪問,因此請在此命令的輸出中查找使用空白用戶名記錄的任何 MySQL 用戶:
> SELECT Host, User FROM mysql.user; + — — — — — — — — — — — — + — — — -+ | Host | User | + — — — — — — — — — — — — + — — — -+ | 127.0.0.1 | root | | ::1 | root | | localhost | | | localhost | root | + — — — — — — — — — — — — + — — — -+ 4 rows in set (0.00 sec)
在這些根用戶中間有一個匿名用戶( localhost ),它在 User 列中為空。你可以使用下面命令清除特定的匿名用戶:
> drop user ""@"localhost"; > flush privileges;
如果你發現任何其他匿名用戶,請確保將其刪除。
第三步:遵循最小特權原則
最小特權原則是一項安全原則,可以總結如下:
只為賬戶提供執行作業所需的訪問權限,而不提供