SQL SERVER的安全問(wèn)題一直是困擾DBA的一個(gè)難題,作為開(kāi)發(fā)者和用戶(hù)希望自己的權限越大越好,最好是SA,而作為DBA希望所有的用戶(hù)權限越小越好,這總是一對矛盾。一般來(lái)說(shuō),我們會(huì )考慮采用WINDOWS驗證模式,建立安全的用戶(hù)權限,改變SQL SERVER TCP/IP的默認端口...等安全措施,但很多DBA還是忽略了MSSQL SERVER
服務(wù)的啟動(dòng)賬號,這也是一個(gè)非常值得重點(diǎn)關(guān)注的問(wèn)題。特別是MSSQL SERVER提供了許多操作系統和注冊表擴展存儲過(guò)程,比如:xp_cmdshell, xp_regdeletekey, xp_regdeletevalue 等等。
我們先來(lái)回顧一下MSSQL SERVER執行這些擴展存儲過(guò)程的步驟。MS SQL SERVER提供的擴展存儲過(guò)程使你可以向T-SQL一樣調用一些動(dòng)態(tài)鏈接庫的內部函數邏輯,而且這些擴展存儲過(guò)程可以包括WIN32和COM的大多數功能。
當關(guān)系
數據庫引擎確定 Transact-SQL 語(yǔ)句引用擴展存儲過(guò)程時(shí):
關(guān)系
數據庫引擎將擴展存儲過(guò)程請求傳遞到開(kāi)放式
數據服務(wù)層。
然后開(kāi)放式
數據服務(wù)將包含擴展存儲過(guò)程函數的 DLL 裝載到 SQL Server 2000 地址空間(如果還沒(méi)有裝載)。
開(kāi)放式
數據服務(wù)將請求傳遞到擴展存儲過(guò)程。
開(kāi)放式
數據服務(wù)將操作結果傳遞到
數據庫引擎。
[quote[從上圖中我們可以清楚的看到SQL Server 2000的
數據庫引擎通過(guò)擴展存儲過(guò)程和Windows Resources進(jìn)行交互。而擴展存儲過(guò)程可以完成處理操作系統任務(wù)的關(guān)鍵是要有一個(gè)自己的身份SID,這個(gè)SID就來(lái)自MSSQL SERVER
服務(wù)啟動(dòng)賬號。所以如果這個(gè)MSSQL SERVER
服務(wù)啟動(dòng)賬號是administrators組的用戶(hù),我們就可以通過(guò)這些擴展存儲過(guò)程做任意想做的事情:刪除系統信息,破壞注冊表等等。如果我們限制MSSQL SERVER
服務(wù)啟動(dòng)賬號的權限,這樣即使“
黑客”或懷有惡意的開(kāi)發(fā)人員獲得
數據庫的管理員權限,也不會(huì )對操作系統造成很大的影響。只要有
數據庫的備份我們可以非常方便的恢復
數據庫,而不要重新安裝系統。所以為了更安全的保護我們的系統,我們希望MSSQL SERVER
服務(wù)啟動(dòng)賬號的權限越低越好。
作為系統的一個(gè)
服務(wù),啟動(dòng)MSSQL SERVER 2000
服務(wù)的用戶(hù)賬號也需要一些必要的權限,下面我們就通過(guò)一個(gè)具體的實(shí)例來(lái)解釋這些權限(本實(shí)例只針對成員
服務(wù)器,如果是DC和啟動(dòng)了活動(dòng)目錄Active Directory還需要其它的配置):[/quote]1. 通過(guò)本地用戶(hù)管理,建立一個(gè)本地用戶(hù)sqlserver,密碼:123456;//最好換個(gè)難猜的用戶(hù)名并且設強密碼...不要純數字,易被嗅探及破解.
2. 如果現在就我們打開(kāi)SERVICES配置通過(guò)該用戶(hù)啟動(dòng),系統會(huì )報錯誤:
Source:Service Control Manager
Event ID:7000
Description:
The %service% service failed to start due to the following error:
The service did not start due to a logon failure.
No Data will be available.
這是因為作為一個(gè)普通用戶(hù)是無(wú)法啟動(dòng)
服務(wù)的,我們需要給sqlserver用戶(hù)分配必要的權限。
SQL Server
服務(wù)啟動(dòng)賬號必須有3個(gè)基本權限:
數據庫本地目錄的讀寫(xiě)權限;
啟動(dòng)本地
服務(wù)的權限;
讀取注冊表的權限;3. 賦予sqlserver用戶(hù)MSSQL目錄的讀寫(xiě)權限;
因為我的SQL SERVER是安裝在D盤(pán),所以我在權限管理中,將D:\PROGRMAM FILE\Microsoft SQL Server\MSSQL讀寫(xiě)權限賦予sqlserver用戶(hù)。//最好不要裝在系統盤(pán)
4. 分配sqlserver用戶(hù)啟動(dòng)本地
服務(wù)的權限;
這個(gè)比較復雜,我只舉例作為成員
服務(wù)器的情況。 l 啟動(dòng)“Local Security Setting” MMC 管理單元。 //控制面板------>管理工具---->本地安全策略
l 展開(kāi)Local Policy,然后單擊User Rights Assignment。 //本地策略-------->用戶(hù)權限指派
l 在右側窗格中,右鍵單擊Log on as Service,將用戶(hù)添加到該策略,然后單擊OK。 //作為
服務(wù)登陸
l 在右側窗格中,右鍵單擊Log on as a batch job,將用戶(hù)添加到該策略,然后單擊OK //作為批處理作業(yè)登陸
l 在右側窗格中,右鍵單擊Locks pages in memory,將用戶(hù)添加到該策略,然后單擊OK //內存中鎖定頁(yè)
l 在右側窗格中,右鍵單擊Act as part of the operating systme,將用戶(hù)添加到該策略,然后單擊OK //以操作系統方式操作
l 在右側窗格中,右鍵單擊Bypass traverse checking,將用戶(hù)添加到該策略,然后單擊OK //跳過(guò)遍歷檢查
l 在右側窗格中,右鍵單擊Replace a process level token,將用戶(hù)添加到該策略,然后單擊OK //替換進(jìn)程級記號
l 關(guān)閉“Local Security Setting” MMC 管理單元。 如圖
5. 重新啟動(dòng)系統,用sqlserver用戶(hù)登陸系統;
6. 再重新啟動(dòng)系統,再用administrator用戶(hù)登陸,打開(kāi)SERVICES管理工具,配置用該用戶(hù)啟動(dòng)MSSQLSERVER
服務(wù);
這樣我們就可以通過(guò)限制SQLSERVER用戶(hù)的權限來(lái)控制SQLSERVER擴展存儲過(guò)程的權限?,F在sqlserver用戶(hù)只對D:\PROGRMAM FILE\Microsoft SQL Server\MSSQL目錄有寫(xiě)的權限,這樣就降低了通過(guò)xp_cmdshell來(lái)刪除系統文件的風(fēng)險。
通過(guò)收購(原文就是"收購",不太理解,個(gè)人認為是"注冊表")來(lái)配置是比較繁瑣的,幸運的是MS SQLSERVER已經(jīng)提供了這樣的工具來(lái)配置啟動(dòng)啟動(dòng)賬號,你可以通過(guò)SQLSERVER的企業(yè)管理器配置,入下圖:
PS:注意,我是在win2003下面,在上面的圖我直接輸入新建的用戶(hù)sqlserver,最后會(huì )啟動(dòng)不了.只有在這里的用戶(hù)寫(xiě)機器名\用戶(hù)名,如win2003\sqlserver,這樣才可以正常啟動(dòng),你們也可以試試看是否和我一樣.
這樣SQL SERVER企業(yè)管理器會(huì )
自動(dòng)幫你配置好所有的必要條件。包括目錄的訪(fǎng)問(wèn)權限,啟動(dòng)
服務(wù)的權限,訪(fǎng)問(wèn)注冊表的權限等等。所以我們正確的配置順序是:
1. 建立用戶(hù);
2. 在SQL SERVER企業(yè)管理器中配置該用戶(hù)啟動(dòng);
3. 在分配其它相應的權限(如果需要復制操作);
備注:
通過(guò)SQL Server企業(yè)管理器增加的
服務(wù)啟動(dòng)賬號,會(huì )在registry中增加很多信息,即使你更換用戶(hù)也不會(huì )刪除,所以在改變
服務(wù)啟動(dòng)賬號不要頻繁更換,這樣會(huì )增大registry的容量。同時(shí)要注意,只有屬于sysadmin角色的用戶(hù)才可以配置SQL Server
服務(wù)的啟動(dòng)賬號。
總結:
構建一個(gè)安全高效的SQLSERVER是多方面的,深入了解SQLSERVER的運行機制是基礎。我們不但要考慮
數據庫用戶(hù)的安全,也要考慮SQLSERVER
服務(wù)的安全性。
tip:
請確認 SQL Server 實(shí)例配置為使用 Windows 身份認證和 SQL Server 身份認證。為此,請確認在正在運行 SQL Server 的計算機上存在下列注冊表項。對于默認的 SQL Server 實(shí)例:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\LoginMode
對于 SQL Server 的命名實(shí)例:
HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\\MSSQLServer\LoginMode
請確認已設置下列注冊表項的值:
身份認證類(lèi)型 值
僅限于 Windows 身份認證 1
混合模式(SQL Server 身份認證和 Windows 身份認證) 2
注意:如果您對注冊表進(jìn)行了任何更改,必須關(guān)閉并重新啟動(dòng) SQL Server 實(shí)例使更改生效。