如何建立一個安全的MSSQL SERVER的啟動賬號?
2024-08-31 00:48:21
供稿:網友
 
中國最大的web開發資源網站及技術社區,
 
 
    sql server的安全問題一直是困擾dba的一個難題,作為開發者和用戶希望自己的權限越大越好,最好是sa,而作為dba希望所有的用戶權限越小越好,這總是一對矛盾。一般來說,我們會考慮采用windows驗證模式,建立安全的用戶權限,改變sql server tcp/ip的默認端口...等安全措施,但很多dba還是忽略了mssql server服務的啟動賬號,這也是一個非常值得重點關注的問題。特別是mssql server提供了許多操作系統和注冊表擴展存儲過程,比如:xp_cmdshell, xp_regdeletekey, xp_regdeletevalue 等等。
 
     我們先來回顧一下mssql server執行這些擴展存儲過程的步驟。ms sql server提供的擴展存儲過程使你可以向t-sql一樣調用一些動態鏈接庫的內部函數邏輯,而且這些擴展存儲過程可以包括win32和com的大多數功能。
當關系數據庫引擎確定 transact-sql 語句引用擴展存儲過程時: 
關系數據庫引擎將擴展存儲過程請求傳遞到開放式數據服務層。然后開放式數據服務將包含擴展存儲過程函數的 dll 裝載到 sql server 2000 地址空間(如果還沒有裝載)。開放式數據服務將請求傳遞到擴展存儲過程。開放式數據服務將操作結果傳遞到數據庫引擎。 
從上圖中我們可以清楚的看到sql server 2000的數據庫引擎通過擴展存儲過程和windows resources進行交互。而擴展存儲過程可以完成處理操作系統任務的關鍵是要有一個自己的身份sid,這個sid就來自mssql server服務啟動賬號。所以如果這個mssql server服務啟動賬號是administrators組的用戶,我們就可以通過這些擴展存儲過程做任意想做的事情:刪除系統信息,破壞注冊表等等。如果我們限制mssql server服務啟動賬號的權限,這樣即使“黑客”或懷有惡意的開發人員獲得數據庫的管理員權限,也不會對操作系統造成很大的影響。只要有數據庫的備份我們可以非常方便的恢復數據庫,而不要重新安裝系統。所以為了更安全的保護我們的系統,我們希望mssql server服務啟動賬號的權限越低越好。
作為系統的一個服務,啟動mssql server 2000服務的用戶賬號也需要一些必要的權限,下面我們就通過一個具體的實例來解釋這些權限(本實例只針對成員服務器,如果是dc和啟動了活動目錄active directory還需要其它的配置):
1.  通過本地用戶管理,建立一個本地用戶sqlserver,密碼:123456;
2.  如果現在就我們打開services配置通過該用戶啟動,系統會報錯誤:
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.
這是因為作為一個普通用戶是無法啟動服務的,我們需要給sqlserver用戶分配必要的權限。
sql server服務啟動賬號必須有3個基本權限:
l         數據庫本地目錄的讀寫權限;
l         啟動本地服務的權限;
l         讀取注冊表的權限;
 
3.  賦予sqlserver用戶mssql目錄的讀寫權限;
因為我的sql server是安裝在d盤,所以我在權限管理中,將d:/progrmam file/microsoft sql server/mssql讀寫權限賦予sqlserver用戶。 
4.  分配sqlserver用戶啟動本地服務的權限;
這個比較復雜,我只舉例作為成員服務器的情況。
l         啟動“local security setting” mmc 管理單元。 
l         展開local policy,然后單擊user rights assignment。 
l         在右側窗格中,右鍵單擊log on as service,將用戶添加到該策略,然后單擊ok。 
l         在右側窗格中,右鍵單擊log on as a batch job,將用戶添加到該策略,然后單擊ok
l         在右側窗格中,右鍵單擊locks pages in memory,將用戶添加到該策略,然后單擊ok
l         在右側窗格中,右鍵單擊act as part of the operating systme,將用戶添加到該策略,然后單擊ok
l         在右側窗格中,右鍵單擊bypass traverse checking,將用戶添加到該策略,然后單擊ok
l         在右側窗格中,右鍵單擊replace a process level token,將用戶添加到該策略,然后單擊ok
l         關閉“local security setting” mmc 管理單元。 
如圖:
5.  重新啟動系統,用sqlserver用戶登陸系統;
6.  再重新啟動系統,已administrator用戶登陸,打開services管理工具,配置用該用戶啟動mssqlserver服務;
   
 
 這樣我們就可以通過限制sqlserver用戶的權限來控制sqlserver擴展存儲過程的權限?,F在sqlserver用戶只對d:/progrmam file/microsoft sql server/mssql目錄有寫的權限,這樣就降低了通過xp_cmdshell來刪除系統文件的風險。
 
通過收購來配置是比較繁瑣的,幸運的是ms sqlserver已經提供了這樣的工具來配置啟動啟動賬號,你可以通過sqlserver的企業管理器配置,入下圖:
這樣sql server企業管理器會自動幫你配置好所有的必要條件。包括目錄的訪問權限,啟動服務的權限,訪問注冊表的權限等等。所以我們正確的配置順序是:
1.  建立用戶;
2.  在sql server企業管理器中配置該用戶啟動;
3.  在分配其它相應的權限(如果需要復制操作);
備注:
通過sql server企業管理器增加的服務啟動賬號,會在registry中增加很多信息,即使你更換用戶也不會刪除,所以在改變服務啟動賬號不要頻繁更換,這樣會增大registry的容量。同時要注意,只有屬于sysadmin角色的用戶才可以配置sql server服務的啟動賬號。
總結:                                           
構建一個安全高效的sqlserver是多方面的,深入了解sqlserver的運行機制是基礎。我們不但要考慮數據庫用戶的安全,也要考慮sqlserver服務的安全性。