使用扩展事件监控 SQL Server 加密

Pse*_*oad 4 encryption sql-server-2016

有没有办法通过扩展事件监控加密连接?我过去曾使用 sqlsni.TRACE 监视 TLS 1.0、1.1 和 1.2 握手,但找不到加密连接本身的相同内容。除非“encrypt=yes”未添加到连接字符串中,否则只会对握手进行加密,而不会加密其他内容。

我可以使用 sys.dm_exec_connections 来捕获它,但它不是实时的,我必须非常频繁地运行它(每分钟或更短时间)才能找到我正在寻找的内容。

Bij*_*ose 5

是的,这可以使用以下跟踪事件来完成,

您可以从此扩展事件跟踪中找到实际协商的 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);
Run Code Online (Sandbox Code Playgroud)

最初的答案是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)
Run Code Online (Sandbox Code Playgroud)

编辑 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;  
Run Code Online (Sandbox Code Playgroud)

请根据您的审核需要更改代码。