【必知必會】強化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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

在 CentOS 上安裝 MySQL 涉及以下步驟:添加合適的 MySQL yum 源。執行 yum install mysql-server 命令以安裝 MySQL 服務器。使用 mysql_secure_installation 命令進行安全設置,例如設置 root 用戶密碼。根據需要自定義 MySQL 配置文件。調整 MySQL 參數和優化數據庫以提升性能。

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。
