本文 AI 產出,尚未審核

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/防火牆配合限制

最佳實踐小結

  1. 最小權限原則:先授權,再逐步調整。
  2. 密碼週期管理:建議每 90 天更換一次,並使用 PASSWORD EXPIRE 功能。
  3. 使用審計插件:MySQL Enterprise Audit 或 MariaDB Audit Plugin 可記錄權限變更歷史。
  4. 結合防火牆:在 OS 或雲端安全組中限制 MySQL 3306 埠的來源 IP。
  5. 定期檢查:使用 SELECT user, host, authentication_string FROM mysql.user; 檢視帳號與加密方式。

實際應用場景

  1. 多租戶 SaaS 平台
    每個租戶都有獨立的資料庫,系統在建立新租戶時自動執行以下腳本:

    CREATE USER 'tenant_123'@'%' IDENTIFIED BY 'T3nant!Pass';
    GRANT SELECT, INSERT, UPDATE, DELETE ON tenant_123_db.* TO 'tenant_123'@'%';
    FLUSH PRIVILEGES;
    

    這樣即使某租戶的應用程式被入侵,也只能操作自己的資料庫。

  2. 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;
    
  3. 資料分析師只讀存取
    為避免分析師誤刪或修改資料,僅授予 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 的旅程中,玩得開心、寫得安心!