首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MySQL 權限體系深度解析與安全加固實戰指南 (下)

     編輯:關於SqlServer

授權表結構詳解

MySQL 權限系統基於 `mysql` 系統庫中的五張授權表,按粒度從粗到細分層:

表名粒度核心範圍列權限列示例
user全局/實例級Host, User, PasswordSelect_priv, Insert_priv, ..., Super_priv, File_priv
db數據庫級Host, Db, UserSelect_priv, Create_priv, Drop_priv, Grant_priv
host主機+數據庫級Host, Db同 db 表,不受 GRANT/REVOKE 影響
tables_priv表級Host, Db, User, Table_nameTable_priv (set), Column_priv (set)
columns_priv列級Host, Db, User, Table_name, Column_nameColumn_priv (set: Select, Insert, Update, References)

權限匹配邏輯:兩階段驗證

  1. 連接驗證 (Stage 1):線程啟動時,按 `user` → `db` → `host` 順序匹配 `Host`+`User`,決定是否允許連接及全局權限。
    匹配規則:Host 支持 `%`、`_` 通配符、CIDR (如 `192.168.1.0/255.255.255.0`);User 為空匹配匿名用戶。
  2. 請求驗證 (Stage 2):每條 SQL 執行前,按 `global → db → host → tables_priv → columns_priv` 疊加權限,任一層級擁有權限即通過(Union 語義)。

實戰授權範例

創建超級管理員 (僅本地)

GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'Str0ngP@ss' WITH GRANT OPTION;
FLUSH PRIVILEGES;

創建應用賬號 (特定子網、特定庫、最小權限)

CREATE USER 'app_user'@'192.168.10.%' IDENTIFIED BY 'AppP@ss2024';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `app_db`.* TO 'app_user'@'192.168.10.%';
-- 拒絕 DDL、GRANT、FILE 等高危權限
FLUSH PRIVILEGES;

直接操作授權表 (不推薦常規使用,適合批量腳本化)

INSERT INTO `user` (Host, User, authentication_string, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, Super_priv)
VALUES ('192.168.10.%', 'app_user', PASSWORD('AppP@ss2024'), 'Y','Y','Y','Y','N','N','N','N');
INSERT INTO `db` (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv)
VALUES ('192.168.10.%', 'app_db', 'app_user', 'Y','Y','Y','Y','N','N');
FLUSH PRIVILEGES;

撤銷與清理

REVOKE ALL PRIVILEGES ON `app_db`.* FROM 'app_user'@'192.168.10.%';
DELETE FROM `user` WHERE User='app_user' AND Host='192.168.10.%';
FLUSH PRIVILEGES;

注意:`REVOKE` 不刪除用戶行,必須手工 `DELETE FROM user` 並 `FLUSH PRIVILEGES` 徹底清理。

編程層防 SQL 注入清單 (多語言通用)

語言/框架核心防禦 API關鍵原則
通用 Web—永不信任用戶輸入;數值型參數用預編譯/參數化;長度/格式/業務規則雙端校驗
PHPmysqli::prepare / PDO::prepare禁用 `mysql_*` 舊 API;`addslashes` 不可靠,必須用驅動層參數化
Java (JDBC)PreparedStatement拒絕 `Statement` 拼接;連接池啟用 `cachePreStmts=true`
.NET (ADO.NET)SqlCommand.Parameters嚴禁字符串拼接 SQL;`AddWithValue` 注意類型推斷陷阱
Perl (DBI)$dbh->prepare + execute(@params)使用 `quote()` 僅作為最後手段
Python (DB-API)cursor.execute(sql, params)參數佔位符 `%s` (PyMySQL) / `?` (sqlite3) / `%s` (psycopg2)

mysqld 安全啟動參數速查

參數作用建議場景
--skip-grant-tables跳過權限檢查,緊急重置 root 密碼僅維護窗口,臨時使用,用畢即移除
--skip-show-database非 SUPER 權限用戶不可 `SHOW DATABASES`生產環境強制開啟
--chroot=/path限制 `LOAD DATA INFILE`/`SELECT ... INTO OUTFILE` 路徑高安全合規環境,需確保 `/path/tmp` 可寫建立 socket
--log-slow-queries=/path/slow.log記錄超過 `long_query_time` 的 SQL生產常態開啟,配合 `pt-query-digest` 定期分析
--skip-networking禁用 TCP/IP,僅允許 Unix Socket 本地連接應用與數據庫同機、極高安全要求

遺忘 root 密碼緊急恢復流程

  1. 停止服務:`systemctl stop mysqld` / `service mysql stop`。
  2. 啟動跳過授權:`mysqld_safe --skip-grant-tables --skip-networking &`。
  3. 無密碼登入:`mysql -u root`。
  4. 修改密碼:FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStr0ngP@ss'; (5.7.6+) 或 UPDATE user SET authentication_string=PASSWORD('...') WHERE User='root'; FLUSH PRIVILEGES;。
  5. 正常重啟:`systemctl restart mysqld`,驗證新密碼。

總結

MySQL 權限模型雖顯老舊,但通過「最小權限原則 + 參數化編程 + 安全啟動參數 + 審計日誌」四層防線,可構建符合等保三級/PCI-DSS 要求的數據庫安全基線。建議將授權變更納入變更管理流程,定期 `pt-show-grants` 導出權限快照審計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved