MySQL 採用「登錄驗證 → 授權檢查 → 訪問控制」三層安全模型,構建纵深防禦體系。理解這三層邏輯是配置精細權限、防範數據洩露的基石。
基於「用戶名 + 密碼 + 來源位置」三元組驗證。同一用戶從不同主機登錄可擁有完全不同的權限集,實現了基於網絡拓撲的訪問隔離。
登錄成功後,根據授權表判定用戶的全局權限(如 SUPER、SHUTDOWN、FILE 等高危操作權限)。
精細到庫、表、列級別的操作權限(SELECT、INSERT、UPDATE、DELETE、INDEX、ALTER、CREATE、DROP、GRANT、REFERENCES),所有權限均為布爾型開關。
| 分類 | 權限 | 風險等級 | 說明 |
|---|---|---|---|
| 數據操作 | SELECT | 低 | 查詢數據,無此權限僅能執行簡單表達式計算 |
| INSERT | 低 | 插入數據 | |
| UPDATE | 中 | 修改數據 | |
| DELETE | 高 | 刪除數據 | |
| INDEX | 中 | 創建/刪除索引 | |
| ALTER | 高 | 修改表結構 | |
| CREATE | 高 | 創建庫/表 | |
| DROP | 極高 | 刪除庫/表 | |
| 管理權限 | GRANT | 極高 | 授權給他人,可導致權限蔓延 |
| RELOAD | 高 | 執行 FLUSH 操作 | |
| SHUTDOWN | 極高 | 關閉數據庫服務 | |
| PROCESS | 中 | 查看/殺死進程,可能洩露敏感 SQL | |
| FILE | 極高 | 讀寫服務器文件,可導致任意代碼執行 | |
| SUPER | 極高 | 殺死任意查詢、修改全局變量、啟用/禁用複製 |
原則:生產環境嚴禁將 FILE、SUPER、SHUTDOWN、GRANT 權限授予應用賬號,遵循最小權限原則。
MySQL 4.1+ 基於 OpenSSL 支持 SSL,防止明文傳輸被竊聽。配置步驟:
SHOW VARIABLES LIKE 'have_openssl'; 返回 YES 表示可用[mysqld]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
[client]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/client-cert.pem
ssl-key=/path/to/client-key.pem
GRANT ALL PRIVILEGES ON secure_db.* TO 'app_user'@'%'
IDENTIFIED BY 'strong_pass' REQUIRE SSL;
進階選項:REQUIRE X509(需客戶端證書)、REQUIRE SUBJECT(指定主體)、REQUIRE ISSUER(指定簽發者)、REQUIRE CIPHER(指定加密套件)。MySQL 將權限信息存儲在 mysql 庫的 5 張 MyISAM 表中:
直接操作授權表需謹慎,修改後必須執行 FLUSH PRIVILEGES 生效。
MySQL 提供 4 種哈希函數:
MD5():128 位,輸出 32 字符十六進制,推薦用於應用層密碼存儲SHA1():160 位,比 MD5 更強PASSWORD():MySQL 內部認證專用,不建議業務使用(算法不透明、版本差異大)ENCRYPT():基於 Unix crypt(),依賴系統庫,可移植性差推薦做法:應用層使用 bcrypt/Argon2 加鹽哈希,數據庫僅存儲哈希值;若必須在 SQL 層處理,優先選 SHA2('plain', 256)(MySQL 5.5+)。
AES_ENCRYPT()/AES_DECRYPT():AES 算法,密鑰長度 128/192/256 位,生產環境首選ENCODE()/DECODE():自有弱加密算法,已棄用,不安全-- 存儲加密身份證號
INSERT INTO users (id_card_enc) VALUES (AES_ENCRYPT('110101199001011234', 'master_key_256_bit'));
-- 查詢解密
SELECT AES_DECRYPT(id_card_enc, 'master_key_256_bit') FROM users WHERE id = 1;
關鍵點:主鑰必須通過密鑰管理系統(KMS)或環境變量注入,絕不可硬編碼在代碼或 SQL 中。
DELETE FROM mysql.user WHERE User='';UPDATE mysql.user SET Host='localhost' WHERE User='root';SELECT User, Host FROM mysql.user WHERE Super_priv='Y' OR File_priv='Y';validate_password 插件)audit_log 插件)記錄所有 DDL/DML 操作MySQL 安全不僅是配置權限,更是持續的監控、審計與應急響應體系建設。將數據庫視為核心資產,實施纵深防禦,才能在合規與業務安全間取得平衡。