责任划分
- 必须信任具有 DBA 权限的用户。
- 滥用信任
- 审计线索会保护受信任的职位
- 必须由多人分担 DBA 责任。
- 一定不要共享帐户。
- DBA 和系统管理员必须由不同人员担任。
- 划分操作员与 DBA 的责任。
数据库安全性
- 限制对数据和服务的访问(不是所有的用户都可以访问所有数据)
- 验证用户
- 监视可疑活动(运用审计工具)
最少权限原则
- 包括
- 只在计算机上安装所需软件
- 只在计算机上激活所需服务:意味着打开的端口少
- 只允许需要访问的用户访问操作系统 (OS) 和数据库:用户越少意味着口令和帐户越少。帐户越少,管理员就越容易跟踪帐户的最新活动。
- 限制对 root 或管理员帐户的访问
- 限制对 SYSDBA和 SYSOPER帐户的访问
- 只允许用户访问完成工作所需的数据库对象
- 应用
- 保护数据字典
- O7_dictionary_accessibilty=FALSE 确保 SYS 用户只能以 SYSDBA 身份登录
- 从 PUBLIC 撤销不必要的权限
REVOKE EXECUTE ON UTL_SMTP, UTL_TCP, UTL_HTTP,
UTL_FILE FROM PUBLIC;
- 限制对操作系统目录的访问:通过数据库中的DIRECTORY 对象,DBA 可将目录映射到操作系统路径,从而将对这些目录的权限授予给各个用户。
- 限制具有管理权限的用户
- 系统和对象的权限
- 连接到数据库的 SYS 权限,如 SYSDBA和 SYSOPER
- 其它 DBA 类型的权限,如DROP ANY TABLE
- 限制远程数据库验证:默认情况下,EMOTE_OS_AUTHENT 参数设置为 FALSE。
审计
- 监视可疑活动
- 审计意味着捕获并存储关于系统中所发生情况的信息,这会增加系统需要执行的工作量。
- 强制性审计:不管其它审计选项或参数为何,所有Oracle 数据库都会审计特定的操作。
- 标准数据库审计:这是通过使用AUDIT_TRAIL 初始化参数在系统级别设置的。
- 基于值审计:不仅会捕获已发生的审计事件,还会捕获插入、更新或删除的实际值。基于值审计是通过数据库触发器实施的。
- 细粒度审计 (FGA):可捕获已发出的实际 SQL 语句,而不仅仅是发生了事件的 SQL 语句。
- DBA 审计:在 DBA 与审计者或安全管理员之间划分审计责任,审计者或安全管理员在操作系统审计线索中负责监视 DBA 的活动。
- 标准数据库审计
- AUDIT_TRAIL 设置为 OS
- Windows 审计记录存储在事件日志中
- UNIX 或 Linux AUDIT_FILE_DEST 参数指定的位置的文件中
- AUDIT_TRAIL 参数设置为 DB
- 可复查 DBA_AUDIT_TRAIL 视图中的审计记录,这个视图是SYS 方案的一部分。
- AUDIT_TRAIL 设置为 XML 或 XML EXTENDED
- 审计记录会写入AUDIT_FILE_DEST 参数指向的目录中的XML 文件。使用 V$XML_AUDIT_TRAIL 视图可查看此目录中的所有XML 文件。
- 启用审计
- ALTER SYSTEM SET audit_trail=“XML” SCOPE=SPFILE;
- 统一审计线索
- 公共属性
- 用全球标准时间 (UTC) 表示的全球时间戳。
- 每个 Real Application Clusters (RAC) 实例的唯一实例编号。
- 用于分组一个事务处理的审计记录的事务处理标识符。
- 标准审计收集的额外信息
- 系统更改号 (SCN),记录对系统的每一项更改。
- 用户执行的确切 SQL 文本及与 SQL 文本一起使用的绑定变量。只有在初始化参数文件中指定了 AUDIT_TRAIL=DB 时,才会显示这些列。
- 细粒度审计收集的额外信息
- 每个审计记录的序列号
- 将源自一条语句的多个审计条目联系起来的语句编号
- Enterprise Manager 审计页
- “Administration(管理)” -----> “Audit Settings(审计设置)”
- Configuration(配置):
- Audit Trails(审计线索):
- Audited Privileges(审计权限)
- Audited Objects(审计对象)
- Audited Statements(审计语句)
- 指定审计选项
- 审计 SQL 语句
- 审计影响表的任何DDL
- AUDIT table;
- 按用户名或者按成功或失败来设置重点审计的 SQL 语句
-
- AUDIT TABLE BY hr WHENEVER NOT SUCCESSFUL;
- 审计系统权限
- 用来审计行使的任何系统权限 by access(默认):每次行使经过审计的系统权限时,都会生成一条审计记录
- by session:每个会话只生成一条记录
- AUDIT select any table BY hr BY SESSION;
- 审计对象权限
- 可用来审计对表、视图、过程、序列、目录和用户定义的数据类型执行的操作。
- by access
- by session(默认)
- AUDIT UPDATE,DELETE on hr.employees BY ACCESS;
- 基于值审计
CREATE OR REPLACE TRIGGER system.hrsalary_audit
AFTER UPDATE OF salary
ON hr.employees
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :old.salary != :new.salary THEN
INSERT INTO system.audit_employees
VALUES (sys_context('userenv','os_user'), sysdate,
sys_context('userenv','ip_address'),
:new.employee_id ||
' salary changed from '||:old.salary||
' to '||:new.salary);
END IF;
END;
/
- 细粒度审计(FGA)
- 概览
- 根据内容监视数据访问
- 审计 SELECT、INSERT、UPDATE、DELETE和 MERGE
- 可链接到表或视图,也可链接到一列或多列
- 可能会触发一个过程
- 使用 DBMS_FGA 程序包进行管理(DBMS_FGA.ALL_COLUMNS和 DBMS_FGA.ANY_COLUMNS,可根据语句中是使用了任一相关列还是全部相关列来进行审计)
- FGA 策略
dbms_fga.add_policy (
object_schema => 'HR', --审计对象方案
object_name => 'EMPLOYEES', --审计对象名
policy_name => 'audit_emps_salary', --策略名
audit_condition => 'department_id=10', --审计条件
audit_column => 'SALARY', --审计列
handler_schema => 'secure', --PL/SQL 程序单元的方案
handler_module => 'log_emps_salary', --PL/SQL 程序单元的名称
enable => TRUE, --策略状态
statement_types => 'SELECT' ); --审计语句类型
- 审计的 DML 语句
- 如果满足 FGA 谓词并且引用了相关列,则会审计记录。
- 不管指定列是什么,都会审计 DELETE 语句。因为 DELETE 语句会访问表中的所有列
- 会审计 MERGE 语句以及基础 INSERT 或 UPDATE 生成语句。
- FGA 准则
- 要审计所有语句,请使用 null 条件
- 策略名必须唯一
- 创建策略时,审计的表或视图必须已经存在
- 如果审计条件语法无效,则访问审计对象时会发生ORA-28112 错误。
- 如果表中不存在审计的列,则不会审计任何行
- 如果事件处理程序不存在,则不会返回任何错误但仍会创建审计记录。
- DBA 审计
- 审计线索必须存储在数据库外部
- 总是审计以 SYSDBA 或 SYSOPER 身份进行的连接
- 可使用 audit_sys_operations 启用对 SYSDBA或 SYSOPER 操作的附加审计。(默认设置为 FALSE)
- 可使用 audit_file_dest 控制审计线索
-
- Windows :审计线索存储在 Windows 事件日志中
- UNIX 或Linux:审计记录存储在$ORACLE_HOME/rdbms/audit 中
- 维护审计线索
- 复查和存储旧记录
- 避免出现存储问题
- 标准审计的审计线索存储在 AUD$ 表中
- FGA 的审计线索存储在FGA_LOG$ 表中
- 默认情况下,这两个表都是在SYSTEM 表空间中创建的
- 避免记录丢失(导入与导出)