二、Web環境中的驗證
即使最好的安全策略也常常在一種情形前屈服,這種情形就是在Web應用中使用SQL Server的數據。在這種情形下,進行驗證的典型方法是把一組SQL Server登錄名稱和密碼嵌入到Web服務器上運行的程序,比如ASP頁面或者CGI腳本;然後,由Web服務器負責驗證用戶,應用程序則使用它自己的登錄帳戶(或者是系統管理員sa帳戶,或者為了方便起見,使用Sysadmin服務器角色中的登錄帳戶)為用戶訪問數據。
這種安排有幾個缺點,其中最重要的包括:它不具備對用戶在服務器上的活動進行審核的能力,完全依賴於Web應用程序實現用戶驗證,當SQL Server需要限定用戶權限時不同的用戶之間不易區別。如果你使用的是IIS 5.0或者IIS 4.0,你可以用四種方法驗證用戶。第一種方法是為每一個網站和每一個虛擬目錄創建一個匿名用戶的NT帳戶。此後,所有應用程序登錄SQL Server時都使用該安全環境。我們可以通過授予NT匿名帳戶合適的權限,改進審核和驗證功能。
第二種方法是讓所有網站使用Basic驗證。此時,只有當用戶在對話框中輸入了合法的帳戶和密碼,IIS才會允許他們訪問頁面。IIS依靠一個NT安全數據庫實現登錄身份驗證,NT安全數據庫既可以在本地服務器上,也可以在域控制器上。當用戶運行一個訪問SQL Server數據庫的程序或者腳本時,IIS把用戶為了浏覽頁面而提供的身份信息發送給服務器。如果你使用這種方法,應該記住:在通常情況下,浏覽器與服務器之間的密碼傳送一般是不加密的,對於那些使用Basic驗證而安全又很重要的網站,你必須實現SSL(Secure Sockets Layer,安全套接字層)。
在客戶端只使用IE 5.0、IE 4.0、IE 3.0浏覽器的情況下,你可以使用第三種驗證方法。你可以在Web網站上和虛擬目錄上都啟用NT驗證。IE會把用戶登錄計算機的身份信息發送給IIS,當該用戶試圖登錄SQL Server時IIS就使用這些登錄信息。使用這種簡化的方法時,我們可以在一個遠程網站的域上對用戶身份進行驗證(該遠程網站登錄到一個與運行著Web 服務器的域有著信任關系的域)。
最後,如果用戶都有個人數字證書,你可以把那些證書映射到本地域的NT帳戶上。個人數字證書與服務器數字證書以同樣的技術為基礎,它證明用戶身份標識的合法性,所以可以取代NT的Challenge/Response(質詢/回應)驗證算法。Netscape和IE都自動在每一個頁面請求中把證書信息發送給IIS。IIS提供了一個讓管理員把證書映射到NT帳戶的工具。因此,我們可以用數字證書取代通常的提供帳戶名字和密碼的登錄過程。
由此可見,通過NT帳戶驗證用戶時我們可以使用多種實現方法。即使當用戶通過IIS跨越Internet連接SQL Server時,選擇仍舊存在。因此,你應該把NT驗證作為首選的用戶身份驗證辦法。
三、設置全局組
構造安全策略的下一個步驟是確定用戶應該屬於什麼組。通常,每一個組織或應用程序的用戶都可以按照他們對數據的特定訪問要求分成許多類別。例如,會計應用軟件的用戶一般包括:數據輸入操作員,數據輸入管理員,報表編寫員,會計師,審計員,財務經理等。每一組用戶都有不同的數據庫訪問要求。
控制數據訪問權限最簡單的方法是,對於每一組用戶,分別地為它創建一個滿足該組用戶權限要求的、域內全局有效的組。我們既可以為每一個應用分別創建組,也可以創建適用於整個企業的、涵蓋廣泛用戶類別的組。然而,如果你想要能夠精確地了解組成員可以做些什麼,為每一個應用程序分別創建組是一種較好的選擇。例如,在前面的會計系統中,我們應該創建Data Entry Operators、Accounting Data Entry Managers等組。請記住,為了簡化管理,最好為組取一個能夠明確表示出作用的名字。
除了面向特定應用程序的組之外,我們還需要幾個基本組。基本組的成員負責管理服務器。按照習慣,我們可以創建下面這些基本組:SQL Server Administrators,SQL Server Users,SQL Server DenIEd Users,SQL Server DB Creators,SQL Server Security Operators,SQL Server Database Security Operators,SQL Server Developers,以及 DB_Name Users(其中DB_Name是服務器上一個數據庫的名字)。當然,如果必要的話,你還可以創建其他組。
創建了全局組之後,接下來我們可以授予它們訪問SQL Server的權限。首先為SQL Server Users創建一個NT驗證的登錄並授予它登錄權限,把Master數據庫設置為它的默認數據庫,但不要授予它訪問任何其他數據庫的權限,也不要把這個登錄帳戶設置為任何服務器角色的成員。接著再為SQL Server DenIEd Users重復這個過程,但這次要拒絕登錄訪問。在SQL Server中,拒絕權限始終優先。創建了這兩個組之後,我們就有了一種允許或拒絕用戶訪問服務器的便捷方法。
為那些沒有直接在Sysxlogins系統表裡面登記的組授權時,我們不能使用 Enterpris Managr,因為Enter-prise 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_security-admin,把SQL Server Developers加入到db_owner角色。
注意我們仍然沒有授權任何組或帳戶訪問數據庫。事實上,我們不能通過 Enterprise Manager授權數據庫訪問,因為Enterprise Manager的用戶界面只允許我們把數據庫訪問權限授予合法的登錄帳戶。SQL Server不要求NT帳戶在我們把它設置為數據庫角色的成員或分配對象權限之前能夠訪問數據庫,但Enter-prise Manager有這種限制。盡管如此,只要我們使用的是sp_addrolemember存儲過程而不是Enterprise Manager,就可以在不授予域內NT帳戶數據庫訪問權限的情況下為任意NT帳戶分配權限。
到這裡為止,對Model數據庫的設置已經完成。但是,如果你的用戶群體對企業范圍內各個應用數據庫有著類似的訪問要求,你可以把下面這些操作移到Model數據庫上進行,而不是在面向特定應用的數據庫上進行。