MySQL
安裝與環境設定 ─ 設定使用者、密碼與權限
簡介
在 MySQL 的日常運維與開發工作中,使用者、密碼與權限的管理是安全的第一道防線。如果不妥善設定,資料庫可能會被未授權的程式或人員存取,造成資料外洩、服務中斷等嚴重後果。
本單元將說明如何在 MySQL 中建立與管理使用者、設定安全的密碼策略,並依需求分配最小權限(principle of least privilege),讓新手也能快速上手、避免常見的安全漏洞。
核心概念
1. MySQL 使用者模型
MySQL 的使用者由 帳號名稱 與 主機限制 組成,形式為 user_name@host。
user_name:可以是任意字串,建議使用符合公司命名規則的前綴(如dev_,app_)。host:指定此帳號允許從哪個主機連線,常見寫法有localhost(僅本機)、%(任何主機)或具體 IP。
⚠️ 不要使用
root@%,這會讓 root 帳號可從任何位置登入,極易成為攻擊目標。
2. 密碼儲存與驗證方式
MySQL 8.0 之後預設使用 caching_sha2_password 插件,較舊版則是 mysql_native_password。
caching_sha2_password提供更強的雜湊演算法,建議在新專案中直接使用。- 若應用程式仍不支援此插件,可暫時切換回
mysql_native_password,但務必在未來升級。
設定密碼的基本語法
-- 建立使用者並同時指定密碼與驗證插件
CREATE USER 'app_user'@'192.168.1.%'
IDENTIFIED WITH caching_sha2_password BY 'StrongP@ssw0rd!';
提示:密碼應符合 長度 ≥ 12、包含大小寫、數字與特殊字元 的強度規則,並定期更換。
3. 權限系統概述
MySQL 的權限分為 全域、資料庫層級、資料表層級、欄位層級 以及 例程(PROCEDURE/FUNCTION)層級。
授予權限的指令為 GRANT,撤銷則使用 REVOKE。
在實務上,盡量在最細粒度上授權,例如只允許 SELECT 某張表,避免給予 ALL PRIVILEGES 給一般帳號。
常見權限代號
| 權限代號 | 說明 |
|---|---|
SELECT |
讀取資料 |
INSERT |
新增資料 |
UPDATE |
更新資料 |
DELETE |
刪除資料 |
CREATE |
建立資料庫或資料表 |
DROP |
刪除資料庫或資料表 |
EXECUTE |
執行儲存程序 |
4. 管理使用者的實務指令
以下提供 5 個常用範例,涵蓋建立、修改、授權、撤銷與刪除帳號的完整流程。
(1) 建立僅能讀取 sales 資料庫的帳號
CREATE USER 'sales_reader'@'10.0.0.%'
IDENTIFIED WITH caching_sha2_password BY 'R3adOnly#2025';
GRANT SELECT ON sales.* TO 'sales_reader'@'10.0.0.%';
FLUSH PRIVILEGES; -- 立即讓變更生效
(2) 為開發人員帳號賦予多資料庫的寫入權限
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'DevPass!2025';
GRANT SELECT, INSERT, UPDATE, DELETE ON dev_db1.* TO 'dev_user'@'%';
GRANT SELECT, INSERT ON dev_db2.* TO 'dev_user'@'%';
FLUSH PRIVILEGES;
(3) 修改已存在使用者的密碼與驗證插件
ALTER USER 'app_user'@'192.168.1.%'
IDENTIFIED WITH caching_sha2_password BY 'N3wStr0ng#Pwd';
FLUSH PRIVILEGES;
(4) 撤銷特定資料表的 DELETE 權限
REVOKE DELETE ON sales.orders FROM 'sales_reader'@'10.0.0.%';
FLUSH PRIVILEGES;
(5) 刪除不再使用的帳號
DROP USER IF EXISTS 'old_user'@'localhost';
FLUSH PRIVILEGES;
小技巧:每次調整權限後都執行
FLUSH PRIVILEGES;,可確保變更立即在記憶體中生效,避免因快取延遲造成的權限錯誤。
常見陷阱與最佳實踐
| 陷阱 | 可能的後果 | 建議的最佳實踐 |
|---|---|---|
使用 root 帳號直接開發 |
一旦程式碼外洩,攻擊者可取得完整控制權 | 為每個應用建立專屬帳號,且僅授予所需最小權限 |
| 密碼過於簡單或重複使用 | 容易被暴力破解或字典攻擊 | 設定 密碼強度政策(長度、複雜度),並使用密碼管理工具 |
授予 GRANT OPTION 給非管理帳號 |
使用者可自行授權,擴散權限 | 僅在管理帳號上使用 GRANT OPTION,其他帳號絕不授予 |
忘記 FLUSH PRIVILEGES |
權限變更未即時生效,導致測試結果不符合預期 | 變更完畢後固定寫入 FLUSH PRIVILEGES; |
將 host 設為 % |
任何 IP 均可嘗試登入,增加被掃描的風險 | 限制登入來源 IP,或使用 VPN/防火牆配合限制 |
最佳實踐小結:
- 最小權限原則:先授權,再逐步調整。
- 密碼週期管理:建議每 90 天更換一次,並使用
PASSWORD EXPIRE功能。 - 使用審計插件:MySQL Enterprise Audit 或 MariaDB Audit Plugin 可記錄權限變更歷史。
- 結合防火牆:在 OS 或雲端安全組中限制 MySQL 3306 埠的來源 IP。
- 定期檢查:使用
SELECT user, host, authentication_string FROM mysql.user;檢視帳號與加密方式。
實際應用場景
多租戶 SaaS 平台
每個租戶都有獨立的資料庫,系統在建立新租戶時自動執行以下腳本:CREATE USER 'tenant_123'@'%' IDENTIFIED BY 'T3nant!Pass'; GRANT SELECT, INSERT, UPDATE, DELETE ON tenant_123_db.* TO 'tenant_123'@'%'; FLUSH PRIVILEGES;這樣即使某租戶的應用程式被入侵,也只能操作自己的資料庫。
CI/CD 自動化測試環境
測試腳本需要臨時建立測試用帳號,完成測試後即刪除:CREATE USER 'ci_test'@'127.0.0.1' IDENTIFIED BY 'Tmp#2025'; GRANT SELECT, INSERT ON test_db.* TO 'ci_test'@'127.0.0.1'; -- 執行測試 DROP USER 'ci_test'@'127.0.0.1'; FLUSH PRIVILEGES;資料分析師只讀存取
為避免分析師誤刪或修改資料,僅授予SELECT權限:CREATE USER 'analyst'@'10.10.0.%' IDENTIFIED BY 'An@lyt1c$'; GRANT SELECT ON analytics.* TO 'analyst'@'10.10.0.%'; FLUSH PRIVILEGES;
透過上述範例,可見 使用者與權限的精細化管理,不僅提升安全性,也有助於符合企業合規需求(如 GDPR、PCI‑DSS)。
總結
設定 MySQL 的使用者、密碼與權限是一項 不可或缺的基礎工作,它直接影響資料庫的安全與運維效率。本文重點回顧如下:
- 使用者模型:
user@host的組合決定連線來源。 - 密碼與驗證:建議使用
caching_sha2_password,並遵守強密碼政策。 - 權限最小化:依需求在全域、資料庫、資料表層級授權,避免
GRANT OPTION的濫用。 - 常見陷阱:避免
root@%、簡易密碼、忘記FLUSH PRIVILEGES等問題。 - 實務範例:提供建立、修改、授權、撤銷、刪除帳號的完整指令,並示範多租戶、CI/CD、分析師只讀等應用情境。
掌握以上概念與操作後,你將能在 開發、測試、上線 的每個階段,為 MySQL 資料庫建立堅實的安全防護,讓系統更穩定、資料更可靠。祝你在 MySQL 的旅程中,玩得開心、寫得安心!