本地 云
下载PDF
此功能适用于 EventLog Analyzer 和 Log360

# SQL Server

最后更新于：2025年9月12日

本页内容

- 概述
- 预定义规则

## 概述

SQL Server作为安全数据库平台设计，但依赖默认设置可能存在安全漏洞。其安全功能需单独配置以确保强效防护。由于组织数据是关键资产，安全措施不足的数据库常成为攻击首要目标。

本文概述了 SQL Server 安全最佳实践和基本注意事项，以帮助保护您的数据库免受未经授权的访问、篡改和其他恶意活动的影响。

## 预定义规则

以下是用于评估 SQL Server 配置并识别潜在安全风险的关键预定义规则：

- 临时分布式查询
- CLR 程序集函数
- 跨数据库所有权链
- 数据库邮件存储过程
- OLE自动化过程
- 远程访问
- 远程管理连接
- 扫描启动过程
- 可信赖数据库属性
- SQL Mail XPs
- 标准端口
- 隐藏实例
- 禁用 SA 登录
- 重命名 SA 登录
- XP 命令行
- 自动关闭
- 限制 SA 登录
- CLR严格安全性
- 身份验证模式
- Guest Connect 权限
- 孤立用户
- 包含数据库身份验证
- 公共默认权限
- 内置组作为登录名
- 本地组作为登录名
- 公共角色的代理访问权限
- 检查密码过期
- 检查密码策略
- 错误日志文件数量
- 默认跟踪
- 登录审核
- SQL Server 审核
- CLR程序集权限
- 对称密钥加密算法
- 非对称密钥大小

### 1. 临时分布式查询

#### 描述：

确保服务器配置选项"临时分布式查询"设置为"0"

#### 漏洞说明：

启用即席分布式查询允许用户查询外部数据源并执行语句。此功能可被用于远程访问并利用远程SQL Server实例的漏洞，以及运行不安全的Visual Basic for Applications函数。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'0'。

建议：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE;

EXECUTE sp_configure 'Ad Hoc Distributed Queries', 0; RECONFIGURE;

GO

EXECUTE sp_configure 'show advanced options', 0; RECONFIGURE;

### 2. CLR程序集函数

#### 描述：

确保服务器配置选项"启用CLR"设置为"0"

#### 漏洞说明：

启用 CLR 选项决定用户程序集能否由 SQL Server 运行。启用 CLR 程序集将扩大 SQL Server 的攻击面，使其面临来自意外程序集和恶意程序集的双重风险。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

若"clr严格安全"选项设置为0，则应禁用此功能。请注意该选项仅在SQL Server 2017及更高版本中可用。 若clr严格安全设置为1，则此建议不适用。默认情况下，clr严格安全处于启用状态，并将SAFE和EXTERNAL_ACCESS程序集视为标记为UNSAFE。虽然不推荐，但为保持向后兼容性可禁用clr严格安全选项。检查'clr严格安全'状态请执行以下T-SQL命令：

SELECT name, CAST(value as int) as value_configured, CAST(value_in_use as int) as value_in_use FROM sys.configurations WHERE name = 'clr strict security';

#### 建议：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'clr enabled', 0; RECONFIGURE;

### 3. 跨数据库所有权链

#### 描述：

确保服务器配置选项'跨数据库所有权链'设置为'0'

#### 漏洞：

此选项允许数据库中db_owner角色的成员访问其他数据库中登录名拥有的对象，导致不必要的信息泄露。 跨数据库所有权链功能应仅在特定数据库中启用，而非通过ALTER DATABASESET DB_CHAINING ON命令在实例级别为所有数据库统一启用。此数据库选项不可在master、model或tempdb系统数据库中修改。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'0'。

#### 建议操作：

执行以下 T-SQL 命令：

EXECUTE sp_configure 'cross db ownership chaining', 0; RECONFIGURE; GO

### 4. 数据库邮件扩展程序

#### 说明：

确保服务器配置选项'数据库邮件XPs'设置为'0'

#### 漏洞说明：

该选项控制SQL Server生成和传输电子邮件的能力。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

该配置应设置为'0'。禁用数据库邮件XPs选项可缩小SQL Server攻击面，消除拒绝服务攻击途径，并切断从数据库服务器向远程主机窃取数据的通道。

