登錄架構角色使用者設置
環境:
- 視窗伺服器 2012
- SQL Server 2014 標準版
- 伺服器上的公共網站(站點 A)
- 伺服器上的私人網站(站點 B)
- 在工作站上執行的 Windows 應用
SQL Server 2014 Standard: 2 個數據庫 - DB-A 和 DB-B
類庫: 通過儲存過程處理所有數據的獲取/設置。數據在 DB-A 和 DB-B 上
站點 A: 面向公眾的電子商務 ASP.NET 網站 ( http://www.rackattack.com ) 使用類庫與 DB-A 和 DB-B 互動。包含對兩個數據庫的附加呼叫(通過儲存過程)
站點 B: 使用類庫與 DB-A 和 DB-B 互動的私有 ASP.NET 網站。包含對兩個數據庫的附加呼叫(通過儲存過程)
Windows 應用程序: 使用類庫與數據庫互動的內部應用程序。包含對兩個數據庫的附加呼叫(通過儲存過程)。
**問題:**如何設置伺服器登錄、數據庫模式、數據庫角色、數據庫使用者以符合我們環境的最佳實踐?
我的想法:
- 站點 A、站點 B、WinApp 的伺服器登錄
- ClassLib 的 DB 角色 - 為 Lib 呼叫儲存過程的權限
- 站點 A 的數據庫角色 - 在 DB-A 和 DB-B 上呼叫站點 A 的儲存過程的權限
- 站點 B 的數據庫角色 - 在 DB-A 和 DB-B 上呼叫站點 B 的儲存過程的權限
- WinApp 的 DB 角色 - 在 DB-A 和 DB-B 上呼叫 WinApp 的儲存過程的權限
- 站點 A 的數據庫使用者(ClassLib 和站點 A 的角色成員)
- 站點 B 的數據庫使用者(ClassLib 和站點 B 的角色成員)
- WinApp 的 DB 使用者(ClassLib 和 WinApp 的角色成員)
題:
- 這個設置有意義嗎?
- 我想要 ClassLib 和站點使用者的不同角色嗎?
- 我在哪裡添加權限來執行需要的 SP 列表,在角色中,還是我應該為此使用模式?如果是這樣,怎麼做?
**免責聲明:**我是開發人員,而不是數據庫管理員。我對這些概念有基本的了解,但請“像我 5 歲一樣解釋”。謝謝!
好的,所以我將在這裡放棄一般的最佳實踐,並就我將做什麼以及我過去看到的實施給你一些建議。我還將假設您有足夠的安全協議來保護您面向公眾的網站。
首先,如果您被黑客入侵,請願意失去公共數據庫中的所有內容(顯然要定期備份它,但如果它被刪除也不要感到驚訝)。
其次,需要隔離執行您網站的數據庫。您需要執行它的所有內容都必須是獨立的,並且通常不應通過庫直接連結到私有數據庫。如果私有數據庫中有公共網站需要的組件,那麼您有兩種選擇:
- 複製這些組件,以便它們存在於兩個數據庫中。(首選)
- 創建一個僅包含這些組件的“共享”數據庫。
隔離公共數據庫後,您可以立即降低需要緩解的風險。如果您需要來自公共數據庫的資訊,或者需要將資訊從您的私有數據庫中獲取到您的公共數據庫中,那麼您可以設置複製或其他類型的計劃來執行此任務。
如果您無法分離您的數據庫,那麼您將需要對授予您面向公眾的網站/數據庫的權限非常謹慎。準備好記錄很多!
如果您創建角色,則需要確保每個角色都具有完成分配給它的任務所需的最低權限。例如,您的在兩個站點之間共享的類庫,盡可能給它最少的權限,使其能夠執行。
為公共網站創建的任何使用者帳戶都應有權訪問公共數據庫,僅此而已。如果公共網站可以直接訪問您的私人數據庫,那麼即使這不是您的意圖,它也應該被視為公共網站。
同樣,您的 Windows 應用程序不應直接呼叫面向公眾的數據庫。這是為了減少攻擊的表面區域,並確保有人不會無意中做出讓您的公共網站癱瘓的事情(例如刪除所有內容)。
所以總結一下:
- 公共網站應該只連接到公共數據庫,而不是被認為是內部或私有的。
- 私人網站和應用程序不應連接到公共數據庫。
- 共享的組件/表應該存在於兩個數據庫中並在它們之間複製。
- 權限應該是完成他們正在執行的任務的絕對最低限度,僅此而已。
- 不要在您的公共網站中使用可以訪問和修改私人數據的程式碼組件。
- 準備好失去一切。
- 永遠不要給公共網站 SA 或同等網站。它需要做的一切都應該明確授予它。
如果您隔離您的公共數據庫,那麼為您的內部應用程序分配權限將變得微不足道且容易做到。