Skip to content

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 配置管理器配置

  1. 打开 SQL Server 配置管理器
  2. 展开 "SQL Server 网络配置"
  3. 右键点击 "XXX 的协议",选择 "属性"
  4. 切换到 "证书" 选项卡,选择要使用的证书
  5. 切换到 "标志" 选项卡,设置 "强制加密" 为 "是"
  6. 重启 SQL Server 服务

验证 SSL/TLS 连接

使用 SSMS 验证

  1. 连接到 SQL Server
  2. 右键点击服务器,选择 "属性"
  3. 查看 "连接" 选项卡中的 "已加密连接" 状态

使用 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

允许命名实例动态端口

  1. 查看命名实例使用的动态端口:
    sql
    SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID;
  2. 为该端口创建防火墙规则

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 --reload

Azure 网络安全组 (NSG)

创建 NSG 规则

  1. 在 Azure 门户中创建网络安全组
  2. 添加入站规则:
    • 源:允许的 IP 范围
    • 目标端口:1433
    • 协议:TCP
    • 动作:允许
  3. 将 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 配置管理器

  1. 打开 SQL Server 配置管理器
  2. 展开 "SQL Server 网络配置"
  3. 点击 "XXX 的协议"
  4. 在右侧面板中启用/禁用所需的协议

推荐配置

  • 生产环境:仅启用 TCP/IP
  • 开发环境:可启用 TCP/IP 和 Shared Memory
  • 禁用 Named Pipes(除非必要)

TCP/IP 配置

配置 TCP/IP 协议

  1. 打开 SQL Server 配置管理器
  2. 右键点击 TCP/IP,选择 "属性"
  3. 切换到 "IP 地址" 选项卡
  4. 配置 IP 地址和端口设置
  5. 重启 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。