Skip to content

Oracle 安全配置检查

用户和权限管理检查

用户账户检查

检查内容

  • 检查是否存在多余的管理员账户
  • 检查是否存在默认账户或过期账户
  • 检查账户锁定状态和密码策略
  • 检查特权账户的使用情况

检查命令

sql
-- 检查所有用户账户
SELECT username, account_status, lock_date, expiry_date FROM dba_users;

-- 检查特权用户
SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role IN ('DBA', 'SYSDBA', 'SYSOPER');

-- 检查默认账户状态
SELECT username, account_status FROM dba_users WHERE username IN ('SCOTT', 'ADAMS', 'JONES', 'CLARK', 'KING');

-- 检查密码策略
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD';

权限检查

检查内容

  • 检查用户权限分配是否合理
  • 检查角色权限是否过于宽松
  • 检查系统权限和对象权限
  • 检查权限继承情况

检查命令

sql
-- 检查用户系统权限
SELECT grantee, privilege FROM dba_sys_privs WHERE grantee NOT IN ('SYS', 'SYSTEM');

-- 检查用户对象权限
SELECT grantee, owner, table_name, privilege FROM dba_tab_privs WHERE grantee NOT IN ('SYS', 'SYSTEM');

-- 检查角色权限
SELECT role, privilege FROM dba_sys_privs WHERE grantee IN (SELECT role FROM dba_roles);

-- 检查权限继承
SELECT grantee, granted_role, admin_option FROM dba_role_privs;

密码策略检查

检查内容

  • 检查密码复杂度要求
  • 检查密码过期设置
  • 检查密码锁定设置
  • 检查密码历史记录

检查命令

sql
-- 检查密码策略设置
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD';

-- 检查密码文件权限
$ ls -la $ORACLE_HOME/dbs/orapw*  # Linux/Unix
$ dir %ORACLE_HOME%\database\PWD*  # Windows

-- 检查密码验证函数
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION';

网络安全检查

监听器配置检查

检查内容

  • 检查监听器是否配置了访问控制
  • 检查监听器是否使用了加密
  • 检查监听器日志配置
  • 检查监听器状态和端口设置

检查命令

bash
# 检查监听器状态
$ lsnrctl status

# 检查监听器配置
$ lsnrctl show all

# 检查监听器访问控制配置
$ cat $ORACLE_HOME/network/admin/listener.ora

# 检查监听器日志
$ ls -la $ORACLE_BASE/diag/tnslsnr/*/listener/trace/

网络连接检查

检查内容

  • 检查网络服务名配置
  • 检查SQL*Net加密设置
  • 检查网络访问控制列表
  • 检查防火墙设置

检查命令

bash
# 检查网络服务名配置
$ cat $ORACLE_HOME/network/admin/tnsnames.ora

# 检查SQL*Net参数文件
$ cat $ORACLE_HOME/network/admin/sqlnet.ora

# 检查网络访问控制
SELECT * FROM dba_network_acls;

# 检查数据库链接
SELECT owner, db_link, username FROM dba_db_links;

加密设置检查

检查内容

  • 检查透明数据加密(TDE)设置
  • 检查网络传输加密设置
  • 检查密码文件加密
  • 检查备份加密设置

检查命令

sql
-- 检查TDE主密钥状态
SELECT * FROM v$encryption_wallet;

-- 检查表空间加密状态
SELECT tablespace_name, encrypted FROM dba_tablespaces;

-- 检查网络加密设置
SELECT parameter, value FROM v$parameter WHERE parameter LIKE '%encryption%';

-- 检查备份加密设置
RMAN> SHOW ENCRYPTION FOR DATABASE;

审计和监控检查

审计设置检查

检查内容

  • 检查审计是否启用
  • 检查审计级别设置
  • 检查审计日志配置
  • 检查审计策略

检查命令

sql
-- 检查审计是否启用
SELECT value FROM v$parameter WHERE name = 'audit_trail';

-- 检查审计文件位置
SELECT value FROM v$parameter WHERE name = 'audit_file_dest';

-- 检查审计策略
SELECT policy_name, enabled FROM dba_audit_policies;

-- 检查审计日志大小和数量
$ ls -la $ORACLE_BASE/admin/*/adump/

监控设置检查

检查内容

  • 检查性能监控设置
  • 检查告警设置
  • 检查安全事件监控
  • 检查系统资源监控

检查命令

sql
-- 检查性能监控设置
SELECT * FROM dba_hist_wr_control;

-- 检查告警设置
SELECT metric_name, warning_threshold, critical_threshold FROM dba_thresholds;

-- 检查安全事件
SELECT * FROM dba_audit_session ORDER BY timestamp DESC;

-- 检查系统资源使用情况
SELECT * FROM v$resource_limit;

日志管理检查

检查内容

  • 检查日志文件权限
  • 检查日志轮转设置
  • 检查日志保留策略
  • 检查日志备份情况

