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