Sql-Server

如何拒絕通過 SSMS 訪問 SQL Server 以進行某些登錄,但允許通過 .Net SqlClient 數據提供程序

  • September 27, 2021

我們有一種情況,開發人員沒有任何UPDATE權限,但他們使用應用程序並查看連接字元串 -> 他們知道某些SQLLogin1具有 UPDATE 權限的 SQL 帳戶(例如)的密碼。我們目前的操作並不完美,有時需要修改生產數據(還沒有 GUI)。

開發人員沒有聯繫 DBA 並要求他修改數據,而是(不正確地)使用 SQL 帳戶SQLLogin1(有權修改數據),並通過 SQL Server Management Studio 連接自己修改數據。

如果開發人員沒有看到新的連接字元串和新密碼, DBA 無法更改密碼SQLLogin1,因為使用的應用程序連接字元串SQLLogin1由開發人員維護。

問題:

有沒有辦法拒絕訪問SQLLogin1SQL 登錄,但前提是它通過 SSMS 連接?

同時如果SQLLogin1正在連接.Net SqlClient Data Providerprogram_namesys.dm_exec_sessions),則必須允許登錄。

這樣,我們不想讓開發人員使用 SSMS 連接SQLLogin1,而正在使用的應用程序SQLLogin1仍然能夠連接。

您可以使用伺服器登錄觸發器進行自定義登錄驗證,並在您認為合適時拒絕它們。如果您使用 SSMS,您將在“伺服器對象”下方和“觸發器”內看到此觸發器。

例如:

CREATE TRIGGER strRejectSSMSConnectionForSQLLogin1
ON ALL SERVER FOR LOGON
AS
BEGIN

   IF ORIGINAL_LOGIN() = N'SQLLogin1' AND PROGRAM_NAME() LIKE N'Microsoft SQL Server Management Studio%'
   BEGIN
       RAISERROR('Direct connection by SSMS refused.', 16, 1)
       ROLLBACK
   END

END

觸發器內部將ROLLBACK拒絕連接(有一個隱式事務包裝了登錄事件對觸發器的呼叫)。

實現登錄觸發器時要小心,如果沒有正確編碼,您將拒絕應該能夠登錄的登錄(包括您自己的!)。確保首先在測試/開發環境中進行測試。

請記住,此程式碼在創建會話之前執行,因此依賴會話 ID (SPID) 的系統視圖將不包含目前檢查的登錄,直到觸發器結束而沒有回滾或足夠高的失敗。

引用自:https://dba.stackexchange.com/questions/231228