在訪問sql server 2008的過程中,大致驗證流程如下圖:
當登錄操作一個數據庫的時候,會經過三次驗證:
1. 操作系統的驗證
2. SQL SERVER登錄名的驗證
3. 數據庫用戶名的驗證
當使用windows身份認證模式的時候,使用的windows賬號會通過操作系統的驗證,然后以sysadmin的服務器角色通過SQL SERVER 的驗證,在訪問一個具體的數據庫的時候又以其映射的dbo用戶名登錄相應的數據庫。
當使用SQL SERVER 身份認證模式的時候,首先會使用類似于IIS中的匿名賬號來通過windows驗證,然后以其對應的服務器角色來通過SQL SERVER 的驗證,在訪問一個具體數據庫的時候以其映射的數據庫用戶名來登錄相應的數據庫。
操作系統層面:在windows方式驗證的過程中,由所使用的windows賬號。使用sql賬號驗證的時候,應該是使用了一個類似于iis中的匿名賬號來通過windows驗證的。
SQL SERVER 層面:由sql server的登錄用戶的權限來控制,具體的權限由對應的服務器角色來決定。
(SA是SQL SERVER的一個登錄用戶名,而不是數據庫的用戶名)
數據庫層面:由數據庫的用戶名的權限來控制,具體可以通過選擇不同的數據庫角色或者自定義權限來實現。
(SQL SERVER的登錄用戶名SA通過映射數據庫的用戶名來訪問數據庫內容 )
所以在SQL SERVER 中,對權限起決定性作用的就是服務器登錄名角色和數據庫用戶名角色。
固定服務器角色
(登錄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;
求指正,求指教!