網路傳輸面臨:竊聽 (明文傳輸)、竄改 (中間人)、冒充 (弱認證)、越權 (權限失控)。MySQL 提供多層防禦機制。
MySQL 帳號 = 用戶名 + 密碼 + 來源位置 (Host: IP、主機名、通配符 %)
# 同一用戶名,不同來源擁有不同權限/密碼
GRANT SELECT ON db1.* TO 'alice'@'192.168.1.10' IDENTIFIED BY 'pass1';
GRANT SELECT ON db2.* TO 'alice'@'192.168.1.20' IDENTIFIED BY 'pass2';
# alice 從不同 IP 連線,權限與密碼完全隔離
此設計實現來源基準的權限隔離,防止單一帳號被盜用後橫向移動。
| 層級 | 名稱 | 檢查內容 | 對應 MySQL 機制 |
|---|---|---|---|
| 1 | 登入驗證 | 用戶名/密碼/來源驗證 | Authentication Plugin (caching_sha2_password, mysql_native_password) |
| 2 | 授權檢查 | 全域/資料庫/資料表/欄位級權限 | GRANT/REVOKE 權限系統 (mysql.user, db, tables_priv, columns_priv) |
| 3 | 存取控制 | 具體操作許可 (SELECT/INSERT/UPDATE/DELETE/EXECUTE...) | 權限位元組合、資源限制 (MAX_QUERIES_PER_HOUR 等) |
| 權限 | 範圍 | 說明 |
|---|---|---|
SELECT | 資料表/欄位 | 查詢資料。無此權限僅能執行 SELECT 1+1 等無表查詢 |
INSERT | 資料表 | 插入新行 |
UPDATE | 資料表/欄位 | 修改現有行 |
DELETE | 資料表 | 刪除行 |
INDEX | 資料表 | 建立/刪除索引 |
ALTER | 資料表 | 修改表結構 |
CREATE | 資料庫/資料表 | 建立新物件 |
DROP | 資料庫/資料表 | 刪除物件 |
GRANT | 全域 | 將自身權限授予他人 (權限傳遞) |
REFERENCES | 資料表/欄位 | 建立外來鍵約束引用 |
RELOAD | 全域 | 執行 FLUSH TABLES/LOGS/PRIVILEGES 等 |
SHUTDOWN | 全域 | 關閉 MySQL 服務 |
PROCESS | 全域 | 查看 SHOW PROCESSLIST 完整資訊 |
SUPER | 全域 | KILL 線程、CHANGE MASTER、PURGE BINLOG 等超級操作 |
REPLICATION SLAVE | 全域 | 從庫連線讀取 Binlog |
REPLICATION CLIENT | 全域 | SHOW MASTER/SLAVE STATUS |
# 1. 產生憑證 (OpenSSL)
openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -x509 -days 365 -out server-cert.pem
openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -x509 -days 365 -out client-cert.pem
# 2. 伺服器配置
[mysqld]
ssl-ca = /etc/mysql/ca-cert.pem
ssl-cert = /etc/mysql/server-cert.pem
ssl-key = /etc/mysql/server-key.pem
require_secure_transport = ON # 強制所有連線使用 SSL
# 3. 客戶端連線
mysql -h host -u user -p --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
# 4. 驗證加密生效
STATUS;
# SSL: Cipher in use is TLS_AES_256_GCM_SHA384
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 設定長度、複雜度、過期週期GRANT USAGE ON *.* TO 'user'@'%' WITH MAX_CONNECTIONS_PER_HOUR 1000 MAX_QUERIES_PER_HOUR 5000;MariaDB Audit Plugin