通过


SQL Server审核(数据库引擎)

applies to:SQL ServerAzure SQL 托管实例

审计 SQL Server 数据库引擎或单个数据库的实例涉及监测和记录在数据库引擎上发生的事件。 SQL Server审核允许你创建服务器审核,其中包含服务器级别事件的服务器审核规范,以及数据库级别事件的数据库审核规范。 可将审核的事件写入事件日志或审核文件。

SQL Server有多个级别的审核,具体取决于安装的政府或标准要求。 SQL Server审核提供了必须在各种服务器和数据库对象上启用、存储和查看审核的工具和过程。

您可以记录每个实例的服务器审核操作组,或记录每个数据库的数据库审核操作组或数据库审核操作。 在每次遇到可审核操作时,都将发生审核事件。

本文适用于SQL Server和Azure SQL 托管实例。

SQL Server审核组件

“审核”是将若干元素组合到一个包中,用于执行一组特定服务器操作或数据库操作。 SQL Server 审计组件结合在一起生成称为审计的输出,就像报表定义与图形和数据元素结合生成报表一样。

SQL Server审核使用 Extended Events 来帮助创建审核。 有关扩展事件的详细信息,请参阅 扩展事件概述

SQL Server审核

SQL Server Audit 对象收集要监视的服务器或数据库级操作和操作组的单个实例。 审核位于SQL Server实例级别。 每个SQL Server实例可以进行多个审核任务。

定义审核时,将指定结果的输出位置。 这是审核的目标位置。 审核是在禁用状态下创建的,因此不会自动审核任何操作。 启用审核后,审计目的地将接收来自审核的数据。

服务器审核规范

“服务器审核规范”对象属于审核。 可以为每个审核创建一个服务器审核规范,因为两者都是在SQL Server实例范围内创建的。

服务器审核规范可收集许多由扩展事件功能引发的服务器级操作组。 您可以在服务器审核规范中包括“审核操作组” 。 审核操作组是预定义的操作组,它们是发生在数据库引擎中的基本事件。 这些操作将发送到审核,审核将它们记录到目标中。

SQL Server审核操作组和操作一文中介绍了服务器级审核操作组。

注意

由于性能约束,tempdb 和临时表未被审核。 虽然批处理已完成的操作组会捕获针对临时表的语句,但它可能无法正确填充对象名称。 但是,不断地审核源表,确保从源表到临时表的所有插入操作都会被记录。

数据库审核规范

Database Audit Specification 对象也属于SQL Server审核。 可以为每个审核的每个SQL Server数据库创建一个数据库审核规范。

数据库审核规范可收集由扩展事件功能引发的数据库级审核操作。 你可以向数据库审核规范添加审核操作组或审核事件。 审核事件是 SQL Server 引擎所能审核的最小单位操作。 “审核操作组”是预定义的操作组。 两者都处于 SQL Server 数据库的作用域范围内。 这些操作将发送到审核,审核将它们记录到目标中。 在用户数据库审核规范中不要包括服务器范围的对象,例如系统视图。

SQL Server审核操作组和操作一文中介绍了数据库级审核操作组和审核操作。

目标

审核的结果将发送到目标,可以是文件、Windows 安全中心事件日志或Windows应用程序事件日志。 必须定期查看和归档这些日志,以便确保目标具有足够的空间来写入更多记录。

重要

任何经过身份验证的用户都可以读取和写入Windows应用程序事件日志。 应用程序事件日志需要的权限低于Windows 安全中心事件日志,并且安全性低于Windows 安全中心事件日志。

写入Windows安全日志需要将SQL Server服务帐户添加到生成安全审核策略。 默认情况下,本地系统、本地服务和网络服务都是此策略的一部分。 此设置可通过使用安全策略管理单元 (secpol.msc) 配置。 此外,对于“成功” 和“失败” 均必须启用“审核对象访问” 安全策略。 此设置可通过使用安全策略管理单元 (secpol.msc) 配置。 在 Windows Vista 或 Windows Server 2008(及更高版本)中,可以使用审核策略计划()从命令行设置更精细的AuditPol.exe策略。 有关启用将 SQL Server 审核事件写入安全日志的步骤的详细信息,请参阅 将 SQL Server 审核事件写入安全日志。 有关 Auditpol.exe 程序的详细信息,请参阅知识库文章 921469 如何使用组策略配置详细的安全审核设置。 Windows事件日志是Windows操作系统的全局日志。 有关Windows事件日志的详细信息,请参阅 事件查看器 概述。 如果需要更精准地设置审核权限,请使用二进制文件目标。

将审核信息保存到某一文件时,为了帮助避免被篡改,可以通过以下方式限制对文件位置的访问:

  • SQL Server服务帐户必须同时具有读取和写入权限。

  • 审核管理员通常需要读取和写入权限。 审计管理员的 Windows 帐户被假定用于管理审计文件,诸如:将其复制到不同的共享,备份等。

  • 获得授权以读取审核文件的审核文件读取者必须具备读取权限。