检查命令

bash
# 检查告警日志权限
$ ls -la $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log

# 检查审计日志权限
$ ls -la $ORACLE_BASE/admin/*/adump/

# 检查监听日志权限
$ ls -la $ORACLE_BASE/diag/tnslsnr/*/listener/trace/listener.log

# 检查日志空间使用情况
$ du -sh $ORACLE_BASE/diag/

数据保护检查

表空间和数据文件检查

检查内容

  • 检查表空间权限
  • 检查数据文件权限和位置
  • 检查临时表空间设置
  • 检查撤销表空间设置

检查命令

sql
-- 检查表空间权限
SELECT tablespace_name, owner, privilege FROM dba_ts_quotas;

-- 检查数据文件位置和权限
SELECT name FROM v$datafile;
$ ls -la /path/to/datafiles/  # Linux/Unix

-- 检查临时表空间
SELECT tablespace_name, status FROM dba_tablespaces WHERE contents = 'TEMPORARY';

-- 检查撤销表空间
SELECT tablespace_name, status FROM dba_tablespaces WHERE contents = 'UNDO';

敏感数据检查

检查内容

  • 检查敏感数据存储位置
  • 检查敏感数据加密情况
  • 检查敏感数据访问控制
  • 检查敏感数据审计

检查命令

sql
-- 查找可能包含敏感数据的表
SELECT owner, table_name, column_name FROM dba_tab_columns 
WHERE column_name LIKE '%PASS%' OR column_name LIKE '%CRED%' OR column_name LIKE '%SSN%' OR column_name LIKE '%CARD%';

-- 检查敏感数据加密
SELECT owner, table_name, column_name, encryption_alg FROM dba_tab_cols WHERE encryption_alg IS NOT NULL;

-- 检查敏感数据访问控制
SELECT grantee, owner, table_name, privilege FROM dba_tab_privs 
WHERE table_name IN (SELECT table_name FROM dba_tab_columns 
WHERE column_name LIKE '%PASS%' OR column_name LIKE '%CRED%');

备份安全检查

检查内容

  • 检查备份文件权限
  • 检查备份加密设置
  • 检查备份访问控制
  • 检查备份存储位置

检查命令

bash
# 检查备份文件权限
$ ls -la /path/to/backup/  # Linux/Unix

# 检查RMAN备份加密设置
RMAN> SHOW ENCRYPTION FOR DATABASE;

# 检查备份访问控制
$ find /path/to/backup -type f -perm /o+r -ls  # 检查是否有其他用户可读的备份文件

# 检查备份保留策略
RMAN> SHOW RETENTION POLICY;

补丁和更新管理检查

补丁状态检查

检查内容

  • 检查数据库补丁级别
  • 检查安全补丁安装情况
  • 检查补丁历史记录
  • 检查补丁兼容性

检查命令

sql
-- 检查数据库版本和补丁级别
SELECT * FROM v$version;

-- 检查补丁信息
SELECT * FROM dba_registry_history;

-- 检查安全补丁状态
$ opatch lsinventory  # Linux/Unix

-- 检查OPatch版本
$ opatch version  # Linux/Unix

更新策略检查

检查内容

  • 检查更新计划和流程
  • 检查更新测试策略
  • 检查更新回滚计划
  • 检查更新文档

检查命令

bash
# 检查更新日志
$ cat update_log.txt  # 假设有更新日志文件

# 检查补丁应用脚本
$ ls -la /path/to/patch/scripts/  # 检查是否有补丁应用脚本

# 检查更新计划文档
$ ls -la /path/to/update/plans/  # 检查是否有更新计划文档

安全配置最佳实践

用户和权限管理

  • 最小权限原则:只授予用户必要的权限
  • 定期权限审查:定期检查和撤销不必要的权限
  • 特权账户管理:严格控制SYSDBA等特权账户的使用
  • 角色分离:实现职责分离,避免权限集中
  • 密码管理:实施强密码策略,定期更改密码

网络安全

  • 监听器安全:配置监听器访问控制和加密
  • 网络加密:启用SQL*Net加密和数据传输加密
  • 防火墙设置:配置防火墙限制数据库访问
  • 网络访问控制:使用网络访问控制列表限制连接
  • 端口安全:使用非默认端口,避免使用常用端口

审计和监控

  • 全面审计:启用适当级别的审计
  • 实时监控:实施实时安全事件监控
  • 日志管理:定期归档和清理审计日志
  • 告警机制:设置安全事件告警
  • 定期检查:定期检查审计日志和安全事件

数据保护

  • 数据加密:对敏感数据实施透明数据加密(TDE)
  • 备份加密:启用备份加密保护备份数据
  • 访问控制:实施细粒度的访问控制
  • 数据脱敏:对非生产环境数据进行脱敏
  • 定期备份:实施定期备份策略