#### 建议：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE; EXECUTE sp_configure 'Database Mail XPs', 0; RECONFIGURE; GO EXECUTE sp_configure 'show advanced options', 0; RECONFIGURE;

### 5. OLE自动化存储过程

#### 描述：

确保服务器配置选项"OLE自动化过程"设置为"0"

#### 漏洞说明：

此选项控制是否允许在Transact-SQL批处理中实例化OLE自动化对象。这些扩展存储过程使SQL Server用户能够执行SQL Server外部的函数。启用该选项将扩大SQL Server的攻击面，允许用户在SQL Server的安全上下文中执行函数。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

该配置应设置为'0'。

#### 建议操作：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE; EXECUTE sp_configure 'Ole Automation Procedures', 0; RECONFIGURE;

GO

EXECUTE sp_configure 'show advanced options', 0; RECONFIGURE;

### 6. 远程访问

#### 说明：

确保服务器配置选项'远程访问'设置为'0'

#### 漏洞说明：

"远程访问"选项控制在远程服务器上执行本地存储过程或在本地服务器上执行远程存储过程。此功能可能被滥用，通过将查询处理卸载至目标服务器来发起拒绝服务（DoS）攻击。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

该配置应设置为'0'。

#### 建议操作：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE;EXECUTE sp_configure 'remote access', 0; RECONFIGURE;

GO

执行 sp_configure '显示高级选项', 0; 重新配置;

注意：重启SQL Server服务。

### 7. 远程管理连接

#### 说明：

确保服务器配置选项“远程管理连接”设置为“0”

#### 漏洞说明：

此选项控制远程计算机上的客户端应用程序是否可使用专用管理连接（DAC）。DAC允许管理员访问正在运行的服务器，执行诊断功能或Transact-SQL语句，或在服务器锁定、运行异常且未响应SQL Server数据库引擎连接时排查问题。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

在群集场景中，管理员可能并未实际登录当前托管 SQL Server 实例的节点，因此被视为"远程"。因此，对于 SQL Server 故障转移群集，此设置通常应启用（1）；否则应禁用（0）。

#### 建议操作：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'remote admin connections', 0; RECONFIGURE;

GO

### 8. 扫描启动过程

#### 说明：

确保服务器配置选项'扫描启动过程'设置为'0'

#### 漏洞说明：

若启用此选项，SQL Server 将扫描并自动运行所有设置为服务启动时执行的存储过程。将该选项设为 0 可防止某些审计跟踪及其他常用监控存储过程在启动时重新运行。此外，复制功能需要此设置处于启用状态（值为 1），并在必要时会自动更改该设置。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'0'。

#### 推荐操作：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE;EXECUTE sp_configure 'scan for startup procs', 0; RECONFIGURE;

GO

EXECUTE sp_configure 'show advanced options', 0; RECONFIGURE;

注意：重启SQL Server服务。

### 9. 可信数据库属性

#### 描述：

确保“可信”数据库属性设置为“关闭”

#### 漏洞说明：

TRUSTWORTHY数据库选项允许数据库对象在特定情况下访问其他数据库中的对象。可防范恶意CLR程序集或扩展存储过程。

#### 可能值：

- 启用或 'ON'
- 禁用或 'OFF'

#### 最佳实践：

除需保持启用的msdb数据库外，此配置应设置为'0'。

#### 建议操作：

对启用此属性的数据库执行以下T-SQL命令：

ALTER DATABASE [<database_name>] SET TRUSTWORTHY OFF;

### 10. SQL Mail XPs

#### 说明：

确保服务器配置选项'SQL Mail XPs'设置为'0'

#### 漏洞说明：

SQL Mail 提供了一种机制，可在 SQL Server 2008 R2 或更早版本中使用 SQL Server 发送、接收、删除和处理电子邮件。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'0'。

#### 建议操作：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE;EXECUTE sp_configure 'SQL Mail XPs', 0; RECONFIGURE;

GO

执行 sp_configure '显示高级选项', 0; 重新配置;

### 11. 标准端口

#### 说明：

使用默认端口（1433）会使服务器易受针对默认端口的攻击。

