為什麼資料庫權限管理至關重要?
SQL 並非單一語言,而是由五大子集組成的語法體系。錯誤的權限配置是 SQL Injection 攻擊得逞的主因。掌握子集分類,才能精準落實最低權限原則。
SQL 五大子集與職責切分
SQL 子集分類法將語法依功能拆分為五類:DDL(CREATE、ALTER、DROP,定義結構)、DML(INSERT、UPDATE、DELETE,操作資料)、DQL(SELECT,查詢資料)、DCL(GRANT、REVOKE,存取控制)、TCL(COMMIT、ROLLBACK,交易控制)。資安核心在於職責隔離:應用程式帳號僅持有 DML/DQL 權限,DDL 與 DCL 應由專屬 DBA 帳號管理。攻擊者即便注入惡意 SQL,也無法執行 DROP TABLE 或竄改權限設定,大幅縮小攻擊面。
最低權限原則實作
以 PostgreSQL 為例,建立應用程式帳號時僅授予目標 Schema 的 DML/DQL 權限。DDL 操作保留給 Migration 專用帳號,並在 CI/CD 流程結束後立即撤銷連線。DCL 操作(GRANT/REVOKE)僅由超級使用者執行,且須留下完整 Audit Log。這三層帳號切分能有效防範橫向移動攻擊。
-- 應用程式帳號:僅 DML / DQL
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO app_user;
-- Migration 帳號:僅 DDL,用後撤銷
GRANT CREATE ON SCHEMA app TO migration_user;
REVOKE CREATE ON SCHEMA app FROM migration_user; -- 執行完畢後立即撤銷
💡 重點整理
- 子集分類:DDL 定結構、DML 操作資料、DQL 查詢、DCL 控權限、TCL 管交易。
- 帳號隔離:應用程式帳號絕對不持有 DDL/DCL 權限。
- 即時撤銷:Migration 帳號於 CI/CD 完成後立刻收回 DDL 授權。
- Audit Log:所有 DCL 操作須強制記錄,供事後稽核追蹤。
SQL 子集分類法是資料庫資安的基礎框架。正確切分帳號職責,能讓 SQL Injection 的危害降至最低,是每位後端工程師必備的防禦思維。
📚 參考文獻
- PostgreSQL 官方文件 — GRANT 指令與權限管理
- OWASP — SQL Injection Prevention Cheat Sheet
- Microsoft Learn — SQL Server 資料庫層級角色與最低權限設計
⚠️ 本文內容基於撰寫時的最新資訊,實際應用時請參考官方文件的最新版本。
留言
張貼留言