补丁管理

  • 及时更新:及时应用安全补丁
  • 测试流程:在测试环境中验证补丁
  • 回滚计划:制定补丁回滚计划
  • 补丁跟踪:跟踪补丁应用情况和状态
  • 合规性检查:确保符合行业合规要求

版本差异

Oracle 10g

  • 提供基本的安全功能
  • 支持审计和基本的密码策略
  • 支持网络加密
  • 安全功能相对有限

Oracle 11g

  • 增强了审计功能
  • 引入了透明数据加密(TDE)
  • 提供了更强大的密码策略
  • 引入了审计 vault
  • 增强了网络安全功能

Oracle 12c及以上

  • 引入了多租户架构的安全管理
  • 增强了细粒度访问控制
  • 提供了数据红action功能
  • 引入了统一审计
  • 增强了加密和密钥管理

常见问题(FAQ)

Q1: 如何检查Oracle数据库是否存在默认账户?

A1: 可以使用以下SQL语句检查默认账户:

sql
SELECT username, account_status FROM dba_users WHERE username IN ('SCOTT', 'ADAMS', 'JONES', 'CLARK', 'KING', 'MILLER', 'SYSTEM', 'SYS');

对于SCOTT等示例账户,建议锁定或删除,只保留必要的系统账户。

Q2: 如何检查Oracle数据库的审计设置?

A2: 可以使用以下SQL语句检查审计设置:

sql
SELECT value FROM v$parameter WHERE name = 'audit_trail';
SELECT value FROM v$parameter WHERE name = 'audit_file_dest';
SELECT policy_name, enabled FROM dba_audit_policies;

建议将audit_trail设置为DB或DB,EXTENDED,以启用数据库审计功能。

Q3: 如何检查Oracle监听器的安全配置?

A3: 可以使用以下命令检查监听器配置:

bash
$ lsnrctl status
$ cat $ORACLE_HOME/network/admin/listener.ora
$ cat $ORACLE_HOME/network/admin/sqlnet.ora

建议配置监听器访问控制、使用非默认端口、启用监听器日志。

Q4: 如何检查Oracle数据库的密码策略?

A4: 可以使用以下SQL语句检查密码策略:

sql
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD';

建议设置强密码策略,包括密码复杂度、过期时间、锁定设置等。

Q5: 如何检查Oracle数据库的补丁级别?

A5: 可以使用以下命令检查补丁级别:

sql
SELECT * FROM v$version;

在Linux/Unix系统上,还可以使用:

bash
$ opatch lsinventory

建议及时应用安全补丁,保持数据库版本的安全性。

Q6: 如何检查Oracle数据库的网络加密设置?

A6: 可以使用以下SQL语句检查网络加密设置:

sql
SELECT parameter, value FROM v$parameter WHERE parameter LIKE '%encryption%';

也可以检查sqlnet.ora文件:

bash
$ cat $ORACLE_HOME/network/admin/sqlnet.ora

建议启用SQL*Net加密以保护网络传输的数据。

Q7: 如何检查Oracle数据库的敏感数据?

A7: 可以使用以下SQL语句查找可能包含敏感数据的表:

sql
SELECT owner, table_name, column_name FROM dba_tab_columns 
WHERE column_name LIKE '%PASS%' OR column_name LIKE '%CRED%' OR column_name LIKE '%SSN%' OR column_name LIKE '%CARD%' OR column_name LIKE '%PHONE%' OR column_name LIKE '%EMAIL%';

建议对敏感数据实施加密和访问控制。

Q8: 如何检查Oracle数据库的备份安全?

A8: 可以使用以下命令检查备份安全:

bash
$ ls -la /path/to/backup/  # 检查备份文件权限
RMAN> SHOW ENCRYPTION FOR DATABASE;  # 检查备份加密设置
RMAN> SHOW RETENTION POLICY;  # 检查备份保留策略

建议启用备份加密,设置合理的备份保留策略,确保备份文件的安全存储。

Q9: 如何检查Oracle数据库的权限分配?

A9: 可以使用以下SQL语句检查权限分配:

sql
SELECT grantee, privilege FROM dba_sys_privs WHERE grantee NOT IN ('SYS', 'SYSTEM');
SELECT grantee, owner, table_name, privilege FROM dba_tab_privs WHERE grantee NOT IN ('SYS', 'SYSTEM');

建议遵循最小权限原则,只授予用户必要的权限,并定期审查权限分配。

Q10: 如何检查Oracle数据库的安全事件?

A10: 可以使用以下SQL语句检查安全事件:

sql
SELECT * FROM dba_audit_session ORDER BY timestamp DESC;
SELECT * FROM dba_audit_trail WHERE action_name LIKE '%LOGON%' ORDER BY timestamp DESC;

建议定期检查审计日志,监控异常的登录尝试和安全事件。