外观
SQLServer 连接安全
连接安全概述
连接安全威胁
- 网络嗅探:攻击者截获网络数据包获取敏感信息
- 中间人攻击:攻击者伪装成合法服务器或客户端获取通信数据
- 密码破解:通过暴力破解或字典攻击获取登录凭据
- 未授权访问:攻击者利用配置漏洞或弱密码访问数据库
- 连接劫持:攻击者接管已建立的数据库连接
- 拒绝服务攻击:攻击者通过大量连接请求耗尽数据库资源
连接安全策略
- 实施分层安全防御体系
- 采用最小权限原则
- 定期审查和更新安全配置
- 实施强密码策略
- 启用连接加密
- 限制网络访问范围
- 监控和审计连接活动
合规要求
- GDPR:要求保护个人数据传输安全
- HIPAA:要求医疗数据传输加密
- PCI DSS:要求金融数据传输加密
- SOX:要求审计数据库访问活动
- ISO 27001:要求实施信息安全管理体系
SSL/TLS 配置
SSL/TLS 概述
SSL/TLS 是用于保护网络通信的加密协议,SQL Server 使用 SSL/TLS 实现:
- 服务器身份验证
- 客户端身份验证(可选)
- 数据传输加密
- 防止中间人攻击
证书管理
证书类型
- 自签名证书:适用于测试环境,不推荐生产环境
- 内部 CA 颁发证书:适用于企业内部环境
- 公共 CA 颁发证书:适用于公网访问的生产环境
证书要求
- 证书必须包含服务器的完全限定域名 (FQDN)
- 证书必须使用支持的加密算法(SHA-256 或更高)
- 证书必须包含私钥
- 证书有效期不应过长(建议 1-2 年)
配置 SSL/TLS
SQL Server 配置管理器配置
- 打开 SQL Server 配置管理器
- 展开 "SQL Server 网络配置"
- 右键点击 "XXX 的协议",选择 "属性"
- 切换到 "证书" 选项卡,选择要使用的证书
- 切换到 "标志" 选项卡,设置 "强制加密" 为 "是"
- 重启 SQL Server 服务
验证 SSL/TLS 连接
使用 SSMS 验证:
- 连接到 SQL Server
- 右键点击服务器,选择 "属性"
- 查看 "连接" 选项卡中的 "已加密连接" 状态
使用 T-SQL 验证:
sql
SELECT
session_id,
encrypt_option,
client_net_address,
local_net_address
FROM sys.dm_exec_connections;使用 PowerShell 验证:
powershell
Test-NetConnection -ComputerName YourServer -Port 1433 -InformationLevel Detailed连接加密
强制加密
服务器端强制加密
- 配置 SQL Server 强制所有连接使用加密
- 适合需要统一加密策略的环境
- 配置方法:SQL Server 配置管理器 → 协议属性 → 标志 → 强制加密 = 是
客户端强制加密
- 在连接字符串中指定加密要求
- 适合需要灵活加密策略的环境
- 连接字符串示例:
Server=YourServer;Database=YourDB;Integrated Security=True;Encrypt=True;TrustServerCertificate=False;
加密算法选择
支持的加密算法
- AES-256(推荐)
- AES-128
- 3DES(不推荐,已过时)
- RC4(不推荐,已弃用)
配置加密算法优先级
powershell
# 设置 TLS 1.2 为优先算法
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value 1 -PropertyType DWORD
New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value 1 -PropertyType DWORD性能影响
- 连接加密会增加 CPU 使用率(通常 5-15%)
- 对网络延迟影响较小
- 建议使用硬件加速加密(如 AES-NI)
- 可以通过基准测试评估具体影响
防火墙设置
Windows 防火墙配置
允许 SQL Server 默认端口
powershell
# 允许 SQL Server 默认端口 (1433)
New-NetFirewallRule -DisplayName "SQL Server (TCP 1433)" -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow
# 允许 SQL Server Browser 端口 (1434)
New-NetFirewallRule -DisplayName "SQL Server Browser (UDP 1434)" -Direction Inbound -Protocol UDP -LocalPort 1434 -Action Allow允许命名实例动态端口
- 查看命名实例使用的动态端口:sql
SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID; - 为该端口创建防火墙规则
Linux 防火墙配置
使用 iptables
bash
# 允许 SQL Server 端口
iptables -A INPUT -p tcp --dport 1433 -j ACCEPT
iptables -A INPUT -p udp --dport 1434 -j ACCEPT
# 保存规则
service iptables save使用 firewalld
bash
# 允许 SQL Server 端口
firewall-cmd --add-port=1433/tcp --permanent
firewall-cmd --add-port=1434/udp --permanent
# 重载规则
firewall-cmd --reloadAzure 网络安全组 (NSG)
创建 NSG 规则
- 在 Azure 门户中创建网络安全组
- 添加入站规则:
- 源:允许的 IP 范围
- 目标端口:1433
- 协议:TCP
- 动作:允许
- 将 NSG 关联到 SQL Server VM 或 Azure SQL 数据库所在的子网
防火墙最佳实践
- 仅允许必要的 IP 地址访问
- 避免使用通配符 IP 范围
- 定期审查和更新防火墙规则
- 考虑使用 VPN 或 ExpressRoute 进行安全连接
连接字符串安全
连接字符串加密
.NET 应用程序
csharp
// 使用 Configuration Manager 加密配置文件
aspnet_regiis -pef "connectionStrings" "C:\YourApplication"
// 或在代码中加密
string connectionString = "Server=YourServer;Database=YourDB;User Id=YourUser;Password=YourPassword;";
string encryptedString = EncryptString(connectionString);PowerShell 应用程序
powershell
# 加密连接字符串
$connectionString = "Server=YourServer;Database=YourDB;User Id=YourUser;Password=YourPassword;"
$secureString = ConvertTo-SecureString $connectionString -AsPlainText -Force
$encryptedString = ConvertFrom-SecureString $secureString避免硬编码凭据
- 使用配置文件存储连接字符串
- 使用环境变量存储敏感信息
- 使用 Azure Key Vault 或 AWS Secrets Manager 管理凭据
- 使用集成身份验证替代 SQL 身份验证
使用集成身份验证
- 利用 Windows 或 Azure AD 凭据进行身份验证
- 避免在连接字符串中存储密码
- 简化凭据管理
- 连接字符串示例:
Server=YourServer;Database=YourDB;Integrated Security=True;
连接池安全
连接池配置
csharp
// 配置连接池
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.Pooling = true;
builder.MinPoolSize = 5;
builder.MaxPoolSize = 100;
builder.ConnectTimeout = 30;
builder.ApplicationName = "YourApp";连接池最佳实践
- 设置合理的连接池大小
- 使用应用程序名称标识连接
- 确保连接及时关闭和释放
- 定期刷新连接池凭据
登录安全
登录审核
启用登录审核
sql
-- 启用登录审核
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel', REG_DWORD, 3;
-- 查看登录审核设置
EXEC xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel';审核级别
- 0:无审核
- 1:仅成功登录
- 2:仅失败登录
- 3:成功和失败登录
失败登录尝试限制
使用登录触发器
sql
CREATE TRIGGER tr_limit_login_attempts
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
DECLARE @LoginName NVARCHAR(128) = ORIGINAL_LOGIN();
DECLARE @Attempts INT;
SELECT @Attempts = COUNT(*)
FROM sys.event_log
WHERE event_type = 'login_failed'
AND login_name = @LoginName
AND start_time > DATEADD(MINUTE, -15, GETDATE());
IF @Attempts > 5
BEGIN
ROLLBACK;
RAISERROR('登录尝试次数过多,请稍后重试。', 16, 1);
END
END;使用 Azure SQL 数据库
- 在 Azure 门户中配置 "登录尝试失败阈值"
- 设置 "锁定持续时间"
- 配置 "通知设置"
登录触发器
限制登录 IP
sql
CREATE TRIGGER tr_restrict_login_ip
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
DECLARE @ClientIP NVARCHAR(15) = CONVERT(NVARCHAR(15), CONNECTIONPROPERTY('client_net_address'));
-- 允许的 IP 列表
IF @ClientIP NOT IN ('192.168.1.100', '10.0.0.50')
BEGIN
ROLLBACK;
RAISERROR('不允许从该 IP 地址登录。', 16, 1);
END
END;登录安全最佳实践
- 使用强密码策略
- 定期轮换登录密码
- 禁用不必要的登录账户
- 实施登录审核
- 限制登录尝试次数
- 使用登录触发器增强安全性
网络协议安全
启用/禁用网络协议
SQL Server 配置管理器
- 打开 SQL Server 配置管理器
- 展开 "SQL Server 网络配置"
- 点击 "XXX 的协议"
- 在右侧面板中启用/禁用所需的协议
推荐配置
- 生产环境:仅启用 TCP/IP
- 开发环境:可启用 TCP/IP 和 Shared Memory
- 禁用 Named Pipes(除非必要)
TCP/IP 配置
配置 TCP/IP 协议
- 打开 SQL Server 配置管理器
- 右键点击 TCP/IP,选择 "属性"
- 切换到 "IP 地址" 选项卡
- 配置 IP 地址和端口设置
- 重启 SQL Server 服务
最佳实践
- 使用静态端口(建议使用默认端口 1433)
- 禁用不必要的 IP 地址
- 考虑使用非标准端口增加安全性
- 启用 TCP/IP 过滤
Named Pipes 配置
- 仅在必要时启用 Named Pipes
- 配置 Named Pipes 路径
- 限制 Named Pipes 访问权限
Shared Memory 配置
- 仅在同一服务器上的应用程序使用时启用
- 适用于本地连接,性能最佳
- 不建议远程连接使用
远程访问安全
启用/禁用远程访问
T-SQL 配置
sql
-- 启用远程访问
EXEC sp_configure 'remote access', 1;
RECONFIGURE;
-- 启用 RPC 远程访问
EXEC sp_configure 'remote proc trans', 1;
RECONFIGURE;禁用远程访问
sql
-- 禁用远程访问
EXEC sp_configure 'remote access', 0;
RECONFIGURE;远程连接限制
使用防火墙限制
- 仅允许特定 IP 地址远程访问
- 使用 VPN 或 ExpressRoute 进行安全连接
- 考虑使用 Azure Bastion 访问 Azure VM
使用登录触发器限制
sql
CREATE TRIGGER tr_restrict_remote_login
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
DECLARE @IsLocal BIT = CASE WHEN CONNECTIONPROPERTY('client_net_address') = '127.0.0.1' THEN 1 ELSE 0 END;
DECLARE @LoginName NVARCHAR(128) = ORIGINAL_LOGIN();
-- 仅允许 sa 从本地登录
IF @LoginName = 'sa' AND @IsLocal = 0
BEGIN
ROLLBACK;
RAISERROR('sa 账户仅允许本地登录。', 16, 1);
END
END;VPN 访问
- 使用 IPsec VPN 或 SSL VPN 访问数据库
- 配置 VPN 隧道加密
- 实施 MFA(多因素认证)
- 定期审查 VPN 访问日志
远程访问最佳实践
- 限制远程访问的 IP 范围
- 禁用 sa 账户的远程访问
- 使用多因素认证
- 定期审查远程访问权限
- 监控远程访问活动
连接安全监控
连接监控
使用动态管理视图
sql
-- 查看当前连接
SELECT
session_id,
login_name,
host_name,
program_name,
client_net_address,
local_net_address,
encrypt_option,
connect_time,
last_request_end_time
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;使用 SQL Server Profiler
- 创建跟踪模板,包含登录/注销事件
- 配置过滤器,仅捕获相关事件
- 定期审查跟踪数据
异常连接检测
使用 Extended Events
sql
-- 创建 Extended Events 会话
CREATE EVENT SESSION [ConnectionMonitor]
ON SERVER
ADD EVENT sqlserver.login
ADD TARGET package0.event_file(SET filename=N'C:\XEvents\ConnectionMonitor.xel')
WITH (MAX_MEMORY=4096 KB, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY=30 SECONDS);
-- 启动会话
ALTER EVENT SESSION [ConnectionMonitor] ON SERVER STATE=START;使用 PowerShell 脚本
powershell
# 监控异常连接
$threshold = 10
$connections = Get-WmiObject -Class Win32_PerfFormattedData_MSSQLSERVER_SQLServerGeneralStatistics -ComputerName YourServer
if ($connections.UserConnections -gt $threshold)
{
Write-EventLog -LogName Application -Source "SQLServerMonitor" -EventID 1001 -EntryType Warning -Message "数据库连接数超过阈值: $($connections.UserConnections)"
}审计连接事件
启用 SQL Server 审计
sql
-- 创建服务器审计
CREATE SERVER AUDIT ServerAudit
TO FILE (FILEPATH = 'C:\Audits\', MAXSIZE = 100 MB)
WITH (ON_FAILURE = CONTINUE);
-- 启用审计
ALTER SERVER AUDIT ServerAudit WITH (STATE = ON);
-- 创建服务器审计规范
CREATE SERVER AUDIT SPECIFICATION ServerAuditSpec
FOR SERVER AUDIT ServerAudit
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (FAILED_LOGIN_GROUP),
ADD (LOGOUT_GROUP);
-- 启用审计规范
ALTER SERVER AUDIT SPECIFICATION ServerAuditSpec WITH (STATE = ON);查看审计日志
sql
-- 查看审计日志
SELECT
event_time,
action_id,
session_id,
server_principal_name,
client_ip,
application_name,
statement
FROM sys.fn_get_audit_file('C:\Audits\*.sqlaudit', NULL, NULL);监控最佳实践
- 启用登录审核
- 配置 Extended Events 监控连接活动
- 定期审查连接日志
- 设置连接数阈值警报
- 监控异常连接模式
- 审计敏感操作
连接安全最佳实践
网络层安全
- 使用防火墙限制网络访问
- 启用连接加密
- 使用 VPN 或 ExpressRoute 进行远程访问
- 禁用不必要的网络协议
身份验证安全
- 使用强密码策略
- 实施多因素认证
- 禁用 sa 账户或重命名
- 使用集成身份验证
- 限制登录尝试次数
加密安全
- 使用 SSL/TLS 1.2 或更高版本
- 使用强加密算法(AES-256)
- 定期更新证书
- 验证证书有效性
监控和审计
- 启用登录审核
- 监控连接活动
- 检测异常连接模式
- 定期审查安全日志
定期维护
- 应用最新的安全补丁
- 定期更新 SSL/TLS 证书
- 审查和更新防火墙规则
- 轮换登录密码
- 审查用户访问权限
版本差异
SQL Server 2008/2008 R2
- 支持 SSL 3.0 和 TLS 1.0
- 不支持 TLS 1.2 及以上版本
- 连接加密性能较低
- 审计功能有限
SQL Server 2012
- 支持 TLS 1.0 和 TLS 1.1
- 从 Service Pack 3 开始支持 TLS 1.2
- 增强了审计功能
- 改进了连接加密性能
SQL Server 2014
- 支持 TLS 1.0、1.1 和 1.2
- 增强了 Extended Events 监控
- 改进了连接池管理
- 支持 Azure AD 身份验证(部分功能)
SQL Server 2016
- 支持 TLS 1.0、1.1 和 1.2
- 默认禁用 SSL 3.0
- 增强了 Always Encrypted 功能
- 改进了 Azure AD 身份验证支持
SQL Server 2017
- 支持 TLS 1.0、1.1 和 1.2
- 预览支持 TLS 1.3
- 增强了 Linux 平台的安全功能
- 支持 Linux 上的 SSL/TLS 配置
SQL Server 2019
- 支持 TLS 1.0、1.1、1.2 和 1.3
- 默认禁用 TLS 1.0 和 1.1
- 增强了 Always Encrypted with Secure Enclaves
- 改进了审核功能
SQL Server 2022
- 支持 TLS 1.2 和 1.3
- 默认禁用 TLS 1.0 和 1.1
- 增强了 Ledger 功能,提供不可篡改的交易记录
- 改进了 Azure Synapse Link 的安全连接
- 增强了 Microsoft Purview 集成
常见问题 (FAQ)
如何配置 SQL Server 使用 SSL/TLS?
配置 SQL Server 使用 SSL/TLS 的步骤:1) 获取适合的 SSL/TLS 证书;2) 在 SQL Server 配置管理器中安装证书;3) 配置强制加密;4) 重启 SQL Server 服务;5) 验证 SSL/TLS 连接。证书可以是自签名证书(测试环境)或由受信任 CA 颁发的证书(生产环境)。
如何验证 SQL Server 连接是否加密?
验证 SQL Server 连接是否加密的方法:1) 使用 SSMS 查看服务器属性中的 "已加密连接" 状态;2) 查询 sys.dm_exec_connections 动态管理视图,查看 encrypt_option 列;3) 使用 PowerShell 的 Test-NetConnection 命令测试连接;4) 检查客户端连接字符串中的 Encrypt 属性。
如何保护连接字符串?
保护连接字符串的方法:1) 避免硬编码连接字符串;2) 使用配置文件存储并加密;3) 使用环境变量存储敏感信息;4) 使用 Azure Key Vault 或 AWS Secrets Manager 管理凭据;5) 使用集成身份验证替代 SQL 身份验证;6) 对连接字符串进行加密处理。
如何限制 SQL Server 的远程访问?
限制 SQL Server 远程访问的方法:1) 使用防火墙限制允许的 IP 地址;2) 禁用不必要的网络协议;3) 使用登录触发器限制登录 IP;4) 配置 SQL Server 禁用远程访问;5) 使用 VPN 或 ExpressRoute 进行安全连接;6) 限制 sa 账户仅允许本地登录。
连接加密会影响性能吗?
连接加密会对性能产生一定影响,主要是增加 CPU 使用率(通常 5-15%),对网络延迟影响较小。可以通过以下方法减少性能影响:1) 使用硬件加速加密(如 AES-NI);2) 选择高效的加密算法(如 AES-256);3) 仅在必要时启用强制加密;4) 优化 SQL Server 配置。
如何处理 SSL/TLS 证书过期?
处理 SSL/TLS 证书过期的步骤:1) 提前规划证书续订(建议提前 30 天);2) 获取新证书;3) 在 SQL Server 配置管理器中更新证书;4) 重启 SQL Server 服务;5) 验证新证书是否正常工作;6) 监控证书有效期,设置过期提醒。
如何配置 Azure SQL 数据库的连接安全?
配置 Azure SQL 数据库连接安全的方法:1) 在 Azure 门户中配置防火墙规则;2) 启用 Azure AD 身份验证;3) 配置连接加密;4) 启用高级威胁防护;5) 配置审计日志;6) 考虑使用 Private Link 进行安全连接。
如何防止 SQL Server 暴力破解攻击?
防止 SQL Server 暴力破解攻击的方法:1) 实施强密码策略;2) 限制登录尝试次数;3) 启用登录审核;4) 使用登录触发器,检测并阻止异常登录尝试;5) 限制允许登录的 IP 地址;6) 考虑使用多因素认证。
如何监控 SQL Server 连接活动?
监控 SQL Server 连接活动的方法:1) 使用动态管理视图(如 sys.dm_exec_connections);2) 配置 SQL Server Profiler 跟踪登录/注销事件;3) 使用 Extended Events 监控连接活动;4) 启用 SQL Server 审计;5) 使用 PowerShell 脚本定期检查连接数;6) 配置 Azure Monitor(对于 Azure SQL 数据库)。
不同 SQL Server 版本支持哪些 TLS 版本?
SQL Server 版本对 TLS 版本的支持:SQL Server 2008/2008 R2 支持 SSL 3.0 和 TLS 1.0;SQL Server 2012 支持 TLS 1.0、1.1,从 SP3 开始支持 TLS 1.2;SQL Server 2014 及以上版本支持 TLS 1.0、1.1、1.2;SQL Server 2017 及以上版本预览支持 TLS 1.3;SQL Server 2022 默认仅启用 TLS 1.2 和 1.3。
