【必知必會】強化MySQL應採取的五個重要安全技巧

青灯夜游
發布: 2022-10-20 19:30:28
轉載
1908 人瀏覽過

【必知必會】強化MySQL應採取的五個重要安全技巧

長期以來,資料庫一直是你的平衡架構的重要組成部分,可以說是最重要的部分。如今,壓力已經朝向你的大部分一次性和無狀態的基礎設施,這給你的資料庫帶來了更大的負擔,既要可靠又安全,因為所有其他伺服器不可避免地會連同其餘資料一起在資料庫中儲存有狀態資訊。

你的資料庫是每個攻擊者想要獲得的大獎。隨著攻擊變得更加複雜和網路變得更加敵對,採取額外步驟來強化資料庫比以往任何時候都更加重要。

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;
登入後複製

如果你發現任何其他匿名用戶,請確保將其刪除。

第三個步驟:遵循最小特權原則

最小特權原則是一項安全原則,可以總結如下:

只為帳戶提供執行作業所需的存取權限,而不提供更多權限。

此原則可以透過多種方式應用於 MySQL。首先當使用GRANT 命令向特定使用者新增資料庫權限時,請確保僅限制該使用者需要存取資料庫的權限:

> grant all privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
登入後複製

如果該使用者只需要存取特定的資料表(例如,users 資料表),則用mydb.users  或任何你的表格的名字替換mydb.*(授予所有表格的權限)。

許多人會授予使用者對資料庫的完全存取權限;但是如果你的資料庫使用者僅只需要讀取資料而不需要更改數據,則需要額外的步驟授予對資料庫的唯讀存取權:

> grant select privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
登入後複製

最後,許多資料庫使用者不會從localhost 存取資料庫,通常管理員會建立他們,像這樣:

> grant all privileges on mydb.* to someuser@"%"  identified by 'astrongpassword';
> flush privileges;
登入後複製

這將允許「someuser」從任何網路存取資料庫。但是,如果你有一組定義明確的內部IP,或者- 甚至更好- 已經設定了VLANS ,以便你所有應用程式伺服器與其它主機位於不同的子網路中,那麼就可以利用這個優勢來限制“someuser” ,使得該帳戶只能從特定網路存取資料庫:

> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword';
> flush privileges;
登入後複製

第四步:启用 TLS

设置强密码仅只有攻击者可以在网络上读取你的密码或者其他敏感数据的情况下才能达到此目的。因此,使用 TLS 保护你的所有网络流量比以往任何时候都更加重要。

MySQL 也不例外。

幸运的是,在 MySQL 中启用 TLS 比较简单。一旦你有了你的主机的有效证书,只需要在你的主 my.cnf 文件的 [mysqld]部分添加以下几行 :

[mysqld]
ssl-ca=/path/to/ca.crt
ssl-cert=/path/to/server.crt
ssl-key=/path/to/server.key
登入後複製

为了额外的安全性,还可以添加 ssl-cipher 配置选项,其中包含一个被认可的密码列表,而不是只接受默认的密码列表,这可能包括较弱的 TLS 密码。我推荐使用  Mozilla Security/Server Side TLS page 所推荐的现代或者中级密码套件。

一旦服务器端设置了 TLS ,你可以限制客户端必须采用 TLS 进行连接,通过在 GRANT 语句中添加 REQUIRE SSL :

> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword' REQUIRE SSL;

> flush privileges;
登入後複製

第五步:加密数据库密钥

虽然现在很多人都知道使用单向散列(理想情况下是像 bcrypt 这样慢速散列 ),保护用户数据库存储的密码有多重要,但通常没过多考虑使用加密来保护数据库上其他的敏感数据。事实上,许多管理员会告诉你他们的数据库是加密的,因为磁盘本身是加密的。这实际上会影响你的数据库加固,不是因为磁盘加固有缺陷或糟糕的做法,而是因为它会给你一种错误的信任感。

磁盘加密保护你的数据库数据,以防止有人从你的服务器窃取磁盘(或者你买了二手磁盘后忘记擦除磁盘),但是磁盘加密并不能在数据库本身运行时保护你,因为驱动器需要处于解密状态才能被读取。

要保护数据库中的数据,你需要采取额外的措施,在存储敏感字段之前对它们进行加密。这样如果攻击者找到了某种方法来转存完整的数据库,你的敏感字段仍然会受到保护。

有许多加密数据库中字段的方法,而且 MySQL 支持本地加密命令。无论你采取哪种加密方法,我都建议避免你需要将解密密钥存储在数据库本身的加密方法。

理想情况下,你会把解密的密钥存储在应用服务器上,作为本地GPG密钥(如果你使用GPG进行加密)或者将其存储为应用程序服务器上的环境变量。这样即使攻击者可能找到一种方法来破坏应用程序服务器的服务器,他也必须将攻击转换为本地shell访问,以此来获取你的解密密钥。

MySQL 加固原则:掌握最小权限原则

有很多方法来锁定你的MySQL服务器。确切地说,你如何实施这些步骤取决于你如何设置自己的数据库,以及它在网络中的位置。

虽然前面的五个步骤将有助于保护你的数据库,但我认为更需要掌握的最重要的整体步骤是最小权限原则。你的数据库可能存储来一些非常有用的数据,如果你确保用户和应用程序只具有执行其工作的所需的最小访问权限,那么你将限制攻击者能够做什么,如果黑客找到来危害该用户或者应用程序的方法。

【相关推荐:mysql视频教程

以上是【必知必會】強化MySQL應採取的五個重要安全技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!