2009-09-08 48 views
30

我在網上搜索了一下,找不到任何真正確定位置或覆蓋基礎如何關於在數據庫上設置用戶/角色的基礎知識。SQL Server上用戶/角色對於Web應用程序的最佳實踐

基本上,將會有一個用戶將被用來從應用程序(在這種情況下是web應用程序)訪問數據庫,這將需要訪問常規數據庫操作(選擇,插入,更新,刪除)的數據庫和執行存儲過程(使用exec在其他存儲過程/ UDF中運行存儲過程)。

然後,我們也將有一個用戶,這將是主要管理員(這很簡單)。

我目前有一個開發環境,在我看來,應用程序使用具有db_owner角色的用戶,儘管它是Intranet應用程序,但我們並沒有真正管理安全性。儘管它是一個Intranet應用程序,但我們仍然有安全考慮,並希望看到開發人員爲這種類型的環境設置用戶/角色的方式。

編輯:Web應用程序和SQL Server駐留在單獨的機器上。

編輯:忘了提及一個ORM被用來需要直接讀/寫訪問。

問: 什麼是關於建立應用程序訪問用戶的「最佳做法」?什麼樣的角色將適用於什麼樣的漁獲物?

+0

Web應用程序是否扮演呼叫者? – 2009-09-08 17:43:08

+0

不是爲了訪問SQL Server(我們確實爲Reporting Services單獨使用它)。 忘了提及我們的網絡應用程序是在它自己的專用盒子上,數據庫也在一個單獨的專用盒子上。 – Manuel 2009-09-08 17:46:06

+1

坦率地說,如果你的ORM需要直接讀/寫,那麼是時候切換到理解存儲過程的ORM了。 – blowdart 2009-09-08 22:25:40

回答

36

首先,我傾向於將權限封裝在數據庫角色中,而不是將它們附加到單個用戶主體。這裏的大贏家是角色是你數據庫的一部分,所以你可以完全腳本安全,然後告訴部署類型「添加一個用戶並將他添加到這個角色」,他們並不反對SQL的權限boogeymen。此外,這可以讓事情保持足夠的清潔,以至於可以避免在db_owner模式下進行開發,並且對自己感覺更好 - 以及像玩遊戲一樣的練習,並且通常可以避免任何問題。

就應用該角色的權限而言,我傾向於最近將網絡投入更廣泛,尤其是在使用ORM並通過應用程序處理安全性的情況下。在T-SQL術語,它看起來像這樣:

GRANT SELECT, UPDATE, INSERT, DELETE, EXECUTE on SCHEMA::DBO to [My DB Role] 

這初看起來似乎有點嚇人,但它確實是不 - 這種作用不能做得比操縱數據的任何其他。無法訪問擴展的特效或系統特效或授予用戶訪問權限等。另一大優勢是更改模式(如添加表或過程)只要保留在該模式中就不需要進一步的安全性工作。

SQL 2005+要考慮的另一件事是使用數據庫模式來保護對象組。現在,這裏最大的竅門是許多ORM和遷移工具不喜歡它們,但是如果您將默認架構[dbo]呈現給應用程序,則可以使用替代架構來實現特殊的安全措施。例如 - 爲應由管理員手動運行的特殊的,殘酷的數據庫清理過程創建一個ADMIN模式。甚至還有一個獨立的模式,用於需要更多粒度數據庫權限的特殊高度安全的應用程序部分。

就用戶而言,即使沒有域,您可以使用Windows身份驗證(使用Sql Server術語集成身份驗證)進行配線。只需在兩個盒子上使用相同的憑據(用戶/傳遞組合)。設置一個應用程序域以在網絡框中以該用戶的身份運行,並在sql框中設置由該主體支持的Sql Server用戶並獲利。也就是說,使用數據庫角色幾乎可以將你從這個決定中分離出來,因爲部署類型應該能夠根據需要處理創建sql用戶和修改連接字符串。

+0

我正在傾向於這種方法,因爲使用設置這些權限所需的表的數量會更清晰。我只是想知道妥協是否值得(這是在一個內部網中,所以我們的風險比網絡環境要低一些)。 – Manuel 2009-09-08 22:39:59

+3

我真的不會稱之爲妥協 - ORM的角度應該大體上防止SQL注入攻擊,因爲在數據庫中沒有任何真正的「鬆散」字符串。真的,這裏最大的攻擊矢量是任何調用sp_execute_sql的存儲過程。此外,依靠專門的數據庫權限,應用層安全性對於構建和測試來說都變得更加容易,這是對過去時代的保留,在這種情況下保護堆棧的高層部分要困難得多。 – 2009-09-08 23:59:59

+0

我正在採用這種方法,因爲它與正在進行的開發(Remus'是非常相似的方法,但使用單獨的模式需要將所有對象移動到新的模式......對於新的開發很有用,雖然)。 – Manuel 2009-09-09 14:13:50

6

創建Web應用程序使用的用戶'webuser'。

只授予存儲過程執行權限給這個用戶。不允許直接表讀/寫。如果您需要從表中讀取某些內容,請編寫一個proc。如果你需要寫數據,寫另一個過程。

這樣一切都保持良好和簡單。一個應用用戶,只有相關的權限。如果安全性受到影響,那麼所有入侵者都可以運行procs。

+0

這有一個問題(在原始問題中忘記了一些相關信息)。我們使用一個爲我們生成類的ORM,因此不能僅限於存儲過程來讀/寫數據。 – Manuel 2009-09-08 22:01:59

+8

sooo 2001。 。 。 。 – 2009-09-08 22:13:07

+1

@曼努埃爾:好的,改變了一切 - 但如果你刪除了ORM限制(現在是這樣),那麼我仍然會推薦用戶方法而不是角色/模式權限。 – 2009-09-09 08:28:20

13

很長一段時間,SQL Server應用程序訪問數據庫的指導原則是將數據訪問隔離爲存儲過程,將過程分組爲模式並將模式上的執行授予應用程序使用的主體。所有權鏈接將保證數據訪問程序調用者。訪問可以通過檢查存儲過程來檢查。這是一個簡單的模型,易於理解,設計,部署和管理。存儲過程的使用可以利用代碼簽名,最細粒度和功能強大的訪問控制方法,也是唯一一個明顯篡改的方法(簽名在程序改變時會丟失)。

問題是,來自Visual Studio設計人員的每一點技術都會在這個建議面前飛來飛去。開發人員將看到只使用存儲過程難以使用的模型。開發人員喜歡先設計他們的類模型,並從邏輯模型中生成表結構。基於程序的指導方針使程序首先在應用程序的第一行寫入之前存在,並且由於現代開發的迭代方式,這在開發中實際上是有問題的。這不是無法解決的,只要團隊領導層意識到問題並解決問題(即,準備好的程序,即使是在開發週期開始時爲嘲笑)。

+0

+1:很好的答案。在設計安全數據庫時突出一些非常相關的問題/注意事項。 – 2009-09-08 20:41:47

+0

我忘了對我們使用的ORM,基本上需要對數據庫的直接讀/寫訪問的一些信息。對於這樣的事情,會增加對讀寫是適當的方式角色? – Manuel 2009-09-08 22:07:01

+0

從安全角度來看:沒有。要保護從被攻破的網頁服務器(縱深防禦)被任意更新的數據。實際上,沒有可行的替代方案。至少只對所需的表進行*訪問*,不*將Web服務器主體添加到db_datareader/db_datawriter角色。 – 2009-09-08 22:17:13

相關問題