审计是监控选定的用户数据库操作的过程
审计的目的:
- 调查可疑的数据库活动:
- 审计可以帮助检测和跟踪潜在的 security breaches、未授权的访问尝试或其他异常行为。
- 通过分析审计日志,可以确定可疑活动的来源、时间、频率和影响。
- 收集特定数据库活动的信息:
- 审计可以提供关于数据库操作的详细记录,包括谁在何时进行了哪些操作。
- 这些信息对于合规性报告、性能分析、用户行为分析等都是非常有用的。
审计可以通过以下方式进行:
- 按会话审计:
- 监控特定会话的所有操作,从会话开始到结束。
- 这有助于跟踪单个用户或进程在一段时间内的所有活动。
- 按访问审计:
- 监控对特定数据库对象(如表、视图、存储过程等)的访问。
- 这有助于了解哪些用户或角色正在访问或尝试访问特定的数据或资源。
在实施审计时,可以考虑以下因素:
- 审计级别:可以设置不同的审计级别,从粗略的概览到详细的记录。
- 审计策略:定义哪些操作应该被审计,例如,只审计失败的登录尝试或所有数据修改操作。
- 审计日志:审计记录通常存储在审计日志中,这些日志需要被保护以防篡改,并且应该有适当的备份和监控措施。
- 合规性:在某些行业,如金融和医疗,审计是法律或法规要求的,用于确保数据的安全和合规性。
数据库管理系统(如 Oracle, MySQL, SQL Server 等)通常提供内置的审计功能,可以配置以满足特定的审计需求。
标准审计的详细信息
在数据库审计中,标准审计是一种常用的审计类型,它用于监控和记录数据库中的各种活动。以下是标准审计的详细信息:
标准审计的类型和用途
- SQL 语句审计:可以审计特定的 SQL 语句,如 SELECT、INSERT、UPDATE、DELETE 等。
- 权限审计:监控权限的授予和撤销,例如系统权限或对象权限。
- 模式审计:审计对特定数据库模式的访问和操作。
- 对象审计:审计对特定数据库对象的访问,如表、视图、序列等。
- 网络和多层活动审计:监控数据库的网络连接和多层应用程序访问。
标准审计记录的存储位置
- SYS.AUD$ 系统表:标准审计记录可以写入 SYS.AUD$ 系统表。可以通过查询数据字典视图 DBA_AUDIT_TRAIL 来查看这个表的内容。此外,DBA_COMMON_AUDIT_TRAIL 视图结合了标准审计和细粒度审计的日志记录。
- 操作系统文件:除了将审计跟踪写入操作系统文件格式外,还可以将其写入 XML 格式。这可以通过管理操作系统的审计跟踪来实现。
控制 AUDIT_TRAIL 初始化参数
要控制标准审计跟踪记录的写入方式,需要设置 AUDIT_TRAIL 初始化参数。以下是一些常见的 AUDIT_TRAIL 参数设置:
- NONE:不记录审计信息。
- OS:将审计记录写入操作系统文件。
- DB:将审计记录写入数据库的 SYS.AUD$ 表。
- XML:将审计记录写入 XML 格式的操作系统文件。
- EXTENDED:与 DB 相同,但包含更详细的信息。
- VERBOSE:与 OS 相同,但包含更详细的信息。
通常在数据库管理文档中会描述 AUDIT_TRAIL 参数的详细设置,包括它们的作用和如何配置。
通过正确配置 AUDIT_TRAIL 参数,数据库管理员可以确保审计记录按照组织的安全政策和合规性要求进行记录和存储。这对于事后分析、安全审查和合规性报告都是非常重要的。
管理员审计
管理员审计是一种特殊的审计类型,用于监控具有最高系统权限的用户的活动,如数据库的系统管理员(用户 SYS)以及那些使用 SYSDBA 或 SYSOPER 权限连接的用户。以下是如何在 UNIX 和 Windows 系统上实施管理员审计的概述:
UNIX 系统上的管理员审计
- syslog 审计跟踪:在 UNIX 系统上,可以使用 syslog 审计跟踪来监控系统管理员的活动。syslog 是一种审计跟踪目的地,类似于操作系统文件、XML 格式文件和数据库表。
- 初始化参数设置:
AUDIT_SYS_OPERATIONS
:此参数用于启用或禁用管理员审计。将其设置为 TRUE 时,系统管理员的活动将被记录在包含审计跟踪的操作系统文件中。AUDIT_SYSLOG_LEVEL
:当AUDIT_TRAIL
参数设置为os
时,此参数用于将 SYS 和标准的操作系统审计记录写入系统审计日志,使用 syslog 实用程序。
Windows 系统上的管理员审计
- Windows 事件日志:在 Windows 系统上,系统管理员的活动被记录在 Windows 事件日志中,与其他类型的活动一起。
- 初始化参数设置:
AUDIT_SYS_OPERATIONS
:同样适用于 Windows,启用此参数将记录系统管理员的活动。- 在 Windows 上,通常不需要
AUDIT_SYSLOG_LEVEL
参数,因为 Windows 使用事件日志而不是 syslog。
以下是如何设置这些初始化参数的示例:
-- 启用管理员审计,记录到操作系统文件
ALTER SYSTEM SET AUDIT_SYS_OPERATIONS=TRUE SCOPE=SPFILE;
-- 在 UNIX 系统上,设置 AUDIT_SYSLOG_LEVEL
ALTER SYSTEM SET AUDIT_SYSLOG_LEVEL=audit_level SCOPE=SPFILE;
在上述 ALTER SYSTEM
命令中,audit_level
应该被替换为适当的 syslog 级别,例如 LOG_ALERT
或 LOG_CRIT
。
通过配置这些参数,组织可以确保对具有最高权限的用户进行适当的监控,以防止未授权的活动或潜在的滥用行为,并符合内部政策和外部法规的要求。
定义审计
定义审计内容是实施有效审计策略的关键步骤。
定义审计内容
- 用户:
- 确定哪些用户的活动需要被审计,例如,可以审计所有用户或仅审计具有特定权限的用户。
- 语句:
- 选择要审计的 SQL 语句类型,如 SELECT、INSERT、UPDATE、DELETE 等。
- 可以审计所有语句或仅审计对特定数据的操作语句。
- 对象:
- 确定需要审计的数据库对象,如特定的表、视图、序列或存储过程。
- 语句执行:
- 决定是审计所有语句执行,还是只审计成功的或失败的语句执行。
- 成功的语句执行:审计那些没有错误地完成的语句。
- 不成功的语句执行:审计那些由于错误(如权限不足、违反约束等)而未能完成的语句。
- 两者:审计所有语句执行,无论成功与否。
管理审计跟踪
- 监控审计跟踪的增长:
- 定期检查审计跟踪文件或表的大小,确保它们不会消耗过多的存储空间。
- 实施策略来归档旧的审计记录,以便为新的审计数据腾出空间。
- 保护审计跟踪免受未授权访问:
- 确保审计跟踪文件或表的安全,只允许授权用户访问。
- 审计跟踪的访问权限应该与普通数据库对象的权限分开管理。
- 对审计跟踪实施加密,以保护敏感信息。
- 定期审查审计跟踪的访问日志,以检测任何未授权的访问尝试。
通过明确地定义审计内容并有效地管理审计跟踪,组织可以确保其数据库的安全性、合规性和可审核性。这也有助于在发生安全事件时快速响应和调查。
查看审计结果
-- 显示当前登录数据库的用户
SQL> show user;
USER is "SYS"
-- 显示与数据库审计相关的参数及其值
SQL> show parameter audit;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
auditfiledest string ?/rdbms/audit -- 审计跟踪文件的默认目录位置
-- ? 是一个占位符,它代表数据库的根目录。在实际路径中,? 会被替换为数据库的实际安装路径
auditsysoperations boolean TRUE -- 是否审计具有 SYSDBA、SYSOPER 和 SYSASM 权限的操作
audittrail string DB -- 审计跟踪的类型,DB 表示审计记录写入数据库系统表
transactionauditing boolean TRUE -- 是否启用事务审计,记录事务级别的详细信息
ls -ltr # 按时间顺序排序,最新的在最下边
按照不同的类别对审计功能进行分类
默认审计类别:
- 实例启动和实例关闭:
- 这些操作是默认被审计的,因为它们涉及到数据库的整体运行状态和安全。每当数据库实例启动或关闭时,这些事件都会被记录在审计日志中。
- 管理员权限:
- 使用管理员权限(如 SYSDBA、SYSOPER)的操作默认是审计的。这包括对数据库进行维护、配置更改或执行其他需要高级权限的任务。
数据库审计:
- 由 DBA 启用:
- 数据库审计功能通常由数据库管理员(DBA)配置和启用。DBA 可以设置审计策略,决定哪些用户操作需要被审计。
- 无法记录列值:
- 标准的数据库审计通常不记录被审计操作影响的特定列的值。它主要记录操作的发生,如用户尝试登录、执行特定命令等,但不包括数据的具体内容。
基于值或应用审计:
- 通过代码实现:
- 值基于审计或应用审计通常需要通过编写额外的代码(如触发器或应用程序逻辑)来实现。这些代码会在特定的数据更改事件发生时执行,并记录相关信息。
- 可以记录列值:
- 与标准数据库审计不同,值基于审计可以记录特定列的值。这对于跟踪对敏感数据的更改非常有用。
- 用于跟踪表的变化:
- 值基于审计常用于监控和记录对数据库表中特定列的更改。例如,可以审计对包含个人身份信息(PII)或财务数据的列的任何修改。
通过这些审计类别,组织可以确保对数据库的敏感操作和数据进行适当的监控,从而维护数据的安全性和合规性。
- 值基于审计常用于监控和记录对数据库表中特定列的更改。例如,可以审计对包含个人身份信息(PII)或财务数据的列的任何修改。
审计流程
-- 显示所有与审计相关的初始化参数的当前值
SQL> SHOW PARAMETER audit
-- 将审计跟踪的设置更改为 db,审计记录将被写入数据库的审计系统表中
SQL> ALTER SYSTEM SET audittraildb;
-- 指定更改将被写入服务器参数文件(SPFILE),更改在数据库重启后仍然有效
SQL> ALTER SYSTEM SET audittraildb SCOPESPFILE;
-- 立即关闭数据库实例,以便审计跟踪设置更改生效
SQL> SHUTDOWN IMMEDIATE
-- 启动数据库实例
SQL> STARTUP
-- 计算审计记录表 aud 中的记录数
SQL> SELECT COUNT(*) FROM aud;
-- 启动对用户 U1 的会话活动的审计
SQL> AUDIT SESSION BY U1;
-- 以用户 U1 身份连接到数据库
SQL> CONN U1/yuhang123
-- 以 SYSDBA 权限连接到数据库
SQL> CONN /AS SYSDBA
-- 再次计算 aud 表中的记录数,以查看是否有新的审计记录
SQL> SELECT COUNT(*) FROM aud;
-- 从 dbaaudittrail 视图中选择用户名、时间戳(格式化为日期和时间)和动作名称
SQL> SELECT username, to_char(timestamp, 'dd-mm-yyyy hh24:mi:ss') AS timestamp, actionname FROM dbaaudittrail;
-- 显示所有与审计相关的初始化参数的当前值
SQL> SHOW PARAMETER AUDIT
-- 计算数据库内部审计记录表 AUD 中的记录数
SQL> SELECT COUNT(*) FROM AUD;
-- 启用对用户 U1 的会话活动的审计,U1 登录时将产生审计记录
SQL> AUDIT SESSION BY U1;
-- 以用户 U1 身份连接到数据库,这将触发审计记录的创建
SQL> CONN U1/BBK12345
-- 以 SYSDBA 权限连接到数据库
SQL> CONN /AS SYSDBA
-- 再次计算 AUD 表中的记录数,以查看是否有新的审计记录
SQL> SELECT COUNT(*) FROM AUD;
-- 描述 DBAAUDITTRAIL 视图的结构,显示其列和数据类型
SQL> DESC DBAAUDITTRAIL
-- 从 DBAAUDITTRAIL 视图中选择用户名、时间戳和动作名称
SQL> SELECT USERNAME, TIMESTAMP, ACTIONNAME FROM DBAAUDITTRAIL;
-- 停止对用户 U1 的会话活动的审计
SQL> NOAUDIT SESSION BY U1;
审计选项
审计级别 | 影响 |
---|---|
语句审计 | 特定 SQL 语句或影响特定类型数据库对象的语句组。 例如,AUDIT TABLE 审计 CREATE TABLE、TRUNCATE TABLE、COMMENT ON TABLE 和 DELETE [ FROM] TABLE 语句。 |
权限审计 | 由指定系统权限授权的 SQL 语句。例如,AUDIT CREATE ANY TRIGGER 审计使用 CREATE ANY TRIGGER 系统权限发布的语句。 |
对象审计 | 特定对象上的特定语句,例如 HR.EMPLOYEES 表上的 ALTER TABLE。 |
网络审计 | 审计网络协议中的意外错误或网络层中的内部错误。 |
- 启用和禁用数据库审计:
- 通过设置
AUDITTRAIL
初始化参数来启用或禁用数据库审计。 AUDITTRAIL
可以设置为TRUE
或DB
(审计记录写入数据库审计跟踪),OS
(审计记录写入操作系统审计跟踪),或FALSE
或NONE
(禁用审计)。
- 通过设置
- 审计记录的生成:
- 审计记录的生成与用户的事务是独立的,即使事务被回滚,审计记录仍然保留。
- 审计记录在语句的执行阶段生成,解析阶段的语法错误不会产生审计记录。
- 审计选项的设置:
- 使用
AUDIT
命令设置特定的审计选项,包括审计哪些命令、用户、对象或权限。 - 可以指定是为每次事件发生还是每个会话生成一次审计记录。
- 使用
NOAUDIT
命令可以关闭不再需要的审计选项。
- 使用
审计选项及正确命令:
- 语句审计:
- 这会审计特定的 SQL 语句,而不考虑它们影响的对象。
- 正确命令示例:
AUDIT ALTER SYSTEM;
(这将审计任何用户执行的任何 ALTER SYSTEM 语句。)
- 权限审计:
- 这会审计系统权限的授予或撤销。
- 正确命令示例:
AUDIT CREATE ANY TABLE;
(这将审计任何用户创建任何表的权限授予。)
- 模式对象审计:
- 这会审计对特定模式对象的特定操作。
- 正确命令示例:
AUDIT SELECT ON emi.orders;
(这将审计对 emi.orders 表的任何 SELECT 操作。)
细粒度审计(Fine-grained Auditing)
细粒度审计提供了基于数据内容的访问监控。以下是细粒度审计的主要特点和操作步骤:
- 基于内容的监控:细粒度审计允许监控对数据的访问,特别是当访问涉及到特定内容时,比如特定值或条件。
- 使用 DBMS_FGA 包:细粒度审计是通过数据库中的 DBMS_FGA PL/SQL 包来实现的。
- 创建审计策略:数据库管理员(DBA)可以使用 DBMS_FGA 包在目标表上创建一个审计策略。
- 审计事件记录:当查询块返回的任何行满足审计条件时,审计事件条目将被插入到审计跟踪中。这些条目包括用户名、SQL 文本、绑定变量、策略名称、会话 ID、时间戳和其他属性。
禁用审计(Disabling Auditing)
- 使用 NOAUDIT 语句:要停止通过 AUDIT 命令启用的审计,可以使用 NOAUDIT 语句。
- 注意事项:
- NOAUDIT 语句将撤销之前 AUDIT 语句的效果。
- NOAUDIT 语句必须与之前的 AUDIT 语句具有相同的语法,并且只撤销该特定语句的效果。
- 如果一个 AUDIT 语句(语句 A)为特定用户启用了审计,而另一个 AUDIT 语句(语句 B)为所有用户启用了审计,那么一个用于禁用所有用户审计的 NOAUDIT 语句将撤销语句 B 的效果,但语句 A 仍然有效,并继续审计该语句指定的用户。
简而言之,细粒度审计允许数据库管理员精确地监控和记录对特定数据的访问,而禁用审计则是用来停止已经设置的审计操作。
审计用户SYS
- 提供额外的安全级别:审计用户SYS可以增加数据库的安全性,尤其是在用户SYS账户被广泛使用的数据库中。
- 设置 AUDIT_SYS_OPERATIONS 为 True:要从Oracle9i数据库第2版开始,对用户SYS的所有命令进行审计,需要将静态参数 AUDIT_SYS_OPERATIONS 设置为 True。
不审计用户SYS
- 设置 AUDIT_SYS_OPERATIONS 为 False:这是默认值。如果将 AUDIT_SYS_OPERATIONS 设置为 False,则用户SYS的审计级别将保持与之前版本相同。
审计用户SYS的具体内容
- 审计的命令:当 AUDIT_SYS_OPERATIONS 设置为 True 时,审计将包括实例启动和关闭操作,以及使用管理员权限连接到数据库的命令。
- 审计文件的记录和位置:用户SYS的审计记录存储在操作系统审计文件中,该文件的位置由参数 AUDIT_FILE_DEST 确定。
- 审计文件的监控:由于审计文件和Oracle跟踪文件一样会随着时间增长,因此需要定期监控。
总结
对用户SYS进行审计是一种增强数据库安全性的方法,尤其是对于那些广泛使用SYS账户的数据库。通过设置 AUDIT_SYS_OPERATIONS 参数,可以决定是否对SYS执行的所有命令进行审计。如果启用审计,审计记录将存储在由 AUDIT_FILE_DEST 参数指定的操作系统的审计文件中,并且需要定期检查该文件的大小和内容。
关于审计的视图
获取审计信息
要获取关于审计的配置信息,可以查询以下数据字典视图:
- ALL_DEF_AUDIT_OPTS: 显示默认的审计选项,包括对特定用户或角色的审计设置。
- DBA_STMT_AUDIT_OPTS: 显示语句审计选项,包括哪些SQL语句被审计。
- DBA_PRIV_AUDIT_OPTS: 显示权限审计选项,包括哪些系统权限的授予和回收被审计。
- DBA_OBJ_AUDIT_OPTS: 显示模式对象审计选项,包括哪些数据库对象(如表、视图、过程等)上的操作被审计。
获取审计记录信息
要获取审计记录,可以查询以下数据字典视图:
- DBA_AUDIT_TRAIL: 显示所有审计跟踪条目,这是最全面的视图,包含了所有类型的审计记录。
- DBA_AUDIT_EXISTS: 显示与
AUDIT EXISTS
和AUDIT NOT EXISTS
相关的记录,这些记录涉及到特定条件的存在性检查。 - DBA_AUDIT_OBJECT: 显示与模式对象相关的审计记录,例如对表或视图的操作。
- DBA_AUDIT_SESSION: 显示所有连接和断开连接的记录,这些记录可以用来跟踪用户登录和注销数据库的情况。
- DBA_AUDIT_STATEMENT: 显示语句审计记录,包括被审计的SQL语句的执行情况。
审计跟踪表和预定义视图
- 数据库审计跟踪 (SYS.AUD$): 在每个Oracle数据库的字典中,有一个单一的表用于存储审计跟踪信息。
- 预定义视图: 数据库管理员(DBA)创建了一些预定义视图来简化审计记录的查询。上述列出的视图就是其中的一部分,它们提供了对审计跟踪表(SYS.AUD$)中的数据的不同视角。