Sql-Server-2016

使用擴展事件監視 SQL Server 加密

  • January 12, 2022

有沒有辦法通過擴展事件監控加密連接?我過去曾使用 sqlsni.TRACE 監控過 TLS 1.0、1.1 和 1.2 握手,但找不到與加密連接本身相同的內容。除非“encrypt=yes”沒有添加到連接字元串中,否則只有握手會被加密,沒有別的。

我可以使用 sys.dm_exec_connections 來擷取它,但這不是實時的,我必須非常頻繁地執行它(每分鐘或更短時間)才能找到我正在尋找的東西。

是的,這可以使用以下跟踪事件來完成,

**“**您可以從此擴展事件跟踪中找到有關實際協商的 TLS 協議和密碼的更多詳細資訊,但這需要 SQL Server 2016 SP1 或更高版本:”

CREATE EVENT SESSION [tls] ON SERVER 
ADD EVENT sqlsni.trace(
   WHERE ([sqlserver].[equal_i_sql_ansi_string]([function_name],'Ssl::Handshake') 
AND [sqlserver].[like_i_sql_unicode_string]([text],N'%TLS%')))
ADD TARGET package0.event_file(SET filename=N'tls_trace')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF);

Dan Guzman在這裡給出了 原始答案

另請注意,如果這需要在 2019 年完成,請將事件更改為sqlsni.sni_trace

程式碼會像

CREATE EVENT SESSION [tls_new] ON SERVER 
ADD EVENT sqlsni.sni_trace(
   WHERE ([sqlserver].[equal_i_sql_ansi_string]([function_name],'Ssl::Handshake') 
AND [sqlserver].[like_i_sql_unicode_string]([text],N'%TLS%')))
ADD TARGET package0.event_file(SET filename=N'tls_trace')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)

編輯 在OP的評論之後,要求是找到連接是否加密而不是TLS。

我不知道擴展事件中的選項,但要實現這一點,您可以利用SQL Server 中的登錄觸發器

sys.dm_exec_connections以下是每次登錄後擷取的嘗試。

DROP TABLE IF EXISTS test.dbo.tmp_conn
SELECT * INTO test.dbo.tmp_conn FROM sys.dm_exec_connections dec
WHERE 1=0
GO
CREATE TRIGGER connection_encrypt
ON ALL SERVER WITH EXECUTE AS N'sa'  
FOR LOGON  
AS  
BEGIN  
INSERT INTO test.dbo.tmp_conn
SELECT * FROM sys.dm_exec_connections dec
WHERE dec.session_id=@@spid
END;  

請根據您的審核需要更改程式碼。

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