MySQL 5.7 在安全體系上進行了重大重構:賬號創建與授權分離、密碼過期/鎖定策略、代理用戶、默認 SSL 加密、嚴格 SQL Mode、移除測試庫、初始化隨機密碼。本文逐項解析配置方法、實戰場景與避坑指南。
# 5.7 前 (棄用,報 Warning) GRANT ALL ON *.* TO 'dxy'@'localhost' IDENTIFIED BY '123456'; # Warning: Using GRANT for creating new user is deprecated...
-- 步驟1: 創建用戶 (認證插件、密碼策略、鎖定、過期均在這裡控制) CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456'; -- 等同於指定默認插件 CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '123456'; -- 使用哈希值創建 (避免明文傳輸) CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'; -- 步驟2: 授權 GRANT SELECT, INSERT, UPDATE, DELETE ON dba_test.* TO 'dxy'@'localhost';
-- 查看默認 root 權限 SHOW GRANTS FOR 'root'@'localhost'; -- 輸出兩條: -- GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION -- GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION -- 創建新管理員 CREATE USER 'dba'@'127.0.0.1' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'127.0.0.1' WITH GRANT OPTION; GRANT PROXY ON ''@'' TO 'dba'@'127.0.0.1' WITH GRANT OPTION; -- 代理用戶授權需此權限
-- 查看權限 SHOW GRANTS FOR 'dxy'@'localhost'; -- 查看創建語句 (含哈希密碼、過期策略、鎖定狀態) SHOW CREATE USER 'dxy'@'localhost'; -- CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*HASH' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
適用場景:合規要求、定期輪換、洩露風險降低、程序強制斷開重連獲取新密碼。
| 子句 | 含義 | 受控變量 |
|---|---|---|
PASSWORD EXPIRE DEFAULT | 默認策略,過期天數由 default_password_lifetime 全局變量控制 (默認 0=不過期) | default_password_lifetime |
PASSWORD EXPIRE NEVER | 永不過期 | - |
PASSWORD EXPIRE INTERVAL N DAY | N 天后過期 | - |
PASSWORD EXPIRE | 立即過期 (下次登錄強制改密) | - |
-- 鎖定賬號 (拒絕所有連接) ALTER USER 'dxy'@'localhost' ACCOUNT LOCK; -- 登錄報錯: ERROR 3118 (HY000): Access denied for user 'dxy'@'localhost'. Account is locked. -- 解鎖恢復 ALTER USER 'dxy'@'localhost' ACCOUNT UNLOCK;
場景:連接池用戶代理業務用戶、審計需區分真實操作者、多租戶權限復用。
-- 1. 原始賬號 (擁有實際權限) CREATE USER 'dxy'@'127.0.0.1' IDENTIFIED BY '123456'; GRANT ALL ON test.* TO 'dxy'@'127.0.0.1'; -- 2. 代理賬號 (應用連接池使用) CREATE USER 'dxy_proxy'@'127.0.0.1' IDENTIFIED BY '123456'; -- 3. 授予代理權限 GRANT PROXY ON 'dxy'@'127.0.0.1' TO 'dxy_proxy'@'127.0.0.1'; -- 4. 驗證 -- 代理賬號登錄後: SELECT USER(), CURRENT_USER(); -- USER() = 'dxy_proxy@127.0.0.1' (連接用戶) -- CURRENT_USER() = 'dxy@127.0.0.1' (生效權限用戶) SHOW GRANTS; -- 顯示 dxy 的權限 -- 實際操作權限 = dxy 的權限
# 一鍵生成 SSL/RSA 文件 (數據目錄下生成 *.pem) mysql_ssl_rsa_setup # 生成文件: # ca.pem, ca-key.pem -- CA 證書/私鑰 # server-cert.pem, server-key.pem -- 服務端證書/私鑰 # client-cert.pem, client-key.pem -- 客戶端證書/私鑰 # private_key.pem, public_key.pem -- RSA 密鑰對 (用於 caching_sha2_password) # 默認連接即使用 SSL 加密 mysql -u dba -p -h 127.0.0.1 \s -- SSL: Cipher in use is DHE-RSA-AES256-SHA # 強制 SSL 登錄 (創建用戶時 REQUIRE SSL) CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;
性能提示: SSL 加密傳輸約帶來 20-25% CPU 開銷,內網高並發場景權衡啟用。
SELECT @@sql_mode; -- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE, -- ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
| Mode | 作用 | 違規示例 | 報錯信息 |
|---|---|---|---|
| ONLY_FULL_GROUP_BY | GROUP BY 必須包含所有非聚合列 | SELECT name, MAX(age) FROM t GROUP BY name (若 SELECT id 未在 GROUP BY) | Expression #1 of SELECT list is not in GROUP BY clause |
| STRICT_TRANS_TABLES | 事務表嚴格模式:數據截斷/類型不匹配/空值違約 → 報錯回滾 | VARCHAR(10) 插入 20字符 / NOT NULL列插入NULL / 日期插入 'abc' | Data too long / Field doesn't have default / Incorrect datetime value |
| NO_ZERO_IN_DATE | 嚴格模式下禁止月/日為 0 的日期 | '2023-00-01', '2023-01-00' | Incorrect date value |
| NO_ZERO_DATE | 嚴格模式下禁止 '0000-00-00' | INSERT '0000-00-00' | Incorrect datetime value |
| ERROR_FOR_DIVISION_BY_ZERO | 嚴格模式下除零報錯而非返回 NULL | SELECT 1/0; INSERT INTO t VALUES (1/0); | Division by 0 |
| NO_AUTO_CREATE_USER | GRANT 必須指定密碼,禁止隱式創建用戶 | GRANT SELECT ON *.* TO 'newuser'@'%'; | Can't find any matching row in the user table |
| NO_ENGINE_SUBSTITUTION | 指定引擎不可用時不自動降級,直接報錯 | CREATE TABLE t (...) ENGINE=Tokudb; (未安裝) | Unknown storage engine 'Tokudb' |
| 特性 | 5.7 行為 | 運維動作 |
|---|---|---|
| 創建用戶 | CREATE USER + GRANT 兩步 | 腳本遷移、禁用 GRANT 創建 |
| 用戶名長度 | 32字節 (原16) | 應用層長度驗證調整 |
| 密碼過期 | 支持 INTERVAL/DEFAULT/NEVER | 合規場景配置策略 |
| 賬號鎖定 | ACCOUNT LOCK/UNLOCK | 熔斷腳本集成 |
| 代理用戶 | PROXY 權限 + 參數啟用 | 連接池/審計場景評估 |
| test庫 | 默認移除 | 舊實例手動 DROP |
| SSL | mysql_ssl_rsa_setup 一鍵生成、默認加密 | 生產環境配置證書、強制關鍵賬號 REQUIRE SSL |
| 初始化 | mysqld --initialize 隨機密碼 | 部署腳本更新、首次登錄改密 |
| SQL Mode | 默認嚴格模式組合 | 主從一致、應用 SQL 合規化改造 |