Skip to content

SQLServer 安全参数配置与最佳实践

概述

SQL Server 安全配置是数据库运维的核心任务之一,直接关系到数据的安全性和合规性。合理配置安全参数可以有效防止未经授权的访问、数据泄露和恶意攻击。

本文将详细介绍 SQL Server 安全相关参数的配置和最佳实践,包括身份验证、授权、加密、审计和网络安全等方面,兼顾不同版本的差异,提供实际生产场景的配置建议和示例。

身份验证与授权参数

server authentication

参数说明:指定 SQL Server 实例使用的身份验证模式,决定了用户如何登录到 SQL Server。

默认值

  • 所有版本:Windows 身份验证模式 (1)

版本差异

  • 所有版本都支持两种身份验证模式
  • SQL Server 2019+:增强了混合模式下的密码安全策略

生产场景配置建议

  1. 优先使用 Windows 身份验证模式
    • 利用 Windows 安全机制,提供更强的安全性
    • 支持 Windows 组管理,便于权限集中管理
    • 无需在 SQL Server 中存储密码
  2. 仅在必要时使用混合模式
    • 当需要支持非 Windows 认证用户时
    • 当应用程序不支持 Windows 身份验证时
  3. 混合模式下的安全措施
    • 启用强密码策略
    • 禁用或重命名 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. 始终保持开启 (1):强制实施强密码策略
  2. 密码复杂度要求
    • 密码长度至少 12 位
    • 包含大小写字母、数字和特殊字符
    • 不使用常见密码或字典单词
  3. 定期审查:确保所有 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. 建议开启 (1):定期更换密码,降低密码泄露风险
  2. 密码过期时间
    • 普通用户:建议 90 天
    • 管理员账户:建议 30-60 天
    • 服务账户:考虑关闭密码过期,但必须使用强密码并定期手动更换
  3. 例外情况
    • 用于自动化脚本的服务账户
    • 无法手动干预的系统账户

配置命令

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)

版本差异

  • 所有版本都支持此参数

生产场景配置建议

  1. 建议保持关闭 (0):减少安全风险
  2. 如需使用,建议在数据库级别开启:避免实例级别的安全风险
  3. 严格控制:仅在必要的数据库间启用跨数据库所有权链

配置命令

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. 仅在需要使用包含数据库时开启 (1)
    • 数据库需要频繁迁移时
    • 数据库作为独立单元部署时
  2. 安全措施
    • 确保包含数据库使用强密码策略
    • 限制包含数据库的权限
    • 定期审查包含数据库的用户

配置命令

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. 建议开启 (1):保护数据传输安全
  2. 证书要求
    • 使用受信任的 SSL/TLS 证书
    • 证书必须包含服务器的 FQDN
    • 定期更新证书
  3. 客户端配置
    • 确保客户端支持相应的 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. 仅在需要远程管理时开启 (1)
  2. 安全措施
    • 使用防火墙限制允许连接的 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+:默认关闭,提高安全性

生产场景配置建议

  1. 建议关闭 (0):减少安全风险
  2. 如需使用,严格控制
    • 仅在必要时开启
    • 限制可调用的存储过程
    • 审查远程存储过程的权限

配置命令

sql
-- 关闭远程访问
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'remote access', 0;
RECONFIGURE;

审计与合规参数

default trace enabled

参数说明:启用默认跟踪,记录数据库的重要事件,便于审计和故障排查。

默认值

  • 所有版本:1 (ON)

版本差异

  • 所有版本都支持此参数

生产场景配置建议

  1. 建议保持开启 (1):便于审计和故障排查
  2. 事件类型:记录登录创建/删除、权限变更、数据库创建/删除等重要事件
  3. 性能影响:性能开销较小,通常可以忽略

配置命令

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 审计模式

生产场景配置建议

  1. 不建议开启:C2 审计模式会产生大量审计日志,影响性能
  2. 替代方案:使用 SQL Server 审计或扩展事件
  3. 仅在特定合规要求下开启
    • 确保有足够的存储空间
    • 定期归档审计日志

配置命令

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. 仅在需要符合通用标准时开启 (1)
  2. 影响
    • 启用多项安全增强功能
    • 可能影响某些功能的可用性
    • 增加系统开销
  3. 建议:在测试环境充分测试后再在生产环境启用

配置命令

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 的安全性

生产场景配置建议

  1. 仅在需要使用 CLR 功能时开启 (1)
  2. 安全措施
    • 使用 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. 建议保持开启 (1):提高 CLR 安全性
  2. 程序集签名要求
    • 所有 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)

版本差异

  • 所有版本都支持此参数

生产场景配置建议

  1. 除非必要,建议保持关闭 (0):减少安全风险
  2. 如需使用,严格控制
    • 通过代理账户控制权限
    • 使用完成后及时关闭
    • 监控 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';

安全最佳实践

身份验证与授权

  1. 优先使用 Windows 身份验证:利用 Windows 安全机制,提高安全性
  2. 实施最小权限原则:只为用户和应用程序授予完成工作所需的最小权限
  3. 使用角色管理权限:通过服务器角色和数据库角色管理权限,便于集中管理
  4. 定期审查权限:至少每季度审查一次用户权限,移除不再需要的权限
  5. 禁用或重命名 sa 账户:减少针对 sa 账户的攻击风险

密码策略

  1. 启用强密码策略:始终启用密码复杂度和密码过期策略
  2. 使用复杂密码:密码长度至少 12 位,包含大小写字母、数字和特殊字符
  3. 定期更换密码:普通用户每 90 天更换一次,管理员账户每 30-60 天更换一次
  4. 限制登录尝试次数:通过 Windows 本地安全策略设置账户锁定策略

