在等保测评和日常运维中,Oracle数据库经常因为默认配置未调整而被扣分或者被攻击者利用。没有基线的数据库就像一栋没锁门的房子,再强的应用层防护也可能被绕过。本文从账号口令、权限角色、网络监听、审计日志以及参数补丁几个维度,给出可以直接落地的安全加固建议。

下面依次说明每个维度的检查点和配置方法。
一、账号与口令策略加固
Oracle安装完成后会默认创建一批账号,例如SYS、SYSTEM、DBSNMP、OUTLN、MDSYS等。很多账号的默认口令在网络上公开,如果不及时修改或锁定,攻击者可以直接用这些口令登录数据库。第一步应该列出所有默认账号和口令状态,将不使用的账号锁定并设置过期。
可以使用下面的SQL查看账号状态:
SELECT username, account_status, profile FROM dba_users ORDER BY username;
对于长期不使用的账号,执行锁定命令。例如锁定scott用户:
ALTER USER scott ACCOUNT LOCK;
同时需要修改默认口令。即使是SYS和SYSTEM,也必须设置强口令。强口令应包含大小写字母、数字和特殊字符,长度不低于12位。可以通过创建密码策略文件来强制所有用户遵循复杂度要求。
创建口令策略Profile并应用到用户:
CREATE PROFILE strong_pwd_profile LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 90 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 5 PASSWORD_GRACE_TIME 7 PASSWORD_VERIFY_FUNCTION ora12c_verify_function; ALTER USER app_user PROFILE strong_pwd_profile;
注意PASSWORD_VERIFY_FUNCTION在Oracle 12c及以上版本可以使用ora12c_verify_function或者自定义函数来检查口令复杂度。对于旧版本,需要手动创建验证函数。启用Profile后,新密码必须满足复杂度,否则会报错。这能大幅降低弱口令风险。
除了口令策略,还应该定期检查过期账号和密码即将过期的账号。可以使用如下查询:
SELECT username, expiry_date FROM dba_users WHERE account_status='OPEN';
通过账号锁定、默认口令修改和密码复杂度策略,数据库的基本入口安全得到保障。
二、权限与角色最小化
权限过大是Oracle安全事件的常见根源。很多业务账号为了部署方便直接授予DBA角色,一旦应用被SQL注入,攻击者就能获得数据库的最高权限。因此,权限最小化是加固基线中必须落实的一环。
首先要回收PUBLIC角色上的危险包执行权限。Oracle很多内置包默认授予PUBLIC,例如UTL_FILE、UTL_HTTP、DBMS_LOB、DBMS_SCHEDULER等。这些包可以被普通用户调用,用于读写服务器文件或发起网络请求,存在很大风险。
执行以下命令回收危险权限:
REVOKE EXECUTE ON UTL_FILE FROM PUBLIC; REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC; REVOKE EXECUTE ON UTL_TCP FROM PUBLIC; REVOKE EXECUTE ON DBMS_LOB FROM PUBLIC; REVOKE EXECUTE ON DBMS_SCHEDULER FROM PUBLIC;
回收后,需要将这些权限单独授予确实需要的账号,并限制其使用范围。例如只给数据交换账号授予UTL_FILE的读写权限,并指定目录对象。
然后检查用户拥有的系统权限和角色。使用下面的查询找出拥有DBA角色或高风险权限的用户:
SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role='DBA';
SELECT grantee, privilege FROM dba_sys_privs WHERE privilege IN ('ALTER SYSTEM','CREATE ANY TABLE','DROP ANY TABLE');
对于非管理员账号,坚决回收DBA角色。业务账号只需要连接、增删改查基本权限即可。可以采用角色分层的方式:创建应用角色,只授予必要的对象权限,再将角色授予业务用户。这样即使某个账号泄露,影响面也受到控制。
另外,还要关注用户对数据字典的访问权限。Oracle早期版本中PUBLIC可以查询很多敏感视图,建议关闭O7_DICTIONARY_ACCESSIBILITY参数,并限制用户对DBA_视图的查询权限。
三、网络与监听加固
Oracle监听器是外部访问数据库的必经通道,如果监听器配置不当,攻击者可以通过远程命令修改监听配置、获取数据库实例信息,甚至发起拒绝服务攻击。因此,监听加固是网络层面的关键动作。
首先要限制监听器的远程管理。在listener.ora文件中添加ADMIN_RESTRICTIONS_LISTENER参数并设置为ON,禁止通过lsnrctl远程执行修改命令。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
)
)
ADMIN_RESTRICTIONS_LISTENER = ON
其次,启用监听器注册校验,防止恶意实例注册到监听器。在listener.ora中设置VALID_NODE_CHECKING_REGISTRATION_LISTENER为ON,并配置REGISTRATION_INVITED_NODES_LISTENER为允许的节点列表。
VALID_NODE_CHECKING_REGISTRATION_LISTENER = ON REGISTRATION_INVITED_NODES_LISTENER = 192.168.1.10, 192.168.1.11
对于需要跨网段访问的环境,可以在防火墙层面限制1521端口的来源IP,只允许应用服务器和数据交换服务器连接数据库。如果必须通过公网访问,强烈建议使用Oracle Net Encryption或者TCPS协议,保证传输数据不被窃听。
在sqlnet.ora中启用服务端加密和校验:
SQLNET.ENCRYPTION_SERVER = REQUIRED SQLNET.ENCRYPTION_TYPES_SERVER = (AES256) SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256)
通过以上配置,监听器被远程操控的风险大幅降低,数据在网络传输过程中的安全性也得到提升。
四、审计与日志策略
没有审计的数据库一旦发生数据泄露,很难追溯是谁在什么时间执行了什么操作。审计是安全基线中实现可追溯性的重要手段。Oracle提供统一审计和传统审计两种方式,从12c开始推荐使用统一审计。
启用统一审计之前,需要确认audit_trail参数是否为DB或DB,EXTENDED。可以使用以下命令设置:
ALTER SYSTEM SET audit_trail=DB,EXTENDED SCOPE=SPFILE;
然后重启数据库使参数生效。之后可以创建审计策略,对关键操作进行审计。例如审计所有用户登录失败和DDL语句:
CREATE AUDIT POLICY audit_login_fail ACTIONS LOGON; CREATE AUDIT POLICY audit_ddl ACTIONS CREATE TABLE, ALTER TABLE, DROP TABLE; AUDIT POLICY audit_login_fail WHENEVER NOT SUCCESSFUL; AUDIT POLICY audit_ddl;
统一审计记录会写入UNIFIED_AUDIT_TRAIL视图,可以定期查询并归档。同时要防止审计表空间被写满导致数据库挂起,建议将审计数据定期导出到外部存储,并监控表空间使用率。
传统审计方式同样有效,例如启用对SYSDBA操作的审计:
AUDIT SYSDBA; AUDIT SESSION WHENEVER NOT SUCCESSFUL;
无论采用哪种审计方式,都要确保审计日志的保存期限满足合规要求,并对审计日志的访问权限进行限制,防止攻击者删除审计记录。
五、参数与补丁加固
Oracle数据库的一些初始化参数如果保持默认值,会带来安全风险。需要通过修改参数来关闭不必要的功能,减少攻击面。
例如,REMOTE_OS_AUTHENT参数控制操作系统远程认证,默认值可能允许通过操作系统用户身份直接登录数据库,应设置为FALSE。UTL_FILE_DIR参数允许任意目录读写,建议清空或限制到指定目录。
ALTER SYSTEM SET REMOTE_OS_AUTHENT=FALSE SCOPE=SPFILE; ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY=FALSE SCOPE=SPFILE; ALTER SYSTEM SET UTL_FILE_DIR='' SCOPE=SPFILE;
另外,禁用不必要的数据库选项和外部过程调用。EXTPROC如果不需要,可以在listener.ora和tnsnames.ora中删除相关配置,避免通过外部过程提权。
补丁管理是基线中不可忽视的部分。Oracle每个季度会发布Critical Patch Update,包含安全漏洞修复。如果数据库长期不打补丁,即使前面的配置都做到位,也可能被已知漏洞利用。建议每季度评估并应用CPU或PSU,同时在测试环境验证后再上生产。
可以使用opatch工具查看已安装补丁:
$ORACLE_HOME/OPatch/opatch lsinventory
还可以使用DBSAT(Oracle Database Security Assessment Tool)定期扫描数据库安全状况,它能够自动发现配置缺陷和漏洞风险,并给出加固建议。将DBSAT检查结果纳入基线核查流程,持续改进安全状态。
Oracle数据库安全加固不是一蹴而就的工作,需要将账号口令、权限最小化、网络控制、审计追踪以及参数补丁等多个层面结合起来,形成可重复执行的基线检查项。每一台新部署的数据库都应该按照基线逐项核对,定期复查变更。只有把安全措施落实到每个环节,才能让数据库在面对内外部威胁时保持足够的防御能力。
Oracle数据库安全加固基线配置权限审计修改时间:2026-09-23 17:34:26