即使数据库引擎写入文件,其他Windows用户可以读取审核文件(如果他们具有权限)。 数据库引擎不采用阻止读取操作的排他锁。

由于数据库引擎可以访问该文件,因此具有 CONTROL SERVER 权限的SQL Server登录名可以使用数据库引擎访问审核文件。 在 SQL Server 2022 (16.x) 及更高版本中,VIEW SERVER SECURITY AUDIT 权限足以使用 fn_get_audit_file 读取审核文件。 要记录任何正在读取审核文件的用户,请在 master.sys.fn_get_audit_file 中定义审核。 这会记录通过 SQL Server 访问审核文件的 CONTROL SERVER 权限的登录名。 权限 fn_get_audit_file 的详细信息,请参阅 sys.fn_get_audit_file

如果审核管理员将文件复制到其他位置(用于存档等),新位置的访问控制列表 ACL 应降至以下权限:

  • 审核管理员 - 读/写
  • 审核读取者 - 读取

建议从单独的SQL Server实例(如 SQL Server Express 实例)生成审核报告,只有审核管理员或审核读取者有权访问这些实例。 通过使用单独的数据库引擎实例进行报告,可以帮助防止未经授权的用户获取对审核记录的访问权限。

可以通过使用 Windows BitLocker 驱动器加密或Windows加密文件系统来加密审核文件存储的文件夹,从而防止未经授权的访问。

有关写入目标的审核记录的详细信息,请参阅SQL Server审核记录

使用SQL Server审核概述

可以使用SQL Server Management Studio或Transact-SQL来定义审核。 创建并启用审核后,审计目标将接收记录。

可以在 Windows 中使用 事件查看器 实用工具读取Windows事件日志。 对于文件目标,可以在 SQL Server Management Studio 中使用 Log File Viewerfn_get_audit_file 函数读取目标文件。

以下是创建和使用审核的一般过程。

  1. 创建审核并定义目标。
  2. 创建映射到审核的服务器审核规范或数据库审核规范。 启用审核规范。
  3. 启用审核。
  4. 使用 Windows 事件查看器Log 文件查看器fn_get_audit_file 函数读取审核事件。

有关详细信息,请参阅 “创建服务器审核和服务器审核规范 ”和 “创建服务器审核和数据库审核规范”。

注意事项

在审核启动期间发生故障时,服务器不会启动。 在这种情况下,可以使用命令行中的选项启动 -f 服务器。

当因指定审核ON_FAILURE = SHUTDOWN而导致审核失败使服务器关闭或无法启动时,事件MSG_AUDIT_FORCED_SHUTDOWN将写入日志。 由于在首次遇到此设置时会导致关机,该事件将被记录一次。 在出现有关审核导致关闭的失败消息后,将写入此事件。 管理员可以使用 -m 标志在单用户模式下启动SQL Server来绕过审核引发的关闭。 如果您以“单用户”模式启动,则会将指定在该会话中运行的任何审核ON_FAILURE = SHUTDOWN降级为ON_FAILURE = CONTINUE。 使用 -m 标志启动SQL Server时,MSG_AUDIT_SHUTDOWN_BYPASSED消息将写入错误日志。

有关服务启动选项的详细信息,请参阅 数据库引擎 服务启动选项

Azure SQL 托管实例 中的内部操作

  • 在Azure SQL 数据库和Azure SQL 托管实例中,由 SQLDBControlPlaneFirstPartyApp 发起的事件是Azure SQL 数据库控制平面的内部Azure函数。 由 SQLDBControlPlaneFirstPartyApp 发起的事件是 SQL 引擎和Azure 资源管理器之间的内部同步操作的一部分。 资源管理中的这些事件是正常现象,对于在 Azure 中正确体现和操作资源是必需的。

附带审计功能的数据库

附加具有审核规范的数据库并指定服务器上不存在的 GUID,会导致 孤立的 审核规范。 由于服务器实例上不存在具有匹配 GUID 的审核,将不记录审核事件。 若要更正这种情况,请使用 ALTER DATABASE AUDIT SPECIFICATION 命令将孤立的审核规范与现有服务器审核关联。 或者,使用 CREATE SERVER AUDIT 命令创建具有指定 GUID 的新服务器审计。

可以将具有定义审核规范的数据库附加到不支持SQL Server审核的另一个版本的SQL Server,例如 SQL Server Express,但它不记录审核事件。

数据库镜像和SQL Server审核