加密与网络安全

  1. 启用传输加密:使用 SSL/TLS 加密所有数据库连接
  2. 限制网络访问:通过防火墙限制对 SQL Server 端口的访问
  3. 禁用不必要的协议:只启用必要的网络协议(如 TCP/IP)
  4. 使用非默认端口:考虑使用非默认端口(1433),减少端口扫描攻击

审计与监控

  1. 启用审计功能:使用 SQL Server 审计或扩展事件记录重要安全事件
  2. 监控登录活动:监控失败的登录尝试,及时发现暴力破解攻击
  3. 定期审查审计日志:至少每周审查一次审计日志,及时发现异常活动
  4. 使用默认跟踪:保持默认跟踪开启,便于故障排查和审计

系统配置

  1. 关闭不必要的功能:关闭不使用的功能和服务,减少攻击面
  2. 及时安装安全补丁:定期安装 SQL Server 安全补丁和累积更新
  3. 使用最新的 SQL Server 版本:最新版本通常包含更多安全增强功能
  4. 定期备份系统数据库:确保 master、msdb 和 model 数据库的安全

版本差异汇总

参数名称SQL Server 2012SQL Server 2016SQL Server 2019SQL 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 的身份验证模式?

:可以通过以下方法查看:

  1. 使用 T-SQL 查询

    sql
    SELECT 
        CASE SERVERPROPERTY('IsIntegratedSecurityOnly')
            WHEN 1 THEN 'Windows 身份验证模式'
            WHEN 0 THEN '混合身份验证模式'
        END AS AuthenticationMode;
  2. 使用 SQL Server 配置管理器

    • 打开 SQL Server 配置管理器
    • 右键点击 SQL Server 实例 → "属性" → "安全性" 标签
    • 查看 "服务器身份验证" 选项
  3. 查询注册表

    • 路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[InstanceName]\MSSQLServer\LoginMode
    • 值:1 = Windows 身份验证模式,2 = 混合身份验证模式

如何启用 SQL Server 的强密码策略?

:启用强密码策略的步骤:

  1. 确保 Windows 本地安全策略已配置

    • 打开 "本地安全策略" → "账户策略" → "密码策略"
    • 配置密码必须符合复杂性要求、密码长度最小值等
  2. 为 SQL 登录启用密码策略

    sql
    -- 创建登录时启用
    CREATE LOGIN [NewUser] WITH PASSWORD = 'StrongP@ssw0rd', CHECK_POLICY = ON;
    
    -- 修改现有登录
    ALTER LOGIN [ExistingUser] WITH CHECK_POLICY = ON;
  3. 批量启用密码策略

    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 存在以下安全风险:

  1. 权限提升风险:如果被恶意利用,可能导致权限提升
  2. 命令执行风险:允许执行任意操作系统命令,可能导致系统被入侵
  3. 信息泄露风险:可能泄露系统信息
  4. 违反最小权限原则:授予了过多的权限

安全使用建议

  • 仅在必要时启用
  • 通过代理账户控制权限
  • 使用完成后及时关闭
  • 监控 xp_cmdshell 的使用情况

如何保护 SQL Server 免受常见攻击?

:保护 SQL Server 免受常见攻击的方法:

  1. 使用强身份验证:优先使用 Windows 身份验证,启用强密码策略
  2. 实施最小权限原则:只为用户授予必要的最小权限
  3. 启用加密:使用 SSL/TLS 加密数据传输,启用透明数据加密 (TDE) 保护数据文件
  4. 限制网络访问:通过防火墙限制对 SQL Server 端口的访问
  5. 及时安装补丁:定期安装 SQL Server 安全补丁和累积更新
  6. 启用审计和监控:使用 SQL Server 审计或扩展事件记录安全事件
  7. 关闭不必要的功能:关闭不使用的功能和服务,减少攻击面
  8. 定期备份:确保数据库的安全备份,便于恢复
  9. 使用最新的 SQL Server 版本:最新版本通常包含更多安全增强功能
  10. 定期安全审计:定期进行安全审计,及时发现和修复安全漏洞

如何监控 SQL Server 的安全事件?

:监控 SQL Server 安全事件的方法:

  1. 使用 SQL Server 审计:创建服务器审计和数据库审计,记录重要安全事件
  2. 使用扩展事件:创建扩展事件会话,捕获特定的安全事件
  3. 使用默认跟踪:保持默认跟踪开启,记录基本的安全事件
  4. 使用 Windows 事件查看器:查看应用程序日志和安全日志中的 SQL Server 相关事件
  5. 使用第三方监控工具:如 SolarWinds Database Performance Monitor、Redgate SQL Monitor 等
  6. 监控登录活动:定期查看失败的登录尝试,及时发现暴力破解攻击
  7. 监控权限变更:监控服务器角色和数据库角色的成员变更

总结

SQL Server 安全参数配置是数据库运维的重要组成部分,直接关系到数据的安全性和合规性。通过合理配置安全参数,可以有效防止未经授权的访问、数据泄露和恶意攻击。

本文详细介绍了 SQL Server 安全相关参数的配置和最佳实践,包括身份验证与授权、加密与网络安全、审计与合规、CLR 与扩展存储过程等方面。每个部分都包含了详细的版本差异、生产场景配置建议、实际示例和最佳实践,帮助 DBA 更好地配置和管理 SQL Server 安全。

在实际生产环境中,DBA 应该根据业务需求和合规要求,结合本文提供的最佳实践,制定适合自己环境的安全配置策略,并定期审查和更新,确保 SQL Server 环境的安全性。