#### 漏洞：

启用临时分布式查询功能后，用户可对外部数据源执行数据查询和语句操作。此功能可被用于远程访问SQL Server实例并利用其漏洞，以及运行不安全的Visual Basic for Applications函数。

#### 可能值：

服务器上任何可用端口。

#### 最佳实践：

端口号可设置为除默认值1433以外的任意值。

#### 建议：

使用图形界面，

- 打开SQL Server 配置管理器
- 在控制台窗格中，展开SQL Server 网络配置，展开<实例名称> 的协议，然后双击TCP/IP 协议。
- 在TCP/IP 属性对话框的 IP 地址选项卡中，将显示多个 IP 地址，格式为 IP1、IP2，直至 IPAll。其中一个地址对应环回适配器的 IP 地址 127.0.0.1。计算机上的每个 IP 地址都会显示额外的 IP 地址。
- 在IPAll 下执行以下操作之一：
  - 将TCP端口字段中的1433修改为非标准端口。
  - 或保持TCP端口字段为空，并将TCP动态端口设置为0以启用动态端口分配。
- 单击“确定”保存更改。
- 在控制台窗格中，单击SQL Server 服务。
- 在详细信息窗格中，右键单击SQL Server (<实例名称>)，选择“重新启动”以停止并重新启动 SQL Server。

注意：当更改SQL服务器端口时，需重新配置所有通过端口号与SQL服务器通信的应用程序的连接设置。

#### 在事件日志分析器中重新配置SQL服务器端口的步骤：

- 关闭产品。
- 打开<EventLog Analyzer Home>\conf\database_params.conf
- 将现有端口号修改为所需端口号。
- 重启事件日志分析器以使更改生效。

### 12. 隐藏实例

#### 说明：

确保生产环境SQL Server实例的"隐藏实例"选项设置为"是"

#### 漏洞说明：

生产环境中的非集群SQL Server实例应设置为隐藏状态，以防止SQL Server浏览器服务进行广播。但选择此选项可能导致集群实例故障。若隐藏集群命名实例，集群服务可能无法连接到SQL Server。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为"1"。

#### 建议：

通过图形界面操作：

- 打开SQL Server 配置管理器
- 展开 SQL Server 网络配置，右键单击 <实例名称> 的协议，然后选择属性
- 在标志选项卡中，若在隐藏实例框中选择是，则符合规范。

或执行以下 T-SQL 命令：

EXEC master.sys.xp_instance_regwrite @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SuperSocketNetLib', @value_name = N'HideInstance', @type = N'REG_DWORD', @value = 1;

注意

- 重新启动 SQL Server 服务。
- 启用“隐藏实例”后，使用SQL浏览器服务发现SQL Server实例的应用程序将无法自动发现该实例。应暂时禁用“隐藏实例”功能，或使用端口号连接SQL Server实例。

### 13. 禁用 SA 登录账户

#### 说明：

确保将'SA'登录账户设置为'禁用'状态

#### 漏洞说明：

SA账户是广为人知且常用的SQL Server账户，具有sysadmin权限。该账户在安装时创建，始终具有principal_id=1和sid=0x01属性。实施此控制可降低攻击者对已知主体执行暴力攻击的概率。

#### 可能值：

- 已启用
- 禁用

#### 最佳实践：

在应用程序或脚本中硬编码使用sa账户并非良好的安全实践。但若已存在此类情况，禁用sa账户将导致相关脚本和应用程序无法对数据库服务器进行身份验证，从而无法执行所需任务或功能。

#### 建议操作：

运行以下 T-SQL 命令：

使用 [master]

GO

DECLARE @tsql nvarchar(max)SET @tsql = 'ALTER LOGIN ' + SUSER_NAME(0x01) + ' DISABLE'EXEC (@tsql)

GO

注意：在修改 SA 登录时，需将使用 SA 登录验证 SQL Server 连接的应用程序重新配置为使用其他用户。

### 14. 重命名 SA 登录名

#### 说明：

确保已重命名'SA'登录账户

#### 漏洞：

若攻击者知晓sa登录名，将更易发起密码猜测和暴力破解攻击。

#### 可能值：

符合Microsoft SQL登录名限制规则的任意字符组合

