Part01-基础概念与理论知识
1.1 细粒度审计的概念
细粒度审计(Fine-Grained Auditing,FGA)是Oracle数据库中一种更高级的审计机制,它可以基于行级和列级的条件进行审计,提供更精细的访问控制和审计能力。
学习交流加群风哥QQ113257174
1.2 FGA的工作原理
FGA通过创建审计策略,当用户访问表或视图时,Oracle会检查访问的行和列是否满足审计条件,如果满足则生成审计记录。FGA可以基于SQL语句的内容、用户身份、时间等多种因素进行审计。
风哥提示:FGA可以实现对敏感数据的精确审计,是标准审计的有力补充
1.3 FGA与标准审计的区别
- 标准审计:基于语句、权限和对象的审计,粒度较粗
- FGA:基于行级和列级的审计,粒度更细
- 标准审计:记录操作类型和对象
- FGA:可以记录具体的访问条件和访问的数据
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 FGA策略设计原则
- 明确审计目标:确定需要审计的敏感数据
- 最小影响原则:只审计必要的操作,避免过度审计
- 精确条件:使用精确的审计条件,减少误报
- 定期审查:定期审查FGA策略的有效性
2.2 FGA性能考虑
在生产环境中,FGA可能会对性能产生影响,建议:
- 只对敏感数据实施FGA
- 合理设计审计条件,避免复杂的条件表达式
- 定期清理FGA审计记录
- 考虑使用分区表存储FGA审计记录
学习交流加群风哥微信: itpux-com
2.3 FGA存储管理
- 设置适当的审计表空间
- 配置FGA审计记录的保留时间
- 定期归档FGA审计记录
- 监控FGA审计表的大小和增长趋势
更多学习教程公众号风哥教程itpux_com
Part03-生产环境项目实施方案
风哥教程参考Oracle官方文档Security部分,我们将实施以下步骤:
- 创建FGA策略
- 测试FGA效果
- 查询FGA审计记录
- 管理FGA存储
- 优化FGA性能
from oracle:www.itpux.com
Part04-生产案例与实战讲解
4.1 创建FGA策略
命令:— 创建FGA策略,审计对salary列的访问
EXEC DBMS_FGA.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’,
audit_condition => ‘salary > 10000’,
audit_column => ‘salary’,
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => ‘SELECT’,
audit_trail => DBMS_FGA.DB
);执行:输出日志:PL/SQL procedure successfully completed.
EXEC DBMS_FGA.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’,
audit_condition => ‘salary > 10000’,
audit_column => ‘salary’,
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => ‘SELECT’,
audit_trail => DBMS_FGA.DB
);执行:输出日志:PL/SQL procedure successfully completed.
4.2 测试FGA效果
命令:— 执行一些操作以生成FGA审计记录
CONN fgedu_user/password123;– 查询工资大于10000的员工(会触发FGA)
SELECT employee_id, first_name, last_name, salary FROM fgedu.employees WHERE salary > 10000;– 查询工资小于10000的员工(不会触发FGA)
SELECT employee_id, first_name, last_name, salary FROM fgedu.employees WHERE salary <= 10000;-- 只查询非工资列(不会触发FGA) SELECT employee_id, first_name, last_name FROM fgedu.employees;执行:输出日志:Connected.EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SALARY
———– ——————– ————————- ———- 100 Steven King 24000 101 Neena Kochhar 17000 102 Lex De Haan 17000 201 Michael Hartstein 13000EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SALARY
———– ——————– ————————- ———- 200 Jennifer Whalen 4400EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME
———– ——————– ————————- 100 Steven King 101 Neena Kochhar 102 Lex De Haan 200 Jennifer Whalen 201 Michael Hartstein
CONN fgedu_user/password123;– 查询工资大于10000的员工(会触发FGA)
SELECT employee_id, first_name, last_name, salary FROM fgedu.employees WHERE salary > 10000;– 查询工资小于10000的员工(不会触发FGA)
SELECT employee_id, first_name, last_name, salary FROM fgedu.employees WHERE salary <= 10000;-- 只查询非工资列(不会触发FGA) SELECT employee_id, first_name, last_name FROM fgedu.employees;执行:输出日志:Connected.EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SALARY
———– ——————– ————————- ———- 100 Steven King 24000 101 Neena Kochhar 17000 102 Lex De Haan 17000 201 Michael Hartstein 13000EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME SALARY
———– ——————– ————————- ———- 200 Jennifer Whalen 4400EMPLOYEE_ID EMP_NAME EMP_EMP_EMP_LAST_NAME
———– ——————– ————————- 100 Steven King 101 Neena Kochhar 102 Lex De Haan 200 Jennifer Whalen 201 Michael Hartstein
4.3 查询FGA审计记录
命令:— 查询FGA审计记录
SELECT object_schema, object_name, policy_name, statement_type,
username, timestamp, sql_text, sql_bind
FROM dba_fga_audit_trail
WHERE object_schema = ‘FGEDU’
ORDER BY timestamp DESC;执行:输出日志:OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE USERNAME TIMESTAMP SQL_TEXT SQL_BIND
————- ————— ———————- ————– —————————— ——————- ——————————————————————————– ——–
FGEDU EMPLOYEES FGEDU_EMP_SALARY_AUDIT SELECT FGEDU_USER 2026-04-01 11:30:15 SELECT employee_id, first_name, last_name, salary FROM fgedu.employees WHERE salary > 10000
SELECT object_schema, object_name, policy_name, statement_type,
username, timestamp, sql_text, sql_bind
FROM dba_fga_audit_trail
WHERE object_schema = ‘FGEDU’
ORDER BY timestamp DESC;执行:输出日志:OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE USERNAME TIMESTAMP SQL_TEXT SQL_BIND
————- ————— ———————- ————– —————————— ——————- ——————————————————————————– ——–
FGEDU EMPLOYEES FGEDU_EMP_SALARY_AUDIT SELECT FGEDU_USER 2026-04-01 11:30:15 SELECT employee_id, first_name, last_name, salary FROM fgedu.employees WHERE salary > 10000
4.4 管理FGA策略
命令:— 查看FGA策略
SELECT object_schema, object_name, policy_name, audit_column, enabled
FROM dba_audit_policies
WHERE object_schema = ‘FGEDU’;– 禁用FGA策略
EXEC DBMS_FGA.DISABLE_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’
);– 启用FGA策略
EXEC DBMS_FGA.ENABLE_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’
);– 删除FGA策略
EXEC DBMS_FGA.DROP_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’
);执行:输出日志:OBJECT_SCHEMA OBJECT_NAME POLICY_NAME AUDIT_COLUMN ENABLED
————- ————— ———————- —————————— ——-
FGEDU EMPLOYEES FGEDU_EMP_SALARY_AUDIT SALARY YESPL/SQL procedure successfully completed.PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
SELECT object_schema, object_name, policy_name, audit_column, enabled
FROM dba_audit_policies
WHERE object_schema = ‘FGEDU’;– 禁用FGA策略
EXEC DBMS_FGA.DISABLE_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’
);– 启用FGA策略
EXEC DBMS_FGA.ENABLE_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’
);– 删除FGA策略
EXEC DBMS_FGA.DROP_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_salary_audit’
);执行:输出日志:OBJECT_SCHEMA OBJECT_NAME POLICY_NAME AUDIT_COLUMN ENABLED
————- ————— ———————- —————————— ——-
FGEDU EMPLOYEES FGEDU_EMP_SALARY_AUDIT SALARY YESPL/SQL procedure successfully completed.PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.
4.5 创建更复杂的FGA策略
命令:— 创建基于多条件的FGA策略
EXEC DBMS_FGA.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_comprehensive_audit’,
audit_condition => ‘department_id = 90 OR salary > 15000’,
audit_column => ‘salary,commission_pct’,
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => ‘SELECT,UPDATE’,
audit_trail => DBMS_FGA.DB
);执行:输出日志:PL/SQL procedure successfully completed.
EXEC DBMS_FGA.ADD_POLICY(
object_schema => ‘fgedu’,
object_name => ’employees’,
policy_name => ‘fgedu_emp_comprehensive_audit’,
audit_condition => ‘department_id = 90 OR salary > 15000’,
audit_column => ‘salary,commission_pct’,
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => ‘SELECT,UPDATE’,
audit_trail => DBMS_FGA.DB
);执行:输出日志:PL/SQL procedure successfully completed.
风哥提示:FGA策略可以根据业务需求设置复杂的审计条件,实现精确的审计
4.6 管理FGA存储
命令:— 查看FGA审计表空间使用情况
SELECT tablespace_name, bytes/1024/1024 “Size (MB)”,
(bytes – free_bytes)/1024/1024 “Used (MB)”,
free_bytes/1024/1024 “Free (MB)”,
ROUND((bytes – free_bytes)/bytes * 100, 2) “Used %”
FROM dba_tablespaces t, (SELECT tablespace_name, SUM(bytes) free_bytes
FROM dba_free_space
GROUP BY tablespace_name) f
WHERE t.tablespace_name = f.tablespace_name(+)
AND t.tablespace_name = ‘SYSAUX’;– 清理旧的FGA审计记录
DELETE FROM fga_log$ WHERE ntimestamp# < SYSDATE - 30;COMMIT;-- 收缩FGA审计表 ALTER TABLE fga_log$ ENABLE ROW MOVEMENT;ALTER TABLE fga_log$ SHRINK SPACE;执行:输出日志:TABLESPACE_NAME Size (MB) Used (MB) Free (MB) Used %
—————————— ———- ———- ———- ———-
SYSAUX 1000 370 630 375 rows deleted.Commit complete.Table altered.Table altered.
SELECT tablespace_name, bytes/1024/1024 “Size (MB)”,
(bytes – free_bytes)/1024/1024 “Used (MB)”,
free_bytes/1024/1024 “Free (MB)”,
ROUND((bytes – free_bytes)/bytes * 100, 2) “Used %”
FROM dba_tablespaces t, (SELECT tablespace_name, SUM(bytes) free_bytes
FROM dba_free_space
GROUP BY tablespace_name) f
WHERE t.tablespace_name = f.tablespace_name(+)
AND t.tablespace_name = ‘SYSAUX’;– 清理旧的FGA审计记录
DELETE FROM fga_log$ WHERE ntimestamp# < SYSDATE - 30;COMMIT;-- 收缩FGA审计表 ALTER TABLE fga_log$ ENABLE ROW MOVEMENT;ALTER TABLE fga_log$ SHRINK SPACE;执行:输出日志:TABLESPACE_NAME Size (MB) Used (MB) Free (MB) Used %
—————————— ———- ———- ———- ———-
SYSAUX 1000 370 630 375 rows deleted.Commit complete.Table altered.Table altered.
更多视频教程www.fgedu.net.cn
Part05-风哥经验总结与分享
5.1 最佳实践
- 根据业务需求制定合理的FGA策略
- 只对敏感数据实施FGA,避免过度审计
- 使用精确的审计条件,减少误报
- 定期审查FGA审计记录,发现安全问题
5.2 常见问题与解决方案
- 问题:FGA影响性能
解决方案:优化FGA策略,只审计必要的操作 - 问题:FGA审计记录过多
解决方案:定期清理FGA审计记录,使用分区表存储 - 问题:FGA策略条件复杂
解决方案:简化审计条件,提高执行效率
学习交流加群风哥QQ113257174
5.3 性能优化
- 为FGA审计条件创建适当的索引
- 避免在FGA条件中使用复杂的函数
- 考虑使用DBMS_FGA的AUDIT_TRAIL => DB_EXTENDED选项,记录更详细的信息
- 定期监控FGA对性能的影响
更多学习教程公众号风哥教程itpux_com
5.4 安全建议
- 定期备份FGA审计记录,防止审计数据丢失
- 限制对FGA审计记录的访问权限
- 监控FGA策略的变更
- 结合其他安全特性,如VPD和数据加密
from oracle:www.itpux.com
