SQL Server使用證書最小粒度授權

2021-09-16 23:30:24 字數 3208 閱讀 3871

最近在專案中某個功能遇到了阻塞造成的time out錯誤。所以需要在執行該功能的時候開啟乙個執行緒檢測sql server中阻塞會話。但是程式本身使用的sql帳號本身不具備view sever state許可權。這個許可權是sys_admin角色的。所以就需要使用證書將view server state許可權賦予給普通賬號。

在開發之前找到了以下兩篇博文參考:

sql server 2005: 儲存過程簽名 - stswordman -

這一篇使用了master key. 當資料庫備份後, 在其他資料庫還原時需要master key.

pitching pebbles - using certificates to grant privileges | colleenmorrow.com

這一篇直接使用的證書的金鑰做. 沒有前一篇master key帶來的問題. 只是示例使用的是master庫.以及直接賦予的sys_admin角色的許可權.

本人結合兩篇博文的要點,採用證書密碼的方式授予view server state許可權。

以下是**

新建乙個檢視阻塞程序的儲存過程:

use [testdb]

gocreate proc [dbo].[sp_checkblocksession]

aswith cte_sid ( bsid, sid, sql_handle )

as ( select blocking_session_id ,

session_id ,

sql_handle

from sys.dm_exec_requests

where blocking_session_id <> 0

union all

select a.blocking_session_id ,

a.session_id ,

a.sql_handle

from sys.dm_exec_requests a

join cte_sid b on a.session_id = b.bsid

)select c.bsid as blocking_session_id,

c.sid as session_id,

s.login_name ,

s.host_name ,

s.status ,

s.cpu_time ,

s.memory_usage ,

s.last_request_start_time ,

s.last_request_end_time ,

s.logical_reads ,

s.row_count ,

q.text

from cte_sid c

join sys.dm_exec_sessions s on c.sid = s.session_id

order by sid

新建乙個最小許可權賬戶

use testdb

go--新建乙個最小許可權賬戶

create login test_view with password = '123';

create user test_view for login test_view

--讓該賬戶有許可權執行儲存過程dbo.sp_checkblocksession

grant execute on sp_checkblocksession to test_view

測試最小許可權賬戶執行sp_checkblocksession

execute as login = 'test_view' ;

exec sp_checkblocksession

revert ;

--錯誤訊息

訊息 297,級別 16,狀態 1,過程 sp_checkblocksession,第 3 行

使用者沒有執行此操作的許可權。

use testdb

go--建立證書以及授權

create certificate certsigncheckblocksession_1 encryption by password ='test111' with subject = 'for signing procedure sp_checkblocksession', expiry_date='2025-10-10' ;

-- sp_checkblocksession

add signature to sp_checkblocksession by certificate certsigncheckblocksession_1 with password = 'test111' ;

backup certificate certsigncheckblocksession_1 to file = 'certsigncheckblocksession_1.cer' ;

use master

gocreate certificate certsigncheckblocksession_1 from file = 'certsigncheckblocksession_1.cer' ;

-- 建立登入並對映到證書

create login l_testview from certificate certsigncheckblocksession_1 ;

-- 通過授權對映登入的方式將alter any login許可權賦給證書

grant view server state to l_testview ;

--測試最小許可權賬戶許可權

use testdb

goexecute as login = 'test_view' ;

exec sp_checkblocksession

revert ;--成功得到結果, 不再提示使用者沒有此操作許可權.

以上是使用證書簽名儲存過程的全部過程. 可以實現最小粒度許可權的賦予。這樣在生產環境中,就避免了賦予不必要的管理許可權。降低風險!

注意事項:證書備份路徑的問題. 如果沒有指定絕對路徑。則備份檔案在d:program files (x86)microsoft sql servermssql10_50.mssqlservermssqldata(樓主的機器)目錄下面。這個目錄有可能許可權不足而無法備份到裡面。本來我想使用絕對路徑的。但是由於我開發某個專案時,使用了乙個功能造成我當前賬戶的許可權被縮小到很小。無法使用絕對路徑進行備份,所以才使用了預設路徑。各位做測試的話要注意這個問題。

使用證書建立request請求

之前寫過的程式,都是普通http request。這是第一次使用,記錄下。1 private static x509certificate2 getcert string certid,storelocation location 217 18finally 1922 23return result...

docker 配置遠端連線 使用證書 使用指令碼

系統 centos7 docker 1.13.1 使用步驟 1.右鍵編輯指令碼,修改ip,password,dir三個變數值 ip是ip,password是建立證書過程中用到的密碼,dir是存放證書的目錄。2.執行指令碼 sh dk link.sh 3.修改docker配置檔案 lib system...

證書的使用

關於普通證書應用中對話方塊的簡單說明 一 使用者訪問https的 過程中,在輸入 位址後,通常會彈出如下對話方塊 這是ie本身的設定造成的。如果使用者不希望每次訪問https的站點都有這樣的提示,只要勾中 以後不再顯示該警告 即可。二 使用者訪問https站點後將首先選擇證書,選擇證書之後以及每次使...