#### 最佳实践：

应重命名 SA 登录名。

#### 建议操作：

执行以下 T-SQL 命令：

ALTER LOGIN SA WITH NAME = <不同用户名>;

注意：在修改 SA 登录名期间，使用 SA 登录名验证 SQL Server 连接的应用程序需要重新配置为使用其他用户。

### 15. XP CMDSHELL

#### 描述：

确保服务器配置选项'xp_cmdshell'设置为'0'

#### 漏洞说明：

该选项控制经过身份验证的SQL Server用户是否可使用xp_cmdshell扩展存储过程执行操作系统命令行指令，并将结果以SQL客户端行数据形式返回。攻击者常利用此过程读取或写入数据库服务器底层操作系统的数据。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'0'。

#### 建议操作：

执行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE; EXECUTE sp_configure 'xp_cmdshell', 0; RECONFIGURE;

GO

EXECUTE sp_configure 'show advanced options', 0; RECONFIGURE;

### 16. 自动关闭

#### 说明：

确保包含数据库中的 'AUTO_CLOSE' 设置为 'OFF'

#### 漏洞说明：

AUTO_CLOSE 决定连接终止后数据库是否自动关闭。若启用该功能，后续连接该数据库时需重新打开数据库并重建相关存储过程缓存。

#### 可能值：

- 启用或 'ON'
- 禁用或 'OFF'

#### 最佳实践：

此配置应设置为'OFF'。

#### 建议操作：

对于此配置为'OFF'的数据库，请执行以下T-SQL命令：

ALTER DATABASE <database_name> SET AUTO_CLOSE OFF;

### 17. 限制 SA 登录

#### 描述：

确保不存在名为'sa'的登录账户

#### 漏洞说明：

SA登录名（如主体）是广为人知且常用的SQL Server账户。因此，即使原始SA登录名（主体ID=1）已被重命名，也不应存在名为SA的登录名。

#### 可能值：

登录名可采用符合Microsoft SQL登录名规范的任意字符组合。

#### 最佳实践：

任何登录名均不得命名为'sa'。

#### 建议：

对名称为'sa'的登录名执行以下T-SQL命令：

使用 [master]

GO

ALTER LOGIN [sa] WITH NAME = <不同名称>;

GO

注意：使用修改后登录名验证SQL Server连接的应用程序，需由具有同等权限的其他用户重新配置。

### 18. CLR严格安全性

#### 描述：

确保服务器配置选项'clr strict security'设置为'1'

#### 漏洞说明：

该选项决定SQL Server 2017及2019中引擎是否对程序集应用PERMISSION_SET权限集。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'1'。

#### 建议：

运行以下 T-SQL 命令：

EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE;EXECUTE sp_configure 'clr strict security', 1; RECONFIGURE;

GO

EXECUTE sp_configure 'show advanced options', 0; RECONFIGURE;

### 19. 身份验证模式

#### 说明：

确保“服务器身份验证”属性设置为“Windows身份验证模式”

#### 漏洞说明：

Windows 提供的身份验证机制比 SQL Server 身份验证更强大。

#### 可能值：

- SQL Server 身份验证
- Windows 身份验证
- 混合身份验证

#### 最佳实践：

此配置应设置为“Windows身份验证模式”。

#### 建议：

使用图形界面，

- 打开SQL Server Management Studio。
- 打开“对象资源管理器”选项卡，连接到目标 SQL Server 实例。
- 右键单击实例名称并选择“属性”。
- 从左侧菜单中选择“安全性”页面。
- 将服务器身份验证设置为Windows 身份验证模式。

或执行以下 T-SQL 命令：

USE [master]

GO

EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 1

GO

注意：重启SQL Server服务。

### 20. 访客连接权限

#### 说明：

确保在除 master、msdb 和 tempdb 之外的所有 SQL Server 数据库中撤销 'guest' 用户的 CONNECT 权限

#### 漏洞说明：

当登录账户可访问SQL Server但无法通过自身账户访问数据库，且该数据库存在guest用户账户时，该登录账户将采用guest用户的身份。撤销guest用户的CONNECT权限可确保登录账户在未获明确授权的情况下无法访问数据库信息。

#### 可能值：

