資料庫安全防線分三層:認證 (誰能連)、授權 (能做什麼)、傳輸加密 (數據在飛行中不可竄改/竊聽)。本文系統梳理 MySQL 用戶體系、權限模型、SSL/TLS 配置與最小權限原則落地。
MySQL 用戶 = 用戶名 + 主機 + 密碼。同名不同主機視為不同用戶,權限完全隔離。
CREATE USER 'app_user'@'10.0.%.%' IDENTIFIED BY 'StrongPass#2024';
CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadOnly#2024' REQUIRE SSL;
-- 8.0 支援雙因子認證
ALTER USER 'app_user'@'10.0.%.%' ADD 2FA AUTHENTICATION FACTOR;
| 類別 | 權限 | 說明 |
|---|---|---|
| 數據操作 (DML) | SELECT | 查詢 |
| INSERT | 插入 | |
| UPDATE | 更新 | |
| DELETE | 刪除 | |
| REFERENCES | 建外鍵引用 | |
| EXECUTE | 執行存儲過程/函數 | |
| 結構變更 (DDL) | CREATE | 建表/庫 |
| DROP | 刪表/庫 | |
| ALTER | 修改表結構 | |
| INDEX | 建/刪索引 | |
| CREATE VIEW | 建視圖 | |
| 管理權限 (高危) | GRANT OPTION | 將自己權限授予他人 |
| SUPER | KILL、CHANGE MASTER、SET GLOBAL、Debug | |
| SHUTDOWN | 關閉服務器 | |
| RELOAD | FLUSH 操作 | |
| PROCESS | SHOW PROCESSLIST | |
| FILE | LOAD DATA INFILE / SELECT INTO OUTFILE (極高危) | |
| REPLICATION CLIENT/SLAVE | 複製相關 |
-- 僅讀賬號 (生產只讀副本)
GRANT SELECT ON `biz_db`.* TO 'readonly'@'10.0.%.%';
-- 應用寫入賬號 (無 DDL、無 GRANT)
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `biz_db`.* TO 'app_user'@'10.0.%.%';
-- 開發賬號 (測試庫全權限)
GRANT ALL PRIVILEGES ON `dev_db`.* TO 'dev'@'10.0.%.%' WITH GRANT OPTION;
-- 撤銷權限
REVOKE DELETE ON `biz_db`.* FROM 'app_user'@'10.0.%.%';
-- 查看權限
SHOW GRANTS FOR 'app_user'@'10.0.%.%';
SHOW VARIABLES LIKE 'have_ssl';
-- YES 表示已編譯 OpenSSL (官方 5.7+ 預設開啟)
# 使用 MySQL 自帶工具 (5.7+)
mysql_ssl_rsa_setup --datadir=/var/lib/mysql
# 生成: ca.pem, server-cert.pem, server-key.pem, client-cert.pem, client-key.pem
[mysqld]
ssl_ca=/var/lib/mysql/ca.pem
ssl_cert=/var/lib/mysql/server-cert.pem
ssl_key=/var/lib/mysql/server-key.pem
require_secure_transport=ON # 強制所有連接必須 SSL
# 命令列
mysql -h db-host -u app_user -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
# JDBC URL
jdbc:mysql://db-host:3306/biz_db?useSSL=true&verifyServerCertificate=true&
clientCertificateKeyStoreUrl=file:/path/client.p12&
clientCertificateKeyStorePassword=secret&
trustCertificateKeyStoreUrl=file:/path/ca.p12&
trustCertificateKeyStorePassword=secret
GRANT ALL ON `biz_db`.* TO 'app_user'@'10.0.%.%' REQUIRE SSL;
GRANT SELECT ON `biz_db`.* TO 'readonly'@'%' REQUIRE X509;
GRANT SELECT ON `biz_db`.* TO 'audit'@'%' REQUIRE SUBJECT '/CN=audit-client';
GRANT SELECT ON `biz_db`.* TO 'partner'@'%' REQUIRE ISSUER '/CN=MyCA';
GRANT SELECT ON `biz_db`.* TO 'legacy'@'%' REQUIRE CIPHER 'TLS_AES_256_GCM_SHA384';
REQUIRE SSL,配合堡壘機/跳板機審計。SELECT user, host FROM mysql.user WHERE User NOT IN ('mysql.sys','root'); 檢查無用賬號、通配符主機、弱密碼。validate_password 插件強制長度、複雜度、過期輪換。audit_log 記錄所有 DDL/DML/登入/失敗嘗試。安全是系統工程:網絡層 (VPC/安全組/防火牆) + 傳輸層 (SSL/TLS) + 應用層 (參數化防注入/最小權限) + 數據層 (透明加密 TDE/字段級加密) + 審計層 (審計日誌/異常行為檢測)。MySQL 配置只是其中一環。