Database Security
多層資料庫權限
一個好的資料庫,至少有這三種用戶: admin_user,normal_user ,readonly_user
admin_user
- 不等於 super_user
- 該資料庫的擁有者,擁有該資料庫的一切權限
- 是資料庫中一切物件的擁有者,例如:
- Tables
- Triggers
- Stored Procedures
- 除了要更動 database schema,或是增減資料庫物件,否則絕不使用
- 只能由最可信任的人持有
normal_user
- 給予 application server 使用
- 沒有建立/刪除資料庫物件的權限
- 沒有 truncate table 權限
- 只有 select / insert / update / delete 權限
- 只有執行 stored procedure 的權限
readonly_user
- 一般情況下,我們不應該輕易連上 production database 來除錯的。請把這看成緊急 / 最後的手 段
- 當你連續爆肝了 24 小時後,你會覺得 select 和 truncate table 看起來差不多的
- 別那麼自信拿 admin_user / normal_user 來除錯, 否則你犯錯時別怪老闆無情
Audit Table
對於敏感資料(例如銀行系統中的用戶結餘),我們會想記錄其所有的改動。
- 例子:我們想記錄 user_balances 的改動,我們便會建立 user_balances_audit 這個資料表
- 然後在 user_balances 建立 on insert, on update, on delete trigger,把改動自動抄到 user_balances_audit
如果不用 Audit table
如果不用 triggers ,而在 application tier 改動 user_balances 時,把改動抄送一份到 user_balances_audit
- 代表 normal_user 擁有對 user_balances_audit 的改動權限
- 邪惡的系統管理員便能用 normal_user 登入資料庫,刪掉在 audit table 的犯罪證據
- 當壞人攻陷 application server 得到 normal_user 帳戶後,壞人會直接改動 user_balances。這樣壞人的活動反而不會出現在 audit table