guest用户可能拥有或不拥有CONNECT权限。

#### 最佳实践：

除master、msdb和tempdb数据库外，必须撤销所有数据库中guest用户的CONNECT权限。

#### 建议操作：

对启用了访客连接权限的数据库执行以下 T-SQL 命令：

USE <数据库名称>;

GO

撤销 guest 的连接权限，并级联撤销；

### 21. 孤立用户

#### 描述：

确保从SQL Server数据库中删除'孤立用户'

#### 漏洞说明：

若数据库用户对应的SQL Server登录名在服务器实例上未定义或定义错误，该用户将无法登录实例，此类用户称为孤立用户，应予以删除。为避免此类损坏用户被滥用，必须清除孤立用户。

#### 可能值：

数据库可能存在孤立用户，也可能不存在

#### 最佳实践：

数据库服务器中不得存在孤立用户。

#### 建议操作：

对所有孤立用户运行以下 T-SQL 命令：

USE <数据库名称>;

GO

删除用户 <用户名>;

注意：若条件允许，可对孤立用户进行故障排除。更多详情请参阅Microsoft Learn。

### 22. 包含数据库身份验证

#### 描述：

确保包含数据库中未使用 SQL 身份验证

#### 漏洞：

包含数据库对SQL身份验证用户不强制执行密码复杂度规则。缺乏强制性密码策略可能增加包含数据库中建立弱凭据的风险。

#### 可能值：

- SQL Server 身份验证
- Windows 身份验证
- 混合身份验证

#### 最佳实践：

此配置应设置为“Windows身份验证模式”。

#### 建议：

在包含数据库中使用Windows身份验证用户。

注意 ：更多详情请参阅 Microsoft Learn。

如需删除登录名，请使用以下 T-SQL 命令：

USE <数据库名>

GO

删除用户 <用户名>;

注意 ：使用已删除登录名验证SQL服务器的应用程序需 重新配置其他登录名。

### 23. 公共默认权限

#### 描述：

确保仅向公共服务器角色授予 Microsoft 指定的默认权限

#### 漏洞说明：

"public"是包含所有登录名的特殊固定服务器角色。与其他固定服务器角色不同，其权限可被修改。遵循最小权限原则，不应使用公共服务器角色在服务器范围内授予权限，因这些权限将被所有用户继承。 每个SQL Server登录账户均属于公共角色且无法移出该角色。因此，授予此角色的任何权限将对所有登录账户生效，除非已明确拒绝特定登录账户或用户定义的服务器角色。当从公共服务器角色撤销多余权限时，除非将权限明确授予需要访问权限的登录账户或包含这些登录账户的用户定义服务器角色，否则访问权限可能丢失。

#### 可能值：

公共角色可被授予任意数量的权限。

#### 最佳实践：

不得向公共角色授予任何多余权限，若已授予则应予以撤销，必要时可委派给用户定义的角色。

#### 建议：

将结果中发现的多余权限添加至需要访问权限的用户自定义服务器角色的特定登录名。

针对发现的权限执行以下 T-SQL 命令：

USE [master]

GO

撤销 <权限名称> FROM public;

GO

注意：对于公共角色，允许授予"查看任何数据库"和"连接"权限。

### 24. 内置组作为登录名

#### 说明：

确保Windows内置组不作为SQL登录名

#### 漏洞说明：

内置组（如Administrators、Everyone、Authenticated Users、Guests等）通常包含大量成员，这不符合仅向必要用户授予SQL Server实例访问权限的最佳实践。此类组不应用于SQL Server数据库引擎实例的任何访问级别。

#### 可能值：

任何组（无论是内置组还是用户自定义组）均可作为SQL登录用户。

#### 最佳实践：

必须从SQL登录中移除Windows内置组。注意：删除内置组登录前，请确保已添加具有等效权限的替代AD组或Windows登录。否则SQL Server实例可能完全无法访问。

#### 建议：

通过图形界面操作：

- 打开计算机管理。
- 点击本地用户和组。如有必要，创建一个仅包含所需用户账户的限制性AD组。
- 打开SQL Server Management Studio→ 连接到数据库 → 在左侧窗格选择新建登录名→ 将 AD 组或单个 Windows 账户添加为 SQL Server 登录名并授予所需权限。
- 使用以下语法删除 BUILTIN 登录名（替换 <名称>）：

