【取得與管理 MySQL 使用者列表的方法】加強安全性的最佳實踐

1. MySQL 使用者概述

MySQL 的使用者管理對於資料庫的安全性與運行至關重要。透過適當的使用者管理,可以防止未經授權的存取,並透過適當的權限設定提升運行效率。本文將詳細解釋 MySQL 如何儲存使用者資訊,以及如何顯示使用者列表。

1.1 MySQL 使用者管理的重要性

由於資料庫通常存有機密資訊,因此適當的使用者管理不可或缺。透過針對每位使用者細緻設定存取權限,可以加強安全性並確保資料的完整性。

2. MySQL 中使用者資訊的儲存位置

MySQL 的使用者資訊儲存在 mysql 資料庫內的 user 資料表中。該資料表包含與使用者相關的多種資訊,例如使用者名稱、主機名稱、密碼(經過加密)、身份驗證外掛等。

2.1 mysql.user 資料表的結構

mysql.user 資料表包含許多欄位,每個欄位存放與使用者相關的資訊。以下是該資料表的主要欄位:

  • Host: 使用者可存取的主機名稱
  • User: 使用者名稱
  • Password: 加密後的密碼
  • plugin: 身份驗證外掛類型
  • 其他與安全性相關的設定

要存取此資料表,需要擁有 root 權限或對 mysql.user 擁有 SELECT 權限。

3. 如何取得 MySQL 使用者列表

要檢視 MySQL 內部的使用者列表,可以使用 SQL 指令查詢 mysql.user 資料表。以下範例展示如何獲取完整的使用者列表:

SELECT User, Host FROM mysql.user;

此查詢將會回傳所有使用者及其對應的主機名稱。例如:

+--------+-----------+
| User   | Host      |
+--------+-----------+
| root   | localhost |
| admin  | %         |
| user01 | 192.168.% |
+--------+-----------+

這表示 root 帳戶僅能從本機登入,而 admin 帳戶可以從任何 IP 連線(% 表示所有 IP)。

3.1 過濾特定使用者

若要檢索特定使用者,例如篩選出名稱為 “admin” 的帳戶,可以使用以下 SQL 指令:

SELECT User, Host FROM mysql.user WHERE User = 'admin';

3.2 檢查使用者權限

若要檢查某個使用者擁有哪些權限,可以使用 SHOW GRANTS 指令。例如,檢查 admin 使用者的權限:

SHOW GRANTS FOR 'admin'@'%';

回傳結果可能如下:

+---------------------------------------------------+
| Grants for admin@%                                |
+---------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%'       |
| GRANT USAGE ON *.* TO 'admin'@'%'                |
+---------------------------------------------------+

這表示 admin 帳戶擁有所有資料庫的權限。

4. 加強 MySQL 安全性的最佳實踐

為了確保 MySQL 伺服器的安全性,建議遵循以下最佳實踐:

4.1 限制 root 帳戶的存取

為了避免攻擊者透過 root 帳戶獲取最高權限,建議僅允許 root 從本機登入:

UPDATE mysql.user SET Host='localhost' WHERE User='root';

然後重新載入權限:

FLUSH PRIVILEGES;

4.2 停用匿名使用者

MySQL 預設可能會有匿名使用者帳戶。這些帳戶應該被刪除,以防止未經授權的存取:

DELETE FROM mysql.user WHERE User='';

並重新載入權限:

FLUSH PRIVILEGES;

4.3 使用強密碼

確保所有使用者帳戶都使用強密碼,可以使用以下 SQL 指令來變更密碼:

ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongP@ssw0rd!';

4.4 啟用 MySQL 日誌監控

建議啟用 MySQL 的查詢日誌,以監控不尋常的存取行為。例如,可以開啟一般查詢日誌:

SET GLOBAL general_log = 'ON';

這將會記錄所有的 SQL 查詢,方便進行審計。

透過這些安全性強化措施,可以有效保護 MySQL 伺服器,防止未經授權的存取和潛在的安全漏洞。

5. 管理 MySQL 使用者帳戶

除了取得使用者列表外,管理 MySQL 使用者帳戶也是維護資料庫安全的重要工作。以下是一些關鍵的管理方法。

5.1 新增使用者

可以使用 CREATE USER 指令來建立新的 MySQL 使用者。例如,新增一個名為 developer 並允許從本機登入的帳戶:

CREATE USER 'developer'@'localhost' IDENTIFIED BY 'DevPass123!';

5.2 指派權限

新增使用者後,必須明確指派適當的權限。例如,允許 developer 帳戶對 project_db 資料庫進行所有操作:

GRANT ALL PRIVILEGES ON project_db.* TO 'developer'@'localhost';

變更權限後,需重新載入權限設定:

FLUSH PRIVILEGES;

5.3 移除使用者

如果某個帳戶不再需要,可以使用 DROP USER 指令來刪除它。例如,刪除 developer 帳戶:

DROP USER 'developer'@'localhost';

請確保刪除帳戶後,立即刷新權限:

FLUSH PRIVILEGES;

5.4 修改使用者密碼

若需修改現有使用者的密碼,可以使用 ALTER USER 指令。例如,變更 admin 帳戶的密碼:

ALTER USER 'admin'@'%' IDENTIFIED BY 'NewStrongP@ss!';

6. 監控與審計 MySQL 使用者行為

為了進一步加強安全性,應該定期監控 MySQL 使用者的活動,並記錄存取紀錄。

6.1 啟用 MySQL 日誌

可啟用 MySQL 的一般查詢日誌來記錄所有執行的 SQL 指令:

SET GLOBAL general_log = 'ON';

日誌檔案的位置可以使用以下指令查詢:

SHOW VARIABLES LIKE 'general_log_file';

6.2 檢視最近的登入記錄

MySQL 8.0 及更新版本支援 performance_schema,可用來查詢最近的登入記錄:

SELECT * FROM performance_schema.accounts;

7. 結論

透過本指南,我們學習了如何在 MySQL 中取得使用者列表、管理帳戶以及強化安全性。以下是本文的重點:

  • 使用 mysql.user 資料表查詢 MySQL 使用者列表。
  • 利用 SHOW GRANTS 指令來檢查使用者權限。
  • 新增、刪除、修改 MySQL 使用者帳戶的方法。
  • 強化 MySQL 安全性的最佳實踐,例如限制 root 存取、刪除匿名帳戶及設定強密碼。
  • 透過日誌與監控機制來追蹤使用者行為,確保系統安全。

透過這些措施,可以有效地管理 MySQL 使用者,確保資料庫的安全性與穩定運行。