我们在 SQL 服务器上启用了 SSL,并且我们的监控工具警告存在未加密的连接。
监控此检查每分钟运行一次,并使用以下查询进行检查:
SELECT COUNT(*)
FROM sys.dm_exec_connections
WHERE encrypt_option <> 'TRUE'
我做了一些进一步的调查,设置了一个代理作业以将以下查询的结果转储到一个表中(该作业每分钟运行一次)
SELECT c.*,
r.status,
r.command,
r.last_wait_type,
s.host_name,
s.program_name,
s.client_interface_name,
s.login_name,
s.database_id,
qs.text
FROM sys.dm_exec_connections c
LEFT JOIN sys.dm_exec_requests r
ON c.connection_id = r.connection_id
LEFT JOIN sys.dm_exec_sessions s
ON c.session_id = s.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) qs
WHERE encrypt_option <> 'TRUE'
如果我从我的表中选择,我会看到一些结果(由于结果集很宽,分布在三个屏幕截图中):
对我来说,sys.dm_exec_connections
在这里继续下去并没有太多意义。这些连接唯一看起来特别的是它们都是端点 2 ( TSQL Local Machine
) 并且具有 auth_schema(unknown)
我可以在此基础上将它们排除在监控之外,但我想在这样做之前确保它们是良性的。
这些联系是什么?为什么启用 SSL 后它们未加密?我可以查看更多信息以更好地了解它们吗?
sys.dm_exec_connections DMV 返回所有当前建立的连接,而sys.dm_exec_sessions为每个经过身份验证的会话返回一行。这意味着在新建立的连接完成初始握手和身份验证过程之前,可能存在没有对应行的行。这通常是健康实例的短暂情况。
sys.dm_exec_connections
sys.dm_exec_sessions
考虑将
sys.dm_exec_sessions
连接更改为 ,INNER JOIN
以便只返回经过身份验证的会话。这些应该显示encrypt_option = 'TRUE'
,因为 TLS 握手将在身份验证后完成。