在改進SQL Server
系列所實現的安全機制的過程中
Microsoft建立了一種既靈活又強大的安全管理機制
它能夠對用戶訪問SQL Server服務器系統和數據庫的安全進行全面地管理
按照本文介紹的步驟
你可以為SQL Server
(或
)構造出一個靈活的
可管理的安全策略
而且它的安全性經得起考驗
一驗證方法選擇
本文對驗證(authentication)和授權(authorization)這兩個概念作不同的解釋驗證是指檢驗用戶的身份標識授權是指允許用戶做些什麼在本文的討論中驗證過程在用戶登錄SQL Server的時候出現授權過程在用戶試圖訪問數據或執行命令的時候出現
構造安全策略的第一個步驟是確定SQL Server用哪種方式驗證用戶SQL Server的驗證是把一組帳戶密碼與Master數據庫Sysxlogins表中的一個清單進行匹配Windows NT/的驗證是請求域控制器檢查用戶身份的合法性
一般地如果服務器可以訪問域控制器我們應該使用Windows NT/驗證域控制器可以是WinK服務器也可以是NT服務器無論在哪種情況下SQL Server都接收到一個訪問標記(Access Token)訪問標記是在驗證過程中構造出來的一個特殊列表其中包含了用戶的SID(安全標識號)以及一系列用戶所在組的SID正如本文後面所介紹的SQL Server以這些SID為基礎授予訪問權限注意操作系統如何構造訪問標記並不重要SQL Server只使用訪問標記中的SID也就是說不論你使用SQL Server SQL Server WinK還是NT進行驗證都無關緊要結果都一樣
如果使用SQL Server驗證的登錄它最大的好處是很容易通過Enterprise Manager實現最大的缺點在於SQL Server驗證的登錄只對特定的服務器有效也就是說在一個多服務器的環境中管理比較困難使用SQL Server進行驗證的第二個重要的缺點是對於每一個數據庫我們必須分別地為它管理權限如果某個用戶對兩個數據庫有相同的權限要求我們必須手工設置兩個數據庫的權限或者編寫腳本設置權限如果用戶數量較少比如個以下而且這些用戶的權限變化不是很頻繁SQL Server驗證的登錄或許適用但是在幾乎所有的其他情況下(有一些例外情況例如直接管理安全問題的應用)這種登錄方式的管理負擔將超過它的優點
二Web環境中的驗證
即使最好的安全策略也常常在一種情形前屈服這種情形就是在Web應用中使用SQL Server的數據在這種情形下進行驗證的典型方法是把一組SQL Server登錄名稱和密碼嵌入到Web服務器上運行的程序比如ASP頁面或者CGI腳本然後由Web服務器負責驗證用戶應用程序則使用它自己的登錄帳戶(或者是系統管理員sa帳戶或者為了方便起見使用Sysadmin服務器角色中的登錄帳戶)為用戶訪問數據
這種安排有幾個缺點其中最重要的包括它不具備對用戶在服務器上的活動進行審核的能力完全依賴於Web應用程序實現用戶驗證當SQL Server需要限定用戶權限時不同的用戶之間不易區別如果你使用的是IIS 或者IIS 你可以用四種方法驗證用戶
第一種方法是為每一個網站和每一個虛擬目錄創建一個匿名用戶的NT帳戶此後所有應用程序登錄SQL Server時都使用該安全環境我們可以通過授予NT匿名帳戶合適的權限改進審核和驗證功能
第二種方法是讓所有網站使用Basic驗證此時只有當用戶在對話框中輸入了合法的帳戶和密碼IIS才會允許他們訪問頁面IIS依靠一個NT安全數據庫實現登錄身份驗證NT安全數據庫既可以在本地服務器上也可以在域控制器上當用戶運行一個訪問SQL Server數據庫的程序或者腳本時IIS把用戶為了浏覽頁面而提供的身份信息發送給服務器如果你使用這種方法應該記住在通常情況下浏覽器與服務器之間的密碼傳送一般是不加密的對於那些使用Basic驗證而安全又很重要的網站你必須實現SSL(Secure Sockets Layer安全套接字層)
在客戶端只使用IE IE IE 浏覽器的情況下你可以使用第三種驗證方法你可以在Web網站上和虛擬目錄上都啟用NT驗證IE會把用戶登錄計算機的身份信息發送給IIS當該用戶試圖登錄SQL Server時IIS就使用這些登錄信息使用這種簡化的方法時我們可以在一個遠程網站的域上對用戶身份進行驗證(該遠程網站登錄到一個與運行著Web服務器的域有著信任關系的域)
最後如果用戶都有個人數字證書你可以把那些證書映射到本地域的NT帳戶上個人數字證書與服務器數字證書以同樣的技術為基礎它證明用戶身份標識的合法性所以可以取代NT的Challenge/Response(質詢/回應)驗證算法Netscape和IE都自動在每一個頁面請求中把證書信息發送給IISIIS提供了一個讓管理員把證書映射到NT帳戶的工具因此我們可以用數字證書取代通常的提供帳戶名字和密碼的登錄過程
由此可見通過NT帳戶驗證用戶時我們可以使用多種實現方法即使當用戶通過IIS跨越Internet連接SQL Server時選擇仍舊存在因此你應該把NT驗證作為首選的用戶身份驗證辦法
三設置全局組
構造安全策略的下一個步驟是確定用戶應該屬於什麼組通常每一個組織或應用程序的用戶都可以按照他們對數據的特定訪問要求分成許多類別例如會計應用軟件的用戶一般包括數據輸入操作員數據輸入管理員報表編寫員會計師審計員財務經理等每一組用戶都有不同的數據庫訪問要求
控制數據訪問權限最簡單的方法是對於每一組用戶分別地為它創建一個滿足該組用戶權限要求的域內全局有效的組我們既可以為每一個應用分別創建組也可以創建適用於整個企業的涵蓋廣泛用戶類別的組然而如果你想要能夠精確地了解組成員可以做些什麼為每一個應用程序分別創建組是一種較好的選擇例如在前面的會計系統中我們應該創建Data Entry OperatorsAccounting Data Entry Managers等組請記住為了簡化管理最好為組取一個能夠明確表示出作用的名字
除了面向特定應用程序的組之外我們還需要幾個基本組基本組的成員負責管理服務器按照習慣我們可以創建下面這些基本組SQL Server AdministratorsSQL Server UsersSQL Server Denied UsersSQL Server DB CreatorsSQL Server Security OperatorsSQL Server Database Security OperatorsSQL Server Developers以及 DB_Name Users(其中DB_Name是服務器上一個數據庫的名字)當然如果必要的話你還可以創建其他組
創建了全局組之後接下來我們可以授予它們訪問SQL Server的權限首先為SQL Server Users創建一個NT驗證的登錄並授予它登錄權限把Master數據庫設置為它的默認數據庫但不要授予它訪問任何其他數據庫的權限也不要把這個登錄帳戶設置為任何服務器角色的成員接著再為SQL Server Denied Users重復這個過程但這次要拒絕登錄訪問在SQL Server中拒絕權限始終優先創建了這兩個組之後我們就有了一種允許或拒絕用戶訪問服務器的便捷方法
為那些沒有直接在Sysxlogins系統表裡面登記的組授權時我們不能使用Enterpris Managr因為Enterprise Manager只允許我們從現有登錄名字的列表選擇而不是域內所有組的列表要訪問所有的組請打開Query Analyzer然後用系統存儲過程sp_addsrvrolemember以及sp_addrolemember進行授權
對於操作服務器的各個組我們可以用sp_addsrvrolemember存儲過程把各個登錄加入到合適的服務器角色SQL Server Administrators成為Sysadmins角色的成員SQL Server DB Creators成為Dbcreator角色的成員SQL Server Security Operators成為Securityadmin角色的成員注意sp_addsrvrolemember存儲過程的第一個參數要求是帳戶的完整路徑例如BigCo域的JoeS應該是bigco\joes(如果你想用本地帳戶則路徑應該是server_name\joes)
要創建在所有新數據庫中都存在的用戶你可以修改Model數據庫為了簡化工作SQL Server自動把所有對Model數據庫的改動復制到新的數據庫只要正確運用Model數據庫我們無需定制每一個新創建的數據庫另外我們可以用sp_addrolemember存儲過程把SQL Server Security Operators加入到db_securityadmin把SQL Server Developers加入到db_owner角色
注意我們仍然沒有授權任何組或帳戶訪問數據庫事實上我們不能通過Enterprise Manager授權數據庫訪問因為Enterprise Manager的用戶界面只允許我們把數據庫訪問權限授予合法的登錄帳戶SQL Server不要求NT帳戶在我們把它設置為數據庫角色的成員或分配對象權限之前能夠訪問數據庫但Enterprise Manager有這種限制盡管如此只要我們使用的是sp_addrolemember存儲過程而不是Enterprise Manager就可以在不授予域內NT帳戶數據庫訪問權限的情況下為任意NT帳戶分配權限
到這裡為止對Model數據庫的設置已經完成但是如果你的用戶群體對企業范圍內各個應用數據庫有著類似的訪問要求你可以把下面這些操作移到Model數據庫上進行而不是在面向特定應用的數據庫上進行
四允許數據庫訪問
在數據庫內部與迄今為止我們對登錄驗證的處理方式不同我們可以把權限分配給角色而不是直接把它們分配給全局組這種能力使得我們能夠輕松地在安全策略中使用SQL Server驗證的登錄即使你從來沒有想要使用SQL Server登錄帳戶本文仍舊建議分配權限給角色因為這樣你能夠為未來可能出現的變化做好准備
創建了數據庫之後我們可以用sp_grantdbaccess存儲過程授權DB_Name Users組訪問它但應該注意的是與sp_grantdbaccess對應的sp_denydbaccess存儲過程並不存在也就是說你不能按照拒絕對服務器訪問的方法拒絕對數據庫的訪問如果要拒絕數據庫訪問我們可以創建另外一個名為DB_Name Denied Users的全局組授權它訪問數據庫然後把它設置為db_denydatareader以及db_denydatawriter角色的成員注意SQL語句權限的分配這裡的角色只限制對對象的訪問但不限制對DDL(Data Definition Language數據定義語言)命令的訪問
正如對登錄過程的處理如果訪問標記中的任意SID已經在Sysusers系統表登記SQL將允許用戶訪問數據庫因此我們既可以通過用戶的個人NT帳戶SID授權用戶訪問數據庫也可以通過用戶所在的一個(或者多個)組的SID授權為了簡化管理我們可以創建一個名為DB_Name Users的擁有數據庫訪問權限的全局組同時不把訪問權授予所有其他的組這樣我們只需簡單地在一個全局組中添加或者刪除成員就可以增加或者減少數據庫用戶
五分配權限
實施安全策略的最後一個步驟是創建用戶定義的數據庫角色然後分配權限完成這個步驟最簡單的方法是創建一些名字與全局組名字配套的角色例如對於前面例子中的會計系統我們可以創建Accounting Data Entry OperatorsAccounting Data Entry Managers之類的角色由於會計數據庫中的角色與帳務處理任務有關你可能想要縮短這些角色的名字然而如果角色名字與全局組的名字配套你可以減少混亂能夠更方便地判斷出哪些組屬於特定的角色
創建好角色之後就可以分配權限在這個過程中我們只需用到標准的GRANTREVOKE和DENY命令但應該注意DENY權限這個權限優先於所有其他權限如果用戶是任意具有DENY權限的角色或者組的成員SQL Server將拒絕用戶訪問對象
接下來我們就可以加入所有SQL Server驗證的登錄用戶定義的數據庫角色可以包含SQL Server登錄以及NT全局組本地組個人帳戶這是它最寶貴的特點之一用戶定義的數據庫角色可以作為各種登錄的通用容器我們使用用戶定義角色而不是直接把權限分配給全局組的主要原因就在於此
由於內建的角色一般適用於整個數據庫而不是單獨的對象因此這裡建議你只使用兩個內建的數據庫角色即db_securityadmin和db_owner其他內建數據庫角色例如db_datareader它授予對數據庫裡面所有對象的SELECT權限雖然你可以用db_datareader角色授予SELECT權限然後有選擇地對個別用戶或組拒絕SELECT權限但使用這種方法時你可能忘記為某些用戶或者對象設置權限一種更簡單更直接而且不容易出現錯誤的方法是為這些特殊的用戶創建一個用戶定義的角色然後只把那些用戶訪問對象所需要的權限授予這個用戶定義的角色
六簡化安全管理
SQL Server驗證的登錄不僅能夠方便地實現而且與NT驗證的登錄相比它更容易編寫到應用程序裡但是如果用戶的數量超過或者服務器數量在一個以上或者每個用戶都可以訪問一個以上的數據庫或者數據庫有多個管理員SQL Server驗證的登錄不容易管理由於SQL Server沒有顯示用戶有效權限的工具要記憶每個用戶具有哪些權限以及他們為何要得到這些權限就更加困難即使對於一個數據庫管理員還要擔負其他責任的小型系統簡化安全策略也有助於減輕問題的復雜程度因此首選的方法應該是使用NT驗證的登錄然後通過一些精心選擇的全局組和數據庫角色管理數據庫訪問
下面是一些簡化安全策略的經驗規則
·用戶通過SQL Server Users組獲得服務器訪問通過DB_Name Users組獲得數據庫訪問
·用戶通過加入全局組獲得權限而全局組通過加入角色獲得權限角色直接擁有數據庫裡的權限
·需要多種權限的用戶通過加入多個全局組的方式獲得權限
只要規劃得恰當你能夠在域控制器上完成所有的訪問和權限維護工作使得服務器反映出你在域控制器上進行的各種設置調整雖然實際應用中情況可能有所變化但本文介紹的基本措施仍舊適用它們能夠幫助你構造出很容易管理的安全策略
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22495.html