定义了数据库审核规范并使用数据库镜像的数据库包括数据库审核规范。 若要对已镜像的 SQL 实例进行正确的处理,必须配置下列项:

  • 镜像服务器必须拥有具有相同 GUID 的审核才能使数据库审核规范能够写入审核记录。 这可以通过使用命令 CREATE AUDIT WITH GUID = <guid-from-source-server-audit>进行配置。

  • 对于二进制文件目标,镜像服务器服务帐户对要写入审核记录的位置必须具有相应的权限。

  • 对于Windows事件日志目标,镜像服务器所在的计算机上的安全策略必须允许服务帐户访问安全或应用程序事件日志。

审核管理员活动

sysadmin 固定服务器角色的成员在每个数据库中均标识为 dbo 用户。 若要审核管理员的操作,请审核 dbo 用户的操作。

权限

SQL Server审核的每个功能和命令都有单独的权限要求。

若要创建、更改或删除服务器审核或服务器审核规范,服务器主体需要 ALTER ANY SERVER AUDITCONTROL SERVER 权限。 若要创建、更改或删除数据库审核规范,数据库主体需要具有 ALTER ANY DATABASE AUDIT 权限,或对数据库具有 ALTERCONTROL 权限。 此外,主体必须具有连接数据库的权限,或者具有ALTER ANY SERVER AUDIT权限或CONTROL SERVER权限。

VIEW ANY DEFINITION 权限提供查看服务器级别审核视图的访问权限,并提供 VIEW DEFINITION 查看数据库级别审核视图的访问权限。 拒绝这些权限会替代查看目录视图的功能,即使主体具有 ALTER ANY SERVER AUDITALTER ANY DATABASE AUDIT 权限也是如此。

若要使用 fn_get_audit_file读取审核数据,SQL Server 2019(15.x)和早期版本需要对服务器具有 CONTROL SERVER 权限,而 SQL Server 2022(16.x)及更高版本需要 VIEW SERVER SECURITY AUDIT 权限。 有关详细信息,请参阅 sys.fn_get_audit_file

有关如何授予权限和许可的详细信息,请参阅 GRANT

注意

sysadmin 角色中的主体可以篡改任何审核组件,db_owner角色中的主体可以篡改数据库中的审核规范。 SQL Server审核验证创建或更改审核规范的登录是否至少具有 ALTER ANY DATABASE AUDIT 权限。 但是,它不会在您附加数据库时进行验证。 应假定所有数据库审核规范仅与 sysadmindb_owner 角色中的这些主体一样可信。

使用 Transact-SQL 创建和管理审核

可以使用 DDL 语句、动态管理视图和函数以及目录视图来实现SQL Server审核的各个方面。

数据定义语言语句

可以使用下列 DDL 语句创建、更改和删除审核规范:

DDL 语句 说明
更改授权 更改安全对象的所有权。
修改数据库审核规范 使用SQL Server审核功能更改数据库审核规范对象。
更改服务器审核 使用SQL Server审核功能更改服务器审核对象。
修改服务器审核规范 使用SQL Server审核功能更改服务器审核规范对象。
创建数据库审计规范 使用SQL Server审核功能创建数据库审核规范对象。
创建服务器审核 (SERVER AUDIT) 通过 SQL Server 审核功能创建服务器审核对象。
创建服务器审核规范 使用SQL Server审核功能创建服务器审核规范对象。
删除数据库审计规格 使用SQL Server审核功能删除数据库审核规范对象。
DROP SERVER AUDIT 使用SQL Server审核功能删除服务器审核对象。
删除服务器审计规范 使用SQL Server审核功能删除服务器审核规范对象。

动态视图和函数

下表列出了可用于SQL Server审核的动态视图和函数。

动态视图和函数 说明
sys.dm_audit_actions 为可在审核日志中报告的每个审核操作以及可配置为SQL Server审核的一部分的每个审核操作组返回一行。
sys.dm_server_audit_status 提供有关当前审核状态的信息。
sys.dm_audit_class_type_map 返回一个表,将审核日志中的 class_type 字段映射到 sys.dm_audit_actions 中的 class_desc 字段。
fn_get_audit_file 从由服务器审核创建的审核文件返回信息。

目录视图

下表列出了可用于SQL Server审核的目录视图。

目录视图 说明
sys.database_audit_specifications(数据库审计规范) 包含有关服务器实例上SQL Server审核中的数据库审核规范的信息。
sys.database_audit_specification_details 包含有关所有数据库的服务器实例上SQL Server审核中的数据库审核规范的信息。
sys.server_audits 服务器实例中的每个SQL Server审核都包含一行。
sys.server_audit_specifications 包含有关服务器实例中 SQL Server 审计规格的信息。
sys.server_audit_specifications_details 包含有关服务器实例上SQL Server审核中的服务器审核规范详细信息(操作)的信息。
sys.server_file_audits (服务器文件审核) 包含有关服务器实例上 SQL Server 审计中文件审计类型的详细信息。

后续步骤