USE [master]

GO

DROP LOGIN [<名称>]

GO

### 25. 本地组作为登录名

#### 说明：

确保Windows本地组不作为SQL登录账户

#### 漏洞说明：

不应将本地 Windows 组用作 SQL Server 实例的登录账户。允许本地 Windows 组作为 SQL 登录账户会形成安全漏洞：任何拥有操作系统管理员权限（但无 SQL Server 权限）的用户均可向本地 Windows 组添加成员，从而为自己或他人获取 SQL Server 实例访问权限。

#### 可能值：

任何 Windows 组均可作为 SQL 登录名。

#### 最佳实践：

必须从SQL登录中移除Windows本地组。请注意，在删除本地组登录前，务必确保已添加具有等效权限的替代AD组或Windows登录。否则SQL Server实例可能完全无法访问。

#### 建议：

通过图形界面操作：

- 打开计算机管理。
- 单击本地用户和组。如有必要，创建一个仅包含所需用户账户的限制性AD组。
- 打开SQL Server Management Studio→连接到数据库→ 在左侧窗格选择新建登录名→ 将 AD 组或单个 Windows 账户添加为 SQL Server 登录名并授予所需权限。
- 使用以下语法删除本地组名称登录，替换<名称>后执行：

USE [master]

GO

DROP LOGIN [<名称>]

GO

### 26. 公共角色的代理访问权限

#### 说明：

确保msdb数据库中的public角色未被授予SQL代理代理访问权限

#### 漏洞说明：

若向公共角色授予SQL代理访问权限，将允许所有用户使用该代理（可能具有高权限），这可能违反最小权限原则。

#### 可能值：

public角色可能访问任意数量的代理。

#### 最佳实践：

撤销公共角色的所有代理访问权限。在撤销代理的公共角色权限前，请确保已添加具有同等权限的替代登录账号或适当的用户自定义数据库角色。否则，依赖此访问权限的SQL Agent作业步骤将失败。

#### 建议：

通过图形界面操作：

- 打开SQL Server Management Studio→ 连接到数据库 → 选择服务器 SQL 代理→ 选择目标代理 → 右键单击并选择属性→ 添加需要访问权限的特定安全主体。
- 或使用 sp_grant_login_to_proxy T-SQL 命令。

  注意

  ：

  更多详情请参阅Microsoft Learn。

- 使用以下 T-SQL 命令撤销公共角色对 <代理名称> 的访问权限：

USE [msdb]

GO

EXEC dbo.sp_revoke_login_from_proxy @name = N'public', @proxy_name = N'<代理名称>';

GO

### 27. 检查密码过期设置

#### 说明：

确保系统管理员角色内所有SQL身份验证登录的'CHECK_EXPIRATION'选项设置为'ON'

#### 漏洞说明：

启用后，将Windows系统中的密码过期策略应用于SQL Server内部使用的密码。否则，当前使用的密码可能存在强度不足的问题。

#### 可能值：

- 启用或 'ON'
- 禁用或 'OFF'

#### 最佳实践：

该选项应设置为'ON'。对于无法遵循仅使用Windows身份验证登录建议的系统，此为缓解风险的推荐措施。

#### 建议操作：

对于过期检查设置为'OFF'的登录名，请执行以下T-SQL命令：

ALTER LOGIN [<登录名>] WITH CHECK_EXPIRATION = ON;

### 28. 检查密码策略

#### 说明：

确保所有SQL身份验证登录的'CHECK_POLICY'选项设置为'ON'

#### 漏洞：

启用后，将Windows系统中的密码复杂度策略应用于SQL Server内部使用的密码。否则，当前使用的密码可能存在强度不足的问题。

#### 可能值：

- 启用或 'ON'
- 禁用或 'OFF'

#### 最佳实践：

该选项应设置为'ON'。此设置仅在密码变更时生效，不会强制修改现有弱密码。因此需手动修改现有密码。

#### 建议操作：

对于策略检查设置为'OFF'的登录名，请执行以下T-SQL命令：

