欢迎光临殡葬白事网
详情描述

这是一份非常全面和专业的 SQL Server 安全配置检查清单与优化方案。它从外部到内部,从架构到细节,系统地涵盖了安全加固的各个方面。

SQL Server 安全配置全面检查与优化方案

一、 核心思想与原则 最小权限原则:任何账户、服务、进程都只拥有完成其功能所必需的最小权限。 纵深防御:不依赖单一安全措施,在网络、主机、实例、数据库等多个层面建立防御。 定期审计与更新:安全是持续的过程,需定期检查、更新和审计。 业务影响评估:任何变更前,评估对现有应用和业务的影响,并在测试环境先行验证。 二、 检查清单与优化措施 A. 基础设施与网络安全

网络隔离与防火墙

  • 检查:SQL Server 是否部署在独立的服务器或 VLAN 中?是否配置了主机和网络防火墙?
  • 优化
    • 将 SQL Server 置于内网,禁止直接暴露在互联网。
    • 在 Windows 防火墙中,仅开放 SQL Server 实际使用的端口(默认 1433,或自定义端口)。建议更改默认端口
    • 限制访问源 IP 地址,只允许应用服务器、管理终端等特定 IP 连接。

服务与端口

  • 检查:是否禁用了不需要的 SQL Server 服务(如 SQL Server Browser 服务)?是否使用了非默认端口?
  • 优化
    • 在单实例环境中,禁用 SQL Server Browser 服务
    • 更改默认的 1433 端口,减少自动化扫描攻击。
    • 禁用或限制对 SQL Server 配置管理器 中不使用的协议(如 Named Pipes, VIA)。
B. 实例级安全

身份验证模式

  • 检查:使用何种身份验证模式?
  • 优化
    • 强制使用“Windows 身份验证模式”。这是最安全的方式,利用 Active Directory 的账户和策略管理。
    • 如果必须使用“混合模式”(SQL Server 身份验证):
      • 确保 sa 账户已重命名禁用,或设置一个极其复杂的密码并妥善保管。
      • 对所有 SQL 登录名启用“强制密码策略”(密码复杂性、过期等)。

服务账户

  • 检查:SQL Server 和 SQL Agent 服务以什么账户运行?
  • 优化
    • 使用最低权限的独立域账户或虚拟账户(如 NT SERVICE\MSSQLSERVER),切勿使用 Local System 或 Administrator。
    • 确保该账户仅拥有对 SQL Server 安装目录、数据文件目录的必需权限。

实例级权限

  • 检查:哪些登录名拥有 sysadminserveradminsecurityadmin 等高权限服务器角色?
  • 优化
    • 审查并清理不必要的 sysadmin 成员。sysadmin 应仅限于极少数受信任的管理员。
    • 使用更细粒度的服务器角色(如 processadmin, diskadmin)替代 sysadmin
    • 定期执行以下查询进行审计:
      SELECT pr.[name], pr.[type_desc], pr.is_disabled
      FROM sys.server_principals pr
      JOIN sys.server_role_members rm ON pr.principal_id = rm.member_principal_id
      JOIN sys.server_principals role ON role.principal_id = rm.role_principal_id
      WHERE role.[name] IN ('sysadmin', 'securityadmin', 'serveradmin')
      ORDER BY role.[name], pr.[name];

安全功能配置

  • 检查
    • xp_cmdshell 是否启用?
    • OLE Automation Procedures 是否启用?
    • CLR Integration 是否启用?
    • Remote Access 是否启用?
    • Cross DB Ownership Chaining 是否启用?
  • 优化
    • 默认禁用所有以上功能。除非业务明确需要,否则保持禁用。需要时按需、临时启用,用完即关。
    • 查询当前状态:
      EXEC sp_configure 'show advanced options', 1;
      RECONFIGURE;
      SELECT name, value_in_use FROM sys.configurations
      WHERE name IN (
          'xp_cmdshell',
          'Ole Automation Procedures',
          'clr enabled',
          'remote access',
          'cross db ownership chaining'
      );
C. 数据库级安全

数据库用户与角色

  • 检查:数据库用户是否直接映射到高权限登录名(如 sa)?是否滥用 db_owner 角色?
  • 优化
    • 为每个应用或用户组创建独立的、权限最小的数据库用户。
    • 使用数据库角色管理权限。将权限授予角色,再将用户加入角色。避免直接将权限授予用户。
    • 审查 db_ownerdb_securityadmin 成员,确保其必要性。
    • 实现用户架构分离:为不同对象组创建不同的架构,并将权限授予架构级别。

