如何根據 SQL Server 中對象的元數據授予或拒絕對對象的訪問權限?
我們正在審查 Windows Active Directory 域中 SQL Server 上各種應用程序和業務組的數據庫權限。
我們目前不使用單獨的模式進行訪問控制,權限是通過角色和視窗組在數據庫級別分配的。我們有訪問數據庫的 Web 應用程序,以及直接訪問數據庫的內部使用者。一切都至少在 SQL Server 2017 Enterprise 上執行。使用模式可能是未來的做法,但應該超出此問題的建議範圍。
為了開始這個過程,我們根據幾個參數對所有數據庫表進行分類。例如它包含的數據類型以及它在我們的應用程序中的使用。這些屬性被映射到使用者角色。我們使用擴展屬性使用這些額外的元數據“標記”數據庫,以便我們可以審計我們的系統。因此,例如,我們可以將表標記為包含 PHI,並用於 SYSTEM 或 REPORTING。最後,“Group1”可能無法訪問任何帶有 PHI 的表。或者,“Group2”可能只有 SELECT 訪問 SYSTEM 表。
現在,我們想實現一種基於此元數據以程式方式授予和限制對這些表的訪問權限的方法。這樣,當開發人員添加新表時,他們可以設置適當的元數據,並且將應用更精細的權限,而無需深入了解業務和管理團隊定義的我們的角色/組/權限。
現在,我知道還有其他方法可以完成這樣的事情。但是,根據開發需求和資源,這是目前對我們最有意義的一種方法。即開發團隊盡可能少地進行應用程序返工,從而實現最佳安全價值。
- 您能否提供有關如何執行此操作的任何指導?
- SQL Server 中的任何功能可能允許我們以本機方式執行此操作?
- 或者,我唯一的選擇是定期執行讀取元數據和更新權限的作業嗎?
- 你預見到這種方法有什麼問題嗎?
定期執行讀取元數據和更新權限的作業是我唯一的選擇嗎?
您也可以使用Row Level Security在執行時動態地強制執行安全謂詞。但這具有額外的複雜性和執行時成本。
你預見到這種方法有什麼問題嗎?
對於這些角色,您不應混合手動更改權限和基於元數據生成的權限。
你沒有提到你用什麼來管理你的數據庫項目原始碼控制,但我假設是 Visual Studio。
如果你是,那麼我會主張在那裡定義數據庫角色(不是成員,這會變得混亂)而是角色本身。然後在每個對象(表、過程、視圖等)上,為角色應具有的權限添加命令。選擇、更新等
在部署期間(再次假設您從 Visual Studio 發布),引擎會將您分配的權限與數據庫中的內容進行比較,並生成命令以使目標合規。
然後 DBA 將 windows 使用者/組或 SQL 登錄映射到數據庫角色成員資格。
您不會詳細介紹,但即使是少量的組來映射所有可能的類型也可以。
角色範例:
- 系統
- SYSTEM_PHI
- 報告
- 報告_PHI
然後將 SYSTEM_PHI 添加為 SYSTEM 的成員等。
然後在 SYSTEM_PHI 應該使用的表上只添加該角色的成員應該能夠執行的權限。
它不像映射那麼簡單,如果你有大量的類別,這可能是不切實際的,但將它整合到原始碼控制中至少具有不必為你做一些事情的好處,它就像“原生”一樣你會得到。
好處:
- 模式比較以查看偏差。
- 部署的更正。
- 本國的
- 源控制跟踪