ALTER LOGIN [<登录名>] WITH CHECK_POLICY = ON;

### 29. 错误日志文件数量

#### 说明：

确保'最大错误日志文件数'设置为大于或等于'12'

#### 漏洞说明：

SQL Server 错误日志文件必须防止丢失。日志文件在被覆盖前必须进行备份。保留更多错误日志有助于防止因备份前频繁回收导致的数据丢失。

#### 可能值：

所有正数值

#### 最佳实践：

该选项应设置为大于或等于12。

#### 建议：

使用图形用户界面，

- 打开SQL Server Management Studio。
- 打开对象资源管理器并连接到目标实例。
- 导航至对象资源管理器中的“管理”选项卡并展开。右键单击 SQL Server 日志文件并选择 “配置”。
- 确认“限制错误日志文件在回收前的数量”复选框已勾选。
- 确认“错误日志文件最大数量”设置为12或更大值。

或执行以下T-SQL命令（替换<NumberGreaterThanOrEqualTo12>）：

EXEC master.sys.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, <NumberGreaterThanOrEqualTo12>;

### 30. 默认跟踪

#### 描述：

确保服务器配置选项'默认跟踪启用'设置为'1'

#### 漏洞：

默认跟踪提供数据库活动的审计日志记录，包括账户创建、权限提升和DBCC命令执行。

#### 可能值：

- 启用或 '1'
- 禁用或 '0'

#### 最佳实践：

此配置应设置为'1'。

#### 建议操作：

运行以下 T-SQL 命令：

执行 sp_configure 'show advanced options', 1; RECONFIGURE; 执行 sp_configure 'default trace enabled', 1; RECONFIGURE;

GO

执行 sp_configure '显示高级选项', 0; 重新配置;

### 31. 登录审核

#### 描述：

确保“登录审核”设置为“登录失败”

#### 漏洞说明：

此设置将把SQL Server登录的失败身份验证尝试记录到SQL Server错误日志中。捕获失败登录可提供关键信息，用于检测或确认密码猜测攻击。捕获成功登录尝试可在取证调查中用于确认服务器访问记录，但若使用此审核级别设置同时捕获成功登录，将导致SQL Server错误日志产生过多冗余信息，阻碍DBA排查问题。

#### 可能值：

- 无
- 失败
- 成功
- 同时失败和成功

#### 最佳实践：

此配置应设置为'失败'。

#### 建议：

通过图形界面操作：

- 打开SQL Server Management Studio。
- 右键单击目标实例，选择“属性”，然后转到“安全性”选项卡。
- 在登录审核部分下选择仅失败登录选项，然后单击确定。

或执行以下T-SQL命令：

EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel', REG_DWORD, 2

注意：重启SQL Server服务。

### 32. SQL Server 审核

#### 漏洞：

SQL Server 审核功能可捕获失败和成功的登录操作，并将记录写入以下三处之一：应用程序事件日志、安全事件日志或文件系统。通过使用审核功能替代传统安全选项卡设置来捕获成功登录，可减少 ERRORLOG 日志中的冗余信息。

#### 可能值：

服务器中可能存在任意数量的审核策略，其审核操作类型包括AUDIT_CHANGE_GROUP、FAILED_LOGIN_GROUP和SUCCESSFUL_LOGIN_GROUP。

#### 最佳实践：

必须至少创建/存在一个包含以下审核名称的服务器审核规范：

- AUDIT_CHANGE_GROUP
- FAILED_LOGIN_GROUP
- SUCCESSFUL_LOGIN_GROUP

#### 建议：

使用图形用户界面，

- 打开SQL Server Management Studio。
- 在对象资源管理器中展开 SQL Server。
- 展开“安全性”文件夹。
- 右键单击“审核”文件夹， 选择“新建审核”。
- 为服务器审核指定名称。
- 指定审核目标详细信息，然后单击 “确定”保存服务器审核。
- 右键单击服务器审核规范，选择 新建服务器审核规范。
- 为服务器审核规范命名。
- 在“审核”下拉菜单中选择已创建的服务器审核。
- 单击“审核操作类型”下的下拉菜单，选择“AUDIT_CHANGE_GROUP”。
- 单击新出现的“审核操作类型”下拉菜单，选择“FAILED_LOGIN_GROUP”。
- 单击 “审核操作类型 ”下的新下拉菜单 ， 选择SUCCESSFUL_LOGIN_GROUP。
- 单击“确定”保存服务器审核规范。
- 右键单击新建的服务器审核规范， 选择启用服务器审核规范。
- 右键单击新服务器审核，选择启用服务器审核。

