外观
SQLServer 安全参数配置与最佳实践
概述
SQL Server 安全配置是数据库运维的核心任务之一,直接关系到数据的安全性和合规性。合理配置安全参数可以有效防止未经授权的访问、数据泄露和恶意攻击。
本文将详细介绍 SQL Server 安全相关参数的配置和最佳实践,包括身份验证、授权、加密、审计和网络安全等方面,兼顾不同版本的差异,提供实际生产场景的配置建议和示例。
身份验证与授权参数
server authentication
参数说明:指定 SQL Server 实例使用的身份验证模式,决定了用户如何登录到 SQL Server。
默认值:
- 所有版本:Windows 身份验证模式 (1)
版本差异:
- 所有版本都支持两种身份验证模式
- SQL Server 2019+:增强了混合模式下的密码安全策略
生产场景配置建议:
- 优先使用 Windows 身份验证模式:
- 利用 Windows 安全机制,提供更强的安全性
- 支持 Windows 组管理,便于权限集中管理
- 无需在 SQL Server 中存储密码
- 仅在必要时使用混合模式:
- 当需要支持非 Windows 认证用户时
- 当应用程序不支持 Windows 身份验证时
- 混合模式下的安全措施:
- 启用强密码策略
- 禁用或重命名 sa 账户
- 限制 sa 账户的使用
配置方法:
sql
-- 使用 SQL Server 配置管理器(推荐)
-- 1. 打开 SQL Server 配置管理器
-- 2. 展开 "SQL Server 网络配置" → 选择 "MSSQLSERVER 的协议"
-- 3. 右键点击 "TCP/IP" → "属性" → "IP 地址" 标签
-- 4. 配置 IP 地址和端口
-- 使用 T-SQL 无法直接修改身份验证模式,需要通过注册表或配置管理器验证命令:
sql
-- 查看当前身份验证模式
SELECT
CASE SERVERPROPERTY('IsIntegratedSecurityOnly')
WHEN 1 THEN 'Windows 身份验证模式'
WHEN 0 THEN '混合身份验证模式'
END AS AuthenticationMode;enforce password policy
参数说明:指定 SQL Server 是否强制实施 Windows 密码策略,包括密码复杂度、密码过期和账户锁定。
默认值:
- 所有版本:1 (ON)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 始终保持开启 (1):强制实施强密码策略
- 密码复杂度要求:
- 密码长度至少 12 位
- 包含大小写字母、数字和特殊字符
- 不使用常见密码或字典单词
- 定期审查:确保所有 SQL Server 登录都启用了密码策略
配置命令:
sql
-- 创建登录时启用密码策略
CREATE LOGIN [DBUser] WITH PASSWORD = 'StrongP@ssw0rd2023', CHECK_POLICY = ON;
-- 修改现有登录启用密码策略
ALTER LOGIN [DBUser] WITH CHECK_POLICY = ON;
-- 批量检查所有登录的密码策略状态
SELECT
name AS LoginName,
CASE is_policy_checked
WHEN 1 THEN '已启用'
WHEN 0 THEN '已禁用'
END AS PasswordPolicyStatus,
CASE is_expiration_checked
WHEN 1 THEN '已启用'
WHEN 0 THEN '已禁用'
END AS PasswordExpirationStatus
FROM sys.sql_logins;enforce password expiration
参数说明:指定 SQL Server 是否强制实施密码过期策略,决定了密码的有效期。
默认值:
- 所有版本:1 (ON)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 建议开启 (1):定期更换密码,降低密码泄露风险
- 密码过期时间:
- 普通用户:建议 90 天
- 管理员账户:建议 30-60 天
- 服务账户:考虑关闭密码过期,但必须使用强密码并定期手动更换
- 例外情况:
- 用于自动化脚本的服务账户
- 无法手动干预的系统账户
配置命令:
sql
-- 创建登录时启用密码过期
CREATE LOGIN [ServiceUser] WITH PASSWORD = 'ServiceP@ssw0rd', CHECK_POLICY = ON, CHECK_EXPIRATION = OFF;
-- 修改现有登录禁用密码过期
ALTER LOGIN [ServiceUser] WITH CHECK_EXPIRATION = OFF;cross db ownership chaining
参数说明:允许跨数据库所有权链,简化数据库间的权限管理,但可能引入安全风险。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 建议保持关闭 (0):减少安全风险
- 如需使用,建议在数据库级别开启:避免实例级别的安全风险
- 严格控制:仅在必要的数据库间启用跨数据库所有权链
配置命令:
sql
-- 实例级别(不推荐)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'cross db ownership chaining', 0;
RECONFIGURE;
-- 数据库级别(推荐)
ALTER DATABASE [DB1] SET DB_CHAINING ON;
ALTER DATABASE [DB2] SET DB_CHAINING ON;contained database authentication
参数说明:启用包含数据库身份验证,允许数据库包含自己的用户,简化数据库迁移。
默认值:
- 所有版本:0 (OFF)
版本差异:
- SQL Server 2012+:支持包含数据库
- SQL Server 2016+:增强了包含数据库的安全性
生产场景配置建议:
- 仅在需要使用包含数据库时开启 (1):
- 数据库需要频繁迁移时
- 数据库作为独立单元部署时
- 安全措施:
- 确保包含数据库使用强密码策略
- 限制包含数据库的权限
- 定期审查包含数据库的用户
配置命令:
sql
-- 启用包含数据库身份验证
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'contained database authentication', 1;
RECONFIGURE;
-- 创建包含数据库
CREATE DATABASE [ContainedDB] CONTAINMENT = PARTIAL;
-- 在包含数据库中创建用户
USE [ContainedDB];
CREATE USER [ContainedUser] WITH PASSWORD = 'ContainedP@ssw0rd';加密与网络安全参数
force encryption
参数说明:指定 SQL Server 是否强制所有客户端连接使用 SSL/TLS 加密,保护数据传输安全。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
- SQL Server 2016+:默认支持 TLS 1.2
- SQL Server 2022+:默认支持 TLS 1.3
生产场景配置建议:
- 建议开启 (1):保护数据传输安全
- 证书要求:
- 使用受信任的 SSL/TLS 证书
- 证书必须包含服务器的 FQDN
- 定期更新证书
- 客户端配置:
- 确保客户端支持相应的 TLS 版本
- 配置客户端强制加密(可选)
配置方法:
sql
-- 使用 SQL Server 配置管理器
-- 1. 打开 SQL Server 配置管理器
-- 2. 展开 "SQL Server 网络配置" → 选择 "MSSQLSERVER 的协议"
-- 3. 右键点击 "属性" → "证书" 标签 → 选择证书
-- 4. 切换到 "标志" 标签 → 将 "强制加密" 设置为 "是"
-- 5. 重启 SQL Server 服务验证命令:
sql
-- 查看是否启用了强制加密
SELECT
name,
value,
value_in_use
FROM sys.configurations
WHERE name = 'force encryption';remote admin connections
参数说明:允许远程管理员连接到 SQL Server 实例,用于远程管理。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 仅在需要远程管理时开启 (1)
- 安全措施:
- 使用防火墙限制允许连接的 IP 地址
- 结合 VPN 使用
- 限制远程连接的用户权限
- 定期审查远程连接日志
配置命令:
sql
-- 启用远程管理员连接
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'remote admin connections', 1;
RECONFIGURE;
-- 查看当前配置
EXEC sp_configure 'remote admin connections';remote access
参数说明:允许远程存储过程调用,用于跨服务器的存储过程执行。
默认值:
- SQL Server 2016 及以下:1 (ON)
- SQL Server 2017 及以上:0 (OFF)
版本差异:
- SQL Server 2017+:默认关闭,提高安全性
生产场景配置建议:
- 建议关闭 (0):减少安全风险
- 如需使用,严格控制:
- 仅在必要时开启
- 限制可调用的存储过程
- 审查远程存储过程的权限
配置命令:
sql
-- 关闭远程访问
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'remote access', 0;
RECONFIGURE;审计与合规参数
default trace enabled
参数说明:启用默认跟踪,记录数据库的重要事件,便于审计和故障排查。
默认值:
- 所有版本:1 (ON)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 建议保持开启 (1):便于审计和故障排查
- 事件类型:记录登录创建/删除、权限变更、数据库创建/删除等重要事件
- 性能影响:性能开销较小,通常可以忽略
配置命令:
sql
-- 启用默认跟踪
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'default trace enabled', 1;
RECONFIGURE;
-- 查看默认跟踪文件路径
SELECT
path
FROM sys.traces
WHERE is_default = 1;c2 audit mode
参数说明:启用 C2 审计模式,记录所有数据库活动,用于合规要求。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
- SQL Server 2016+:建议使用 SQL Server 审计代替 C2 审计模式
生产场景配置建议:
- 不建议开启:C2 审计模式会产生大量审计日志,影响性能
- 替代方案:使用 SQL Server 审计或扩展事件
- 仅在特定合规要求下开启:
- 确保有足够的存储空间
- 定期归档审计日志
配置命令:
sql
-- 关闭 C2 审计模式
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'c2 audit mode', 0;
RECONFIGURE;common criteria compliance enabled
参数说明:启用通用标准合规模式,提高 SQL Server 的安全性,用于满足特定合规要求。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 仅在需要符合通用标准时开启 (1)
- 影响:
- 启用多项安全增强功能
- 可能影响某些功能的可用性
- 增加系统开销
- 建议:在测试环境充分测试后再在生产环境启用
配置命令:
sql
-- 关闭通用标准合规模式
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'common criteria compliance enabled', 0;
RECONFIGURE;CLR 与扩展存储过程参数
clr enabled
参数说明:启用 Common Language Runtime (CLR) 集成,允许在 SQL Server 中运行 .NET 代码。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
- SQL Server 2017+:引入了 clr strict security 参数,增强了 CLR 的安全性
生产场景配置建议:
- 仅在需要使用 CLR 功能时开启 (1)
- 安全措施:
- 使用 SAFE 权限集,避免使用 EXTERNAL_ACCESS 或 UNSAFE
- 所有 CLR 程序集必须签名
- 定期审查 CLR 程序集
配置命令:
sql
-- 启用 CLR 集成
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;clr strict security
参数说明:启用 CLR 严格安全性,要求所有 CLR 程序集必须签名,增强 CLR 安全性。
默认值:
- SQL Server 2017 及以上:1 (ON)
- SQL Server 2016 及以下:不支持
版本差异:
- SQL Server 2017+:默认启用,增强了 CLR 安全性
- 早期版本:不支持,需要手动管理 CLR 程序集的安全性
生产场景配置建议:
- 建议保持开启 (1):提高 CLR 安全性
- 程序集签名要求:
- 所有 CLR 程序集必须使用证书或非对称密钥签名
- 避免使用 TRUSTWORTHY 数据库属性绕过签名要求
配置命令:
sql
-- 启用 CLR 严格安全性(默认)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr strict security', 1;
RECONFIGURE;xp_cmdshell
参数说明:启用 xp_cmdshell 扩展存储过程,允许执行操作系统命令,存在较大安全风险。
默认值:
- 所有版本:0 (OFF)
版本差异:
- 所有版本都支持此参数
生产场景配置建议:
- 除非必要,建议保持关闭 (0):减少安全风险
- 如需使用,严格控制:
- 通过代理账户控制权限
- 使用完成后及时关闭
- 监控 xp_cmdshell 的使用情况
配置命令:
sql
-- 启用 xp_cmdshell(仅在必要时)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
-- 配置代理账户
EXEC sp_xp_cmdshell_proxy_account 'Domain\ProxyUser', 'StrongP@ssw0rd';
-- 查看代理账户配置
EXEC xp_sqlagent_proxy_account N'GET';安全最佳实践
身份验证与授权
- 优先使用 Windows 身份验证:利用 Windows 安全机制,提高安全性
- 实施最小权限原则:只为用户和应用程序授予完成工作所需的最小权限
- 使用角色管理权限:通过服务器角色和数据库角色管理权限,便于集中管理
- 定期审查权限:至少每季度审查一次用户权限,移除不再需要的权限
- 禁用或重命名 sa 账户:减少针对 sa 账户的攻击风险
密码策略
- 启用强密码策略:始终启用密码复杂度和密码过期策略
- 使用复杂密码:密码长度至少 12 位,包含大小写字母、数字和特殊字符
- 定期更换密码:普通用户每 90 天更换一次,管理员账户每 30-60 天更换一次
- 限制登录尝试次数:通过 Windows 本地安全策略设置账户锁定策略
加密与网络安全
- 启用传输加密:使用 SSL/TLS 加密所有数据库连接
- 限制网络访问:通过防火墙限制对 SQL Server 端口的访问
- 禁用不必要的协议:只启用必要的网络协议(如 TCP/IP)
- 使用非默认端口:考虑使用非默认端口(1433),减少端口扫描攻击
审计与监控
- 启用审计功能:使用 SQL Server 审计或扩展事件记录重要安全事件
- 监控登录活动:监控失败的登录尝试,及时发现暴力破解攻击
- 定期审查审计日志:至少每周审查一次审计日志,及时发现异常活动
- 使用默认跟踪:保持默认跟踪开启,便于故障排查和审计
系统配置
- 关闭不必要的功能:关闭不使用的功能和服务,减少攻击面
- 及时安装安全补丁:定期安装 SQL Server 安全补丁和累积更新
- 使用最新的 SQL Server 版本:最新版本通常包含更多安全增强功能
- 定期备份系统数据库:确保 master、msdb 和 model 数据库的安全
版本差异汇总
| 参数名称 | SQL Server 2012 | SQL Server 2016 | SQL Server 2019 | SQL Server 2022 |
|---|---|---|---|---|
| clr enabled | 默认 OFF | 默认 OFF | 默认 OFF | 默认 OFF |
| clr strict security | 不支持 | 不支持 | 支持(默认 ON) | 支持(默认 ON) |
| contained database authentication | 支持 | 支持 | 支持 | 支持 |
| default trace enabled | 默认 ON | 默认 ON | 默认 ON | 默认 ON |
| force encryption | 默认 OFF | 默认 OFF | 默认 OFF | 默认 OFF |
| remote access | 默认 ON | 默认 ON | 默认 OFF | 默认 OFF |
| remote admin connections | 默认 OFF | 默认 OFF | 默认 OFF | 默认 OFF |
| server authentication | 支持两种模式 | 支持两种模式 | 支持两种模式 | 支持两种模式 |
| xp_cmdshell | 默认 OFF | 默认 OFF | 默认 OFF | 默认 OFF |
常用安全配置脚本
检查所有安全相关参数配置
sql
-- 检查所有安全相关参数
SELECT
name,
value,
value_in_use,
description
FROM sys.configurations
WHERE name IN (
'clr enabled',
'clr strict security',
'contained database authentication',
'cross db ownership chaining',
'c2 audit mode',
'common criteria compliance enabled',
'default trace enabled',
'force encryption',
'remote access',
'remote admin connections',
'xp_cmdshell'
)
ORDER BY name;检查所有 SQL 登录的密码策略状态
sql
-- 检查所有 SQL 登录的密码策略状态
SELECT
name AS LoginName,
create_date,
modify_date,
CASE is_policy_checked
WHEN 1 THEN '已启用'
WHEN 0 THEN '已禁用'
END AS PasswordPolicyStatus,
CASE is_expiration_checked
WHEN 1 THEN '已启用'
WHEN 0 THEN '已禁用'
END AS PasswordExpirationStatus,
CASE is_disabled
WHEN 1 THEN '已禁用'
WHEN 0 THEN '已启用'
END AS LoginStatus
FROM sys.sql_logins
ORDER BY name;启用 SQL Server 审计
sql
-- 创建服务器审计
CREATE SERVER AUDIT [SecurityAudit]
TO FILE
( FILEPATH = N'D:\AuditLogs\' , MAXSIZE = 1024 MB , MAX_ROLLOVER_FILES = 10 , RESERVE_DISK_SPACE = OFF )
WITH ( QUEUE_DELAY = 1000 , ON_FAILURE = CONTINUE );
GO
-- 启用服务器审计
ALTER SERVER AUDIT [SecurityAudit] WITH (STATE = ON);
GO
-- 创建服务器审计规范
CREATE SERVER AUDIT SPECIFICATION [ServerAuditSpec]
FOR SERVER AUDIT [SecurityAudit]
ADD (FAILED_LOGIN_GROUP),
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP)
WITH (STATE = ON);
GO监控 xp_cmdshell 使用情况
sql
-- 查看 xp_cmdshell 的使用情况
SELECT
e.event_time,
s.session_id,
s.login_name,
s.host_name,
s.program_name,
e.statement
FROM sys.event_log e
JOIN sys.dm_exec_sessions s ON e.session_id = s.session_id
WHERE e.event_id = 152 -- xp_cmdshell 事件
ORDER BY e.event_time DESC;常见问题 (FAQ)
如何查看当前 SQL Server 的身份验证模式?
答:可以通过以下方法查看:
使用 T-SQL 查询:
sqlSELECT CASE SERVERPROPERTY('IsIntegratedSecurityOnly') WHEN 1 THEN 'Windows 身份验证模式' WHEN 0 THEN '混合身份验证模式' END AS AuthenticationMode;使用 SQL Server 配置管理器:
- 打开 SQL Server 配置管理器
- 右键点击 SQL Server 实例 → "属性" → "安全性" 标签
- 查看 "服务器身份验证" 选项
查询注册表:
- 路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[InstanceName]\MSSQLServer\LoginMode - 值:1 = Windows 身份验证模式,2 = 混合身份验证模式
- 路径:
如何启用 SQL Server 的强密码策略?
答:启用强密码策略的步骤:
确保 Windows 本地安全策略已配置:
- 打开 "本地安全策略" → "账户策略" → "密码策略"
- 配置密码必须符合复杂性要求、密码长度最小值等
为 SQL 登录启用密码策略:
sql-- 创建登录时启用 CREATE LOGIN [NewUser] WITH PASSWORD = 'StrongP@ssw0rd', CHECK_POLICY = ON; -- 修改现有登录 ALTER LOGIN [ExistingUser] WITH CHECK_POLICY = ON;批量启用密码策略:
sql-- 为所有 SQL 登录启用密码策略 DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'ALTER LOGIN [' + name + '] WITH CHECK_POLICY = ON;' + CHAR(13) FROM sys.sql_logins WHERE is_policy_checked = 0 AND name <> 'sa'; EXEC sp_executesql @sql;
为什么不建议启用 xp_cmdshell?
答:xp_cmdshell 存在以下安全风险:
- 权限提升风险:如果被恶意利用,可能导致权限提升
- 命令执行风险:允许执行任意操作系统命令,可能导致系统被入侵
- 信息泄露风险:可能泄露系统信息
- 违反最小权限原则:授予了过多的权限
安全使用建议:
- 仅在必要时启用
- 通过代理账户控制权限
- 使用完成后及时关闭
- 监控 xp_cmdshell 的使用情况
如何保护 SQL Server 免受常见攻击?
答:保护 SQL Server 免受常见攻击的方法:
- 使用强身份验证:优先使用 Windows 身份验证,启用强密码策略
- 实施最小权限原则:只为用户授予必要的最小权限
- 启用加密:使用 SSL/TLS 加密数据传输,启用透明数据加密 (TDE) 保护数据文件
- 限制网络访问:通过防火墙限制对 SQL Server 端口的访问
- 及时安装补丁:定期安装 SQL Server 安全补丁和累积更新
- 启用审计和监控:使用 SQL Server 审计或扩展事件记录安全事件
- 关闭不必要的功能:关闭不使用的功能和服务,减少攻击面
- 定期备份:确保数据库的安全备份,便于恢复
- 使用最新的 SQL Server 版本:最新版本通常包含更多安全增强功能
- 定期安全审计:定期进行安全审计,及时发现和修复安全漏洞
如何监控 SQL Server 的安全事件?
答:监控 SQL Server 安全事件的方法:
- 使用 SQL Server 审计:创建服务器审计和数据库审计,记录重要安全事件
- 使用扩展事件:创建扩展事件会话,捕获特定的安全事件
- 使用默认跟踪:保持默认跟踪开启,记录基本的安全事件
- 使用 Windows 事件查看器:查看应用程序日志和安全日志中的 SQL Server 相关事件
- 使用第三方监控工具:如 SolarWinds Database Performance Monitor、Redgate SQL Monitor 等
- 监控登录活动:定期查看失败的登录尝试,及时发现暴力破解攻击
- 监控权限变更:监控服务器角色和数据库角色的成员变更
总结
SQL Server 安全参数配置是数据库运维的重要组成部分,直接关系到数据的安全性和合规性。通过合理配置安全参数,可以有效防止未经授权的访问、数据泄露和恶意攻击。
本文详细介绍了 SQL Server 安全相关参数的配置和最佳实践,包括身份验证与授权、加密与网络安全、审计与合规、CLR 与扩展存储过程等方面。每个部分都包含了详细的版本差异、生产场景配置建议、实际示例和最佳实践,帮助 DBA 更好地配置和管理 SQL Server 安全。
在实际生产环境中,DBA 应该根据业务需求和合规要求,结合本文提供的最佳实践,制定适合自己环境的安全配置策略,并定期审查和更新,确保 SQL Server 环境的安全性。
