SQL Server 2008 引入了服务器审核功能,可以对服务器级别和数据库级别事件组和事件进行审核。
SQL Server 的审核级别有若干种,具体取决于安装环境的政府要求或标准要求。SQL Server 审核提供若干必需的工具和进程,用于启用、存储和查看对各个服务器和数据库对象的审核。
SQL Server 的所有版本均支持服务器级审核。数据库级审核限制为企业版、开发版和评估版等版本。
若要创建、更改或删除服务器审核,主体需要拥有 ALTER ANY SERVER AUDIT 或 CONTROL SERVER 权限。
审核由零个或多个审核操作项组成,这些操作项会记录到审核“目标”。审核目标可以是以下三种之一:
(1) 二进制文件:日志将保存到指定的文件夹。
(2) Windows 应用程序事件日志:日志将写入 Windows 的“应用程序”中。
(3) Windows 安全事件日志。:日志将写入 Windows 的“安全”中。
将 SQL Server 服务器审核写入 Windows 安全日志有两个关键要求。
auditpol /set /subcategory:"application generated" /success:enable /failure:enable |
对于早前的操作系统,使用本地安全策略。
提示:
通常,将 Windows 安全日志设置为覆盖较旧的事件。这样可保留最新的事件。但如果 Windows 安全日志未设置为覆盖较旧的事件,则当安全日志已满时,系统将发出 Windows 事件 1104(日志已满)。此时将不再记录其他安全事件,日志记录行为将在管理员修复安全日志后才恢复正常。
“SQL Server 审核”对象收集单个服务器实例或数据库级操作和操作组以进行监视。这种审核处于 SQL Server 实例级别。每个 SQL Server 实例可以具有多个审核。
在 SSMS 中展开“安全性”文件夹,右键单击“审核”,然后在右键菜单中选择“新建审核”。
在“常规”选项卡上依次配置以下选项。
(1)审核名称
审核的名称。这是在创建新审核时自动生成的,但是您可以对其进行编辑。
(2)队列延迟(毫秒)
指定在强制处理审核操作之前可以等待的时间(毫秒)。值 0 指示同步传递。默认的最小值为 1000(即 1 秒)。最大值为 2,147,483,647(约 25 天)。
(3)在审核日志失败时
在写入审核日志时可能会遇到故障导致写入失败,此选项用于指定在写入失败时应如何应对。
◆ 继续
SQL Server 操作将继续。审核记录将不会保留。审核将继续尝试将事件记入日志,并且在故障条件得到解决后将恢复。选择“继续”选项可以允许未经审核的活动,这可能违反了您的安全策略。在数据库引擎的继续操作比维护完整审核更重要时,选择此选项。这是默认选项。
◆ 关闭服务器
在写入目标的服务器实例无法将数据写入审核目标时,强制关闭服务器。发出此命令的登录名必须具有 SHUTDOWN 权限。如果该登录名没有此权限,则该函数将失败并将引发错误消息。将不会发生审核的事件。在审核失败可能损害系统的安全或完整性时,选择此选项。
◆ 失败操作
在 SQL Server Audit 无法写入审核日志的情况下,如果数据库操作将导致审核的事件,则此选项将导致数据库操作失败。将不会发生审核的事件。不会导致审核的事件的操作可以继续。审核将继续尝试将事件记入日志,并且在故障条件得到解决后将恢复。在维护完整审核比对数据库引擎的完全访问权限更重要时,选择此选项。
在审核处于失败状态时,专用管理员连接可继续执行审核的事件。
(4)审核目标
指定数据的审核目标。可用选项包括二进制文件、Windows 应用程序日志或 Windows 安全日志。
当“审核目标”是文件时,指定审核数据写入的文件夹所在的位置,然后在“审核文件最大限制”选项中指定是否限制审核文件的数目。
◆ 在选中了“最大滚动更新文件数”下的“无限制”复选框后,可创建的审核文件数不受任何限制。
◆ 如果选中了“最大滚动更新文件数”,同时取消“无限制”复选框,则可创建的审核文件数目受到“文件数”选项的限制。
◆ 选中“最大文件数”,则指定在达到“文件数”所限制的数量时,导致生成附加审核事件的任何操作都将失败并报告错误。
“文件数”最高为 2,147,483,647。
可以为审核文件设置“最大文件大小”。可以指定 1024 MB 至 2,147,483,647 TB 之间的值。选中下方的“无限制”复选框将不会对文件大小施加限制。默认情况下,“无限制”复选框为选中状态。
“保留磁盘空间”复选框可以指定在磁盘上预先分配与指定的最大文件大小相等的空间。只有在“最大文件大小”下未选中“无限制”复选框的情况下,才能使用此设置。默认情况下,不选中此复选框。
在“筛选器”选项卡上,可以对服务器审核输入一个谓词或 WHERE 子句,以便指定在“常规”页上未提供的附加选项。用小括号将该谓词括起来,例如 (object_name = 'EmployeesTable')。
在完成选项选择后,请单击“确定”。
T-SQL 语法示例如下:
CREATE SERVER AUDIT [Audit-To-File] TO FILE (FILEPATH = N'E:\MSSQL\Audit' ,MAXSIZE = 0 MB ,MAX_ROLLOVER_FILES = 2147483647 ,RESERVE_DISK_SPACE = OFF ) WITH (QUEUE_DELAY = 1000 ,ON_FAILURE = CONTINUE )
GO |
定义审核时,仅指定结果的输出位置,这是审核的目标位置。新创建的审核将默认处于“禁用”状态,因此不会自动审核任何操作。启用审核后,审核目标将从审核接收数据。
T-SQL 语法示例如下:
ALTER SERVER AUDIT [Audit-To-File] WITH (STATE = ON); |
在 SSMS 图形界面中,依次展开“安全性”、“审核”文件夹。右键单击要查看的审核日志,然后选择“查看审核日志”。这将打开“日志文件查看器”对话框。审核记录中的日期和时间都是以 UTC 时间显示。
建议通过使用日志文件查看器查看审核日志。在某些场景中,例如创建自动监视系统,则可以使用 sys.fn_get_audit_file 函数直接读取审核文件中的信息。直接读取该文件将以略有不同的(未处理的)格式返回数据。
SQL Server 审核可以为审核记录中的字符字段存储 4000 个数据字符。当可审核操作返回的 additional_information 和 statement 值返回的字符超过 4000 个时,会将多个记录行写入到单个审核操作的审核报表中以记录此数据。这些记录行只有 sequence_no 值和 statement 值不同,所有其他字段在每一行中是重复的。
SELECT * FROM sys.fn_get_audit_file('E:\MSSQL\Audit\*',null,null) |
服务器审核规范用于对服务器级别和数据库级别事件组以及单个事件进行审核。
针对服务器级别的审核,使用了“操作组”的概念,这是类似于 SQL Server 安全审核事件类的操作。下表介绍了常用的服务器级审核操作组。
操作组名称 | 说明 |
BACKUP_RESTORE_GROUP | 发出备份或还原命令时,将引发此事件。 |
DATABASE_CHANGE_GROUP | 创建、更改或删除数据库时将引发此事件。 |
DATABASE_OBJECT_ACCESS_GROUP | 访问数据库对象(如消息类型、程序集和协定)时将引发此事件,这可能导致生成大量审核记录。 |
DATABASE_OBJECT_CHANGE_GROUP | 针对数据库对象(如架构)执行 CREATE、ALTER 或 DROP 语句时将引发此事件,这可能导致生成大量审核记录。 |
FAILED_LOGIN_GROUP | 指示主体尝试登录到 SQL Server,但是失败。此类中的事件由新连接引发或由连接池中重用的连接引发。 |
LOGOUT_GROUP | 指示主体已注销 SQL Server。此类中的事件由新连接引发或由连接池中重用的连接引发。 |
SCHEMA_OBJECT_ACCESS_GROUP | 每次在架构中使用对象权限时,都将引发此事件。 |
SCHEMA_OBJECT_CHANGE_GROUP |
针对架构执行 CREATE、ALTER 或 DROP 操作时将引发此事件。 |
SERVER_OBJECT_CHANGE_GROUP | 针对服务器对象执行 CREATE、ALTER 或 DROP 操作时将引发此事件。 |
服务器级别操作组涵盖了整个 SQL Server 实例中的操作。例如,如果将相应操作组添加到服务器审核规范中,则将记录任何数据库中的任何架构对象访问检查。
服务器级别的操作不允许对数据库级别的操作进行详细筛选。实现详细操作筛选需要数据库级别的审核。
审核必须已存在,才能为它创建服务器审核规范。
创建服务器审核规范位于事务范围内。如果对事务进行回滚,也将对该语句进行回滚。
具有 ALTER ANY SERVER AUDIT 权限的用户可以创建服务器审核规范并将其绑定到任何审核。
创建服务器审核规范后,具有 CONTROL SERVER 或 ALTER ANY SERVER AUDIT 权限的主体、sysadmin 帐户或具有对审核的明确访问权的主体即可查看该规范。
在 SSMS 中展开“安全性”,右键单击“服务器审核规范”文件夹,然后选择“新建服务器审核规范”。
在“名称”中为新建的服务器审核规范指定一个名称。这是在创建新服务器审核规范时自动生成的,但是您可以对其进行编辑。
在“审核”列表中选择一个现有的服务器审核的名称。
在“操作”中指定要捕获的服务器级别审核操作组和审核操作。
在完成后,单击“确定”按钮。
T-SQL 语法示例如下:
USE [master] GO CREATE SERVER AUDIT SPECIFICATION [ServerAuditSpecification-FailedLogin] FOR SERVER AUDIT [Audit-To-File] ADD (FAILED_LOGIN_GROUP) GO |
新创建的服务器审核规范是“禁用”状态。如果需要启用它,则需要手动启用。
T-SQL 语法示例如下:
ALTER SERVER AUDIT SPECIFICATION [ServerAuditSpecification-FailedLogin] WITH (STATE = ON); |
在数据库级别创建审核规范,可以实现数据库级别的审核。具有 ALTER ANY DATABASE AUDIT 权限的用户可以创建数据库审核规范并将其绑定到任何审核。创建数据库审核规范后,具有 CONTROL SERVER 或 ALTER ANY DATABASE AUDIT 权限的主体或 sysadmin 帐户即可查看该规范。
数据库级别审核的操作类型可以是操作组,也可以是单个的操作(SELECT、UPDATE、INSERT、DELETE、EXECUTE、RECEIVE 和 REFERENCES 等)。
可以在 SSMS 中查看“审核”的日志,或者使用系统函数。
数据库级别的审核操作不适用于列。
当查询处理器对查询进行参数化时,审核事件日志中会出现参数而不是查询的列值。
数据库审核规范位于创建它们的数据库(tempdb 系统数据库除外)中。
对于单个数据库而言,每一个数据库审核规范都需要绑定一个“审核”。如果某个数据库需要创建多个审核规范,那么必须绑定到多个“审核”。
在 SSMS 中展开数据库的“安全性”,右键单击“数据库审核规范”,选择“新建数据库审核规范”。
“对象类”可以是 DATABASE、SCHEME 或者 OBJECT。如果选择了“OBJECT”,则可以对表、视图、存储过程、函数、扩展存储过程、队列、同义词等进行的特定操作进行审核。单击“对象名称”下拉列表右侧的浏览按钮,出现“选择对象”对话框。
如果输入的对象名称遇到多个匹配结果,将出现“找到多个对象”对话框,请选择一个或多个匹配的对象。
提示:
在用户数据库中创建或修改数据库审核规范时,不要包括针对服务器范围对象(例如系统视图)的审核操作。如果包括服务器范围的对象,将会创建“审核”。但是,服务器范围对象将不包括,并且将不返回任何错误。若要审核服务器范围的对象,请使用 master 数据库中的数据库审核规范。
选择“主体名称”的操作与选择“对象名称”操作方法类似,只是所选择的对象只能是用户、数据库角色或者应用程序角色。
完成后,单击“确定”按钮。
T-SQL 语法示例如下:
USE [SQLDB01] GO CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-Table-Customer] FOR SERVER AUDIT [Audit-To-File] ADD (SELECT ON OBJECT::[dbo].[Customer] BY [public]), ADD (INSERT ON OBJECT::[dbo].[Customer] BY [public]), ADD (DELETE ON OBJECT::[dbo].[Customer] BY [public]), ADD (UPDATE ON OBJECT::[dbo].[Customer] BY [public]) GO |
新创建的数据库审核规范是“禁用”状态。如果需要启用它,则需要手动启用。
T-SQL 语法示例如下:
ALTER DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-Table-Customer] WITH (STATE = ON); |
参考资源
http://www.mssqlmct.cn/dba/?post=176
http://www.mssqlmct.cn/dba/?post=177
http://www.mssqlmct.cn/dba/?post=178
《创建服务器审核和服务器审核规范》 https://technet.microsoft.com/zh-cn/library/cc280525.aspx
《CREATE SERVER AUDIT (Transact-SQL)》https://technet.microsoft.com/zh-cn/library/cc280448.aspx
《将 SQL Server 审核事件写入安全日志》 https://technet.microsoft.com/zh-cn/library/cc645889.aspx