数据加密

  • 检查
    • 是否启用 TDE 保护静态数据?
    • 敏感列是否使用 Always Encrypted
    • 备份文件是否加密?
    • SSL/TLS 是否用于传输加密?
  • 优化
    • TDE:对生产数据库启用透明数据加密,保护数据文件(.mdf, .ldf)和备份文件。务必备份证书和私钥!
    • Always Encrypted:对高度敏感信息(如身份证号、信用卡号)使用此技术,确保在客户端加密,数据库端只能看到密文。
    • 备份加密:使用 SQL Server 备份加密功能。
    • 传输加密:配置 SSL/TLS 证书,强制所有连接使用加密通道。

数据脱敏与审计

  • 检查:是否有审计或监控敏感数据的访问?
  • 优化
    • SQL Server Audit:启用并配置服务器审计和数据库审计规范,跟踪关键操作(如登录失败、权限更改、数据查询/修改)。
    • 动态数据掩码:对开发、测试或报表用户屏蔽敏感数据的真实内容(如只显示身份证后四位)。
    • 行级安全性:基于用户特征(如部门、地区)限制其能访问的数据行。
D. 维护与监控

补丁与更新

  • 检查:SQL Server 实例版本和累计更新版本是什么?
  • 优化
    • 订阅 Microsoft 安全公告。
    • 建立流程,定期在测试环境验证并应用最新的 Service Pack累计更新,重点关注安全更新。

漏洞评估与合规

  • 检查:是否定期进行安全扫描?
  • 优化
    • 使用 Microsoft Defender for CloudSQL Vulnerability Assessment 工具定期扫描实例,识别配置偏差、漏洞和最佳实践偏离。
    • 使用 SQL Server 配置管理器 中的“外围应用配置器”工具禁用不必要功能。

备份与灾难恢复安全

  • 检查:备份文件存储是否安全?恢复流程是否包含安全验证?
  • 优化
    • 备份文件应存储在访问受控的位置,与数据库文件分离。
    • 对备份文件应用加密和访问控制列表。
    • 定期测试恢复流程,确保恢复后的环境同样安全。
三、 实施流程建议 评估:使用上述清单对现有环境进行全面评估,生成差异报告。 规划
  • 制定变更计划,按风险等级和业务影响排序。
  • 准备回滚方案。
  • 通知相关干系人(应用团队、业务部门)。
测试:在非生产环境(开发/测试/UAT)中实施所有变更,并进行充分的功能和性能测试。 实施
  • 在维护窗口内,在生产环境分步实施。
  • 每次变更后,立即验证核心业务应用连接和功能。
监控与审计
  • 变更后,加强监控(错误日志、性能计数器、审计日志)。
  • 建立定期(如每季度)安全审查机制。
四、 关键脚本示例

1. 查找弱密码或未启用策略的 SQL 登录名:

SELECT name, is_policy_checked, is_expiration_checked
FROM sys.sql_logins
WHERE is_policy_checked = 0 OR is_expiration_checked = 0;

2. 查找具有 sysadmin 权限的登录名:

SELECT name FROM sys.server_principals
WHERE IS_SRVROLEMEMBER('sysadmin', name) = 1
AND type IN ('S', 'U') -- SQL and Windows logins
ORDER BY name;

3. 检查数据库中的用户及其角色:

SELECT dp.name AS UserName, USER_NAME(drm.role_principal_id) AS RoleName
FROM sys.database_principals dp
LEFT JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id
WHERE dp.type IN ('S', 'U') -- SQL and Windows users
AND dp.name NOT IN ('dbo', 'guest', 'sys', 'INFORMATION_SCHEMA')
ORDER BY dp.name;

总结

SQL Server 安全是一个系统性的工程,需要将严格的配置、精细的权限管理、数据加密、持续的监控和定期的更新结合起来。本方案提供了一个从外到内的加固框架,务必在实施前进行完整的测试,并根据您组织的具体安全策略和合规要求(如等保2.0、GDPR、PCI-DSS)进行调整。

最重要的第一步:启用强身份验证、禁用不必要的功能、收紧 sysadmin 权限,并开启基础审计。