跳轉到

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