安全性問題一直是一個比較難解決的老問題了,在網(wǎng)絡的任何方面都包含安全問題,而我們的數(shù)據(jù)庫也不例外。數(shù)據(jù)庫的安全問題也是我們作為一個DBA必須要考慮的問題。因為建立數(shù)據(jù)庫的目的是為了讓我們的客戶端來訪問,所以在其中存在著很多的安全隱患,比如客戶端鏈接的權限、數(shù)據(jù)傳輸過程中的安全等,所以我們在考慮SQL Server服務器安全時,建議從以下幾個方面考慮:
1. 客戶端安全。首先要保證客戶端是安全的,比如為客戶端安裝防病毒軟件,防火墻,安裝升級補丁等等。
2. 數(shù)據(jù)傳輸過程中的安全。數(shù)據(jù)在傳輸過程中,很容易被監(jiān)聽,或者被捕獲,所以我們應該使用一些加密機制來保證數(shù)據(jù)的機密性,等等。
3. 最主要還是要在數(shù)據(jù)庫服務器上實現(xiàn)安全機制來保證安全性。我們的SQL Server數(shù)據(jù)庫是一個非常安全的數(shù)據(jù)庫,因為我們的客戶端如果想對數(shù)據(jù)庫里的數(shù)據(jù)進行操作(比如select、insert等),必須要經(jīng)歷三道檢查,也就是我們要經(jīng)過三重門(登錄驗證、數(shù)據(jù)庫驗證、對象權限)。舉個例子,如果我們把SQL Server服務器看成一座大廈,我們首先要現(xiàn)有權利進入大廈,即通過大廈的大門(登錄驗證),然后還得擁有對某個房間的訪問權限(對數(shù)據(jù)庫的權限),進入房間后還得擁有打開保險柜的權利(對表的操作權限)。也就是首先我們必須先建立登錄帳戶,而登錄帳戶分為兩種:windows帳戶和SQL帳戶(因為SQL Server有兩種身份驗證,即windows身份驗證和混合身份驗證)。具體操作方法:打開“SSMS—SQL Server實例—安全性—登錄名”,右鍵選擇“新建登錄名”,選擇身份驗證模式(身份驗證模式不同,帳戶類型也不一樣,注意:建立windows登錄帳戶,必須先在windows操作系統(tǒng)上先建立該賬戶),輸入名字,并為該用戶選擇一個默認數(shù)據(jù)庫(比如默認為master數(shù)據(jù)庫)。該賬戶建立好之后,我們通過“新建”—“數(shù)據(jù)庫引擎查詢”的方式來測試用戶,我們會發(fā)現(xiàn)該用戶只能連接數(shù)據(jù)庫,并不能對數(shù)據(jù)庫進行任何其他操作。所以下面是第二道門,建立數(shù)據(jù)庫用戶,以便用戶可以訪問數(shù)據(jù)庫,對數(shù)據(jù)庫進行操作。我們在建立數(shù)據(jù)庫用戶時,其實就是映射登錄用戶,所以在一般情況下,我們的登錄名和數(shù)據(jù)庫用戶名是一致的。操作方法:第一種:打開“SSMS—SQL Server實例—具體的數(shù)據(jù)庫—安全性—數(shù)據(jù)庫用戶”;第二種:直接在以前建立過的登錄用戶上映射數(shù)據(jù)庫就可以了。最后一道門是在具體的數(shù)據(jù)庫對象(比如表)上授予具體的權限,三種權限:授予、回收、拒絕。這里不再詳細接受三種權限的區(qū)別。前面提了一下安全配置的一些基本概念了,下面在給大家介紹一下,如何通過T-SQL語句來實現(xiàn)帳戶的創(chuàng)建。因為在客戶端連接到SQL Server服務器時,有兩種身份驗證:windows身份驗證或者使用SQL身份驗證,所以在使用帳戶時,也可以使用兩種類型的帳戶,在這里我們要注意一個問題,前面提及過連接SQL需要三道門,那我們就需要建立帳戶,當我們的環(huán)境是工作組時,如果使用windows身份驗證,比如創(chuàng)建了一個用戶zhangsan,那就要求要連接的客戶端也建立同樣的帳戶,并且密碼要求一樣,否則無法連接,下面是一些具體的例子:
1. windows身份驗證:
Sp_grantlogin ‘login’
例子:允許sky域用戶user1及sqlusers組連接SQL服務:
允許本地組Users連接SQL服務
sp_grantlogin ‘sky\user1’
sp_grantlogin ‘test\sqlusers’
sp_grantlogin ‘BUILTIN\users’
go
Sp_denylogin ‘login’
例子:
– 禁止sky域用戶user1及sqlusers組連接SQL服務:
– 禁止本地組Users連接SQL服務
sp_denylogin ‘sky\user1’
sp_denylogin ‘sky\sqlusers’
sp_denylogin ‘BUILTIN\users’
go
刪除登錄標識:
Sp_revokelogin ‘login’
例子:
從sysxlogins系統(tǒng)表中刪除user1及sqlusers
sp_revokelogin ‘sky\user1’
sp_revokelogin ‘sky\sqlusers’
go
創(chuàng)建SQL登錄標識:
Exec Sp_addlogin ‘login’
‘password’
‘database’
‘language’
‘sid’
‘encryption_option’
舉例:Exec Sp_addlogin test1
Exec Sp_addlogin test2, password, northwind
修改登錄標識:
Exec Sp_password ‘oldpsw’,’newpsw’,’login’
Exec Sp_defaultdb ‘login’,’database’
Exec Sp_defaultlanguage ‘login’,’language
刪除SQL登錄標識:
exec sp_droplogin ‘login’
2. 數(shù)據(jù)庫角色:
創(chuàng)建和刪除自定義角色:
Sp_addrole ‘role’, ‘owner’
– Role為創(chuàng)建的角色
– Owner為角色的擁有者,默認為dbo
Sp_droprole ‘role’
Use northwind
Go
Sp_addrole ‘sales’, ‘dbo’
Go
Sp_addrole ‘manager’
Go
Sp_droprole ‘manager’
Go
為固定服務器角色添加刪除成員:
Sp_addrole ‘role’, ‘owner’
– Role為創(chuàng)建的角色
– Owner為角色的擁有者,默認為dbo
Sp_droprole ‘role’
為數(shù)據(jù)庫角色添加刪除成員:
Sp_addrolemember ‘role’, ‘a(chǎn)ccount’
Sp_droprolemember ‘role’, ‘a(chǎn)ccount’
– Role為固定或自定義數(shù)據(jù)庫角色
– Account為SQL登錄標識或NT帳號
管理數(shù)據(jù)庫用戶:
Sp_grantdbaccess ‘login’, ‘name_in_db’
Sp_revokedbaccess ‘name_in_db’
– Login為登錄標識
– Name_in_db為在數(shù)據(jù)庫里的用戶帳號,默認為同名
3. 權限授予、拒絕、回收
將northwind的訂單表的select許可授予所有用戶:
Use northwind
Go
Grant select
on 訂單
to public
go
將sales表的數(shù)據(jù)修改許可授予自定義角色salesmanger:
Grant insert,update,delete
on sales
to salesmanger
Go
允許用戶user1查看publishers表的所有內(nèi)容,但只允許修改pub_id列:
Grant select,update{pub_id}
on publishers
to user1
Go