在訪問sql server 2008的過程當中,大體驗證流程以下圖:sql
當登陸操做一個數據庫的時候,會通過三次驗證:shell
1. 操做系統的驗證 2. SQL SERVER登陸名的驗證 3. 數據庫用戶名的驗證
當使用windows身份認證模式的時候,使用的windows帳號會經過操做系統的驗證,而後以sysadmin的服務器角色經過SQL SERVER 的驗證,在訪問一個具體的數據庫的時候又以其映射的dbo用戶名登陸相應的數據庫。數據庫
當使用SQL SERVER 身份認證模式的時候,首先會使用相似於IIS中的匿名帳號來經過windows驗證,而後以其對應的服務器角色來經過SQL SERVER 的驗證,在訪問一個具體數據庫的時候以其映射的數據庫用戶名來登陸相應的數據庫。windows
操做系統層面:在windows方式驗證的過程當中,由所使用的windows帳號。使用sql帳號驗證的時候,應該是使用了一個相似於iis中的匿名帳號來經過windows驗證的。安全
SQL SERVER 層面:由sql server的登陸用戶的權限來控制,具體的權限由對應的服務器角色來決定。服務器
(SA是SQL SERVER的一個登陸用戶名,而不是數據庫的用戶名)網站
數據庫層面:由數據庫的用戶名的權限來控制,具體能夠經過選擇不一樣的數據庫角色或者自定義權限來實現。spa
(SQL SERVER的登陸用戶名SA經過映射數據庫的用戶名來訪問數據庫內容 )操作系統
因此在SQL SERVER 中,對權限起決定性做用的就是服務器登陸名角色和數據庫用戶名角色。.net
固定服務器角色
(登陸SQL SERVER登陸用戶的權限角色,如SA默認擁有sysadmin角色權限)
Dbcreator: 這個服務器角色的成員能夠建立、更改、刪除和還原任何數據庫。 Diskadmin: 這個服務器角色用於管理磁盤文件,好比鏡像數據庫和添加備份設備。Processadmin:SQL Server 2008可以多任務化,也就是說能夠經過執行多個進程作多個事件。 Securityadmin:這個服務器角色的成員將管理登陸名及其屬性。他們能夠受權、拒絕和撤銷服務器級權限。也能夠受權、拒絕和撤銷數據庫級權限。另外,它們能夠重置SQL Server 2008登陸名的密碼。 Serveradmin: 這個服務器角色的成員能夠更改服務器範圍的配置選項和關閉服務器。Setupadmin:爲須要管理連接服務器和控制啓動的存儲過程的用戶而設計。這個角色的成員能添加到setupadmin,能增長、刪除和配置連接服務器,並能控制啓動過程。 Sysadmin: 這個服務器角色的成員有權在SQL Server 2008中執行任何任務。 Public: 有兩大特色,第一,初始狀態時沒有權限;第二,全部的數據庫用戶都是它的成員。 固定數據庫角色:(數據庫用戶權限) 微軟提供了9個內置的角色,以便於在數據庫級別授予用戶特殊的權限集合。 db_owner: 該角色的用戶能夠在數據庫中執行任何操做。 db_accessadmin: 該角色的成員能夠從數據庫中增長或者刪除用戶。 db_backupopperator: 該角色的成員容許備份數據庫。 db_datareader: 該角色的成員容許從任何表讀取任何數據。 db_datawriter: 該角色的成員容許往任何表寫入數據。 db_ddladmin:該角色的成員容許在數據庫中增長、修改或者刪除任何對象(便可以執行任何DDL語句)。 db_denydatareader: 該角色的成員被拒絕查看數據庫中的任何數據,可是他們仍然能夠經過存儲過程來查看。 db_denydatawriter: 像db_denydatareader角色,該角色的成員被拒絕修改數據庫中的任何數據,可是他們仍然能夠經過存儲過程來修改。 db_securityadmin: 該角色的成員能夠更改數據庫中的權限和角色。 public:在SQL Server 2008中每一個數據庫用戶都屬於public數據庫角色。當還沒有對某個用戶授予或者拒絕對安全對象的特定權限時,這該用戶將據稱授予該安全對象的public角色的權限,這個數據庫角色不能被刪除。
通常能夠經過安全策略裏面的ipsec或者windows防火牆來限制。
能夠在SQL SERVER 配置管理器修改訪問端口爲不常見端口來防止通常性掃描
將登陸審覈修改成「開啓登陸成功和失敗的日誌」,這樣方便數據庫被入侵以後,對日誌的查看。
如使用混合身份驗證模式,建議禁用掉SA帳戶,不然設置很是強的SA密碼。
對於每個網站新建一個登錄用戶並關聯一個數據庫用戶,設置強密碼,給予服務器角色爲:PUBLIC,給予對應的數據庫角色爲:db_owner(需更加安全的保護對應數據庫的數據須要調節更加嚴格的權限,此處給予的爲此數據庫的最高權限,若此帳號泄露,此數據庫中的數據不保,配合後續配置不影響服務器安全)
數據庫須要往磁盤寫文件,或者經過存儲過程執行命令的權限由數據庫服務器的運行帳戶權限決定,使用NETWORK SERVICE帳戶來運行數據庫服務器是較安全的。
合理配置數據庫運行,帳戶在磁盤上的權限,必定不要隨意給寫權限,特別是網站目錄及數據庫存儲目錄之外的位置,這樣即便是SA也不能往磁盤寫文件。
因爲在sql server 2008中sp_dropextendedproc 不能刪除系統擴展存儲過程,因此直接禁用常見危險存儲過程。具體可根據實際狀況來操做,由於有些存儲過程是正常須要的。對於通常帳戶而言,根本沒有執行這些高危存儲過程的權限,而對於SA帳戶來講,以上全部的操做都是可恢復的,我的以爲SA帳戶被入侵以後的關鍵控制點在於合理配置數據庫服務運行帳號的權限。
zhangsan認爲,升級吧!
若是網站被入侵(相似SQL注入),很顯然其對應的帳號的數據庫的數據確定是不保了。普通帳號(只給PUBLIC的帳戶)是沒法執行系統命令的,可能的方式是經過備份數據庫來達到寫馬的操做,防護的最好方法是嚴格控制數據庫運行帳號對磁盤的寫權限
SA帳戶被入侵後,通常會經過開啓xp_cmdshell存儲過程來執行系統命令。可是若是配置的數據庫服務運行帳號NETWORK SERVICE,它可以執行的系統命令也就有限了,甚至能夠取消NETWORK SERVICE對於cmd.exe的執行權限。還有就是須要合理配置NETWORK SERVICE的磁盤寫入權限。
EXEC sp_configure 'show advanced options', 1; go RECONFIGURE; GO EXEC sp_configure 'xp_cmdshell', 1; go RECONFIGURE; GO
exec xp_cmdshell 'whoami'
(若是該存儲過程能夠執行說明可能已經被入侵)
常見危險存儲過程:
xp_cmdshell xp_delete_file xp_regread xp_regwrite xp_dirtree
因爲在sql server 2008中sp_dropextendedproc 不會刪除系統擴展存儲過程,故直接禁用便可
EXEC sp_configure 'show advanced options', 0; EXEC sp_configure 'xp_cmdshell', 0;