隨著網絡應用普及,數據庫作為核心資產承載者,面臨著數據傳輸攔截、非授權訪問、權限提升等多重威脅。MySQL 作為最流行的開源數據庫,提供了多層次的安全機制。本文系統梳理賬號認證、權限模型、SSL 加密傳輸、授權表結構、敏感數據哈希存儲等核心防禦體系。
MySQL 賬號由 用戶名、密碼、來源主機 三元組唯一標識。同一用戶名從不同主機連接,可擁有完全不同的權限與密碼。
GRANT SELECT ON db1.* TO 'abc'@'server1' IDENTIFIED BY 'pwd1';
GRANT SELECT ON db2.* TO 'abc'@'server1' IDENTIFIED BY 'pwd2';
用戶 abc 訪問 db1 用 pwd1,訪問 db2 用 pwd2。這實現了「最小權限原則」下的憑證隔離,防止單一憑證洩露導致全庫失陷。
| 權限分類 | 關鍵字 | 說明 |
|---|---|---|
| 數據操作 | SELECT | 查詢權限,無此權限僅能執行表達式計算類 SELECT |
| INSERT | 插入數據 | |
| UPDATE | 修改數據 | |
| DELETE | 刪除數據 | |
| INDEX | 創建/刪除索引 | |
| ALTER | 修改表結構 | |
| CREATE | 創建庫/表 | |
| GRANT | 將自身權限授予他人(極高危) | |
| REFERENCES | 創建外鍵約束 | |
| 管理級權限 (極度謹慎授予) | RELOAD | 執行 FLUSH TABLES/STATUS 等 |
| SHUTDOWN | 關閉 MySQL 服務 | |
| PROCESS | 查看/殺死進程(SHOW PROCESSLIST, KILL),可見敏感 SQL | |
| FILE | LOAD DATA INFILE,可讀取服務器任意文件(極高危) | |
| SUPER | 殺死任意查詢,修改全局變量,刷新日志等 |
GRANT/REVOKE 不影響此表,需手工維護。權限生效邏輯:user → db → tables_priv → columns_priv 逐層疊加,任一層允許即通過。
MySQL 4.1+ 基於 OpenSSL 實現 SSL 支持。啟用步驟:
--with-openssl)my.cnf:ssl-ca, ssl-cert, ssl-keyGRANT ALL ON ssl_db.* TO 'user'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;
-- 或要求特定客戶端證書
GRANT ALL ON ssl_db.* TO 'user'@'%' IDENTIFIED BY 'pwd' REQUIRE SUBJECT '/CN=client.example.com';
-- 或要求特定簽發機構
GRANT ALL ON ssl_db.* TO 'user'@'%' IDENTIFIED BY 'pwd' REQUIRE ISSUER '/CN=ca.example.com';
-- 或指定加密套件
GRANT ALL ON ssl_db.* TO 'user'@'%' IDENTIFIED BY 'pwd' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
驗證 SSL 連接:SHOW VARIABLES LIKE 'have_ssl'; 應返回 YES;連接後執行 SHOW STATUS LIKE 'Ssl_cipher'; 顯示當前加密套件。
密碼、銀行卡 PIN 等極敏感數據 絕不可明文存儲。哈希算法特性:單向不可逆,驗證時將輸入同算法哈希後與存儲值比對。
| 函數 | 輸出長度 | 特點 | 推薦度 |
|---|---|---|---|
| MD5() | 32 字符 (128-bit) | 速度快,廣泛支持,明文不出現在進程列表/日志(若用 SQL 調用) | ⭐⭐⭐⭐⭐ |
| SHA1() | 40 字符 (160-bit) | 比 MD5 強,但同樣面臨碰撞攻擊風險 | ⭐⭐⭐⭐ |
| PASSWORD() | 16/41 字符 | MySQL 內部認證專用,算法版本相關,不建議業務使用 | ⭐ |
| ENCRYPT() | 視鹽值而定 | 基於 crypt(),僅 Unix/Linux 有效,Windows 返回 NULL | ⭐⭐ |
-- 註冊/修改密碼
INSERT INTO users (username, pwd_hash) VALUES ('zhangsan', MD5('plain_password'));
-- 或更安全:應用層使用 bcrypt/Argon2,僅存儲結果
-- 登錄驗證
SELECT * FROM users WHERE username='zhangsan' AND pwd_hash = MD5('input_password');
進階建議:生產環境應在應用層使用 bcrypt、scrypt、Argon2 等自適應慢哈希算法,並加入隨機鹽值,僅將最終哈希值存入 MySQL。資料庫層面的 MD5/SHA1 僅適用於非核心敏感度場景或歷史兼容。
DELETE FROM mysql.user WHERE User='';UPDATE mysql.user SET Host='localhost' WHERE User='root';DROP DATABASE test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';mysql.user 表,檢查無密碼/弱密碼/過寬 Host 的賬號FILE、PROCESS、SUPER、GRANT 等高危權限MySQL 安全防禦是一個系統工程:網絡層用 SSL,認證層用強密碼+主機限制,授權層用最小權限+細粒度授權表,存儲層用慢哈希+鹽值。任何單一環節失守都可能導致數據洩露。建議將上述清單納入上線前驗收標準,並建立定期審計機制。