或者，运行以下 T-SQL 命令，将 <Enter audit name here> 和 <Enter audit spec name here> 替换为实际名称：

USE master

GO

CREATE SERVER AUDIT <在此处输入审核名称> TO APPLICATION_LOG;

GO

CREATE SERVER AUDIT SPECIFICATION <在此处输入审核规范名称> FOR SERVER AUDIT <在此处输入审核名称> ADD (FAILED_LOGIN_GROUP), ADD (SUCCESSFUL_LOGIN_GROUP), ADD (AUDIT_CHANGE_GROUP), ADD (SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP), ADD (FAILED_DATABASE_AUTHENTICATION_GROUP) WITH (STATE = ON);

GO

ALTER SERVER AUDIT <在此处输入审核名称> WITH (STATE = ON);

GO

### 33. CLR程序集权限

#### 描述：

确保所有 CLR 程序集的 'CLR 程序集权限集' 设置为 'SAFE_ACCESS'

#### 漏洞说明：

将 CLR 程序集权限集设置为 SAFE_ACCESS 可防止程序集访问外部系统资源（如文件、网络、环境变量或注册表）。具有 EXTERNAL_ACCESS 或 UNSAFE 权限集的程序集可能被用于访问操作系统的敏感区域，窃取和/或传输数据，并改变底层 Windows 操作系统的状态及其他保护措施。

#### 可能值：

- 安全访问
- 外部访问
- UNSAFE

#### 最佳实践：

除微软创建的程序集（is_user_defined = 0）外，所有CLR程序集均应设置为'SAFE_ACCESS'权限集。此类程序集因涉及系统整体功能而豁免检查。实施修复措施前，应在测试环境中验证程序集在SAFE权限设置下仍能正常运行。

#### 建议：

执行以下 T-SQL 命令：

USE <数据库名>;

GO

ALTER ASSEMBLY <程序集名称> WITH PERMISSION_SET = SAFE;

### 对称密钥加密算法

#### 说明：

确保非系统数据库中的'对称密钥加密算法'设置为'AES_128'或更高版本

#### 漏洞说明：

根据微软最佳实践，对称密钥加密算法应仅使用SQL Server的AES算法选项：AES_128、AES_192和AES_256。以下算法（SQL Server所指）被视为弱加密或已弃用，不应再在SQL Server中使用：DES、DESX、RC2、RC4、RC4_128。

#### 可能值：

- DES
- 三重DES
- 三重DES三密钥
- RC2
- RC4
- 128位RC4
- DESX
- 128位AES
- 192 位 AES
- 256位AES

#### 最佳实践：

数据库中所有对称密钥必须采用'AES_128'或更高版本加密算法。

#### 建议：

注意：请参阅Microsoft Learn了解如何修改对称密钥。

如需删除对称密钥，请使用以下 T-SQL 命令：

使用 <数据库名称>

GO

删除对称密钥 <密钥名称>;

### 35. 非对称密钥大小

#### 说明：

确保非系统数据库中的非对称密钥大小设置为'大于或等于2048'

#### 漏洞说明：

微软最佳实践建议为非对称密钥使用至少2048位加密算法。SQL Server中RSA_2048加密算法提供最高位级别的非对称密钥保护，因此是当前最安全的选择。

#### 可能值：

- 512 位
- 1024 位
- 2048 位

#### 最佳实践：

非对称密钥大小应设置为大于或等于2048位。

#### 建议：

注意：请参阅Microsoft Learn了解有关修改非对称密钥的更多信息。

如需删除非对称密钥，请使用以下 T-SQL 命令：

使用 <数据库名称>

GO

删除非对称密钥 <密钥名称>;

另请参阅

本节详细说明SQL Server的预定义规则，包括描述、默认值、漏洞、最佳实践及建议。更多信息请参阅：

- Active Directory