2026年CentOS Oracle数据库安全管理完全指南:从身份验证到审计(2026)

一、Oracle数据库安全概述

1.1 安全威胁类型

Oracle数据库面临多种安全威胁:

  • SQL注入:恶意SQL代码注入
  • 暴力破解:针对用户密码的攻击
  • 权限提升:普通用户获取管理权限
  • 数据泄露:未授权访问敏感数据
  • 审计绕过:规避安全审计

1.2 安全策略框架

Oracle数据库安全包括以下几个方面:

层次 措施 说明
身份验证 强密码策略、双因素认证 确保用户身份真实
授权管理 最小权限原则、角色分离 控制用户访问
数据保护 加密、脱敏、备份 保护数据机密性
审计监控 日志记录、入侵检测 发现安全事件

二、身份验证配置

2.1 密码策略配置

-- 1. 查看当前密码策略
SELECT profile, resource_name, limit FROM dba_profiles
WHERE resource_type = 'PASSWORD';

-- 2. 创建强密码策略
CREATE PROFILE secure_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LIFE_TIME 90
  PASSWORD_REUSE_MAX 5
  PASSWORD_REUSE_TIME 180
  PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

-- 3. 将策略分配给用户
ALTER USER system PROFILE secure_profile;

-- 4. 强制修改默认密码
ALTER USER scott IDENTIFIED BY "NewStrongPass123!";
ALTER USER scott ACCOUNT LOCK;

2.2 Oracle密码验证函数

-- 1. 使用Oracle内置验证函数
-- 默认函数:ORA12C_VERIFY_FUNCTION

-- 2. 创建自定义验证函数
CREATE OR REPLACE FUNCTION verify_password(
  p_username VARCHAR2,
  p_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
  -- 检查密码长度(至少12位)
  IF LENGTH(p_password) < 12 THEN
    RETURN FALSE;
  END IF;

  -- 检查包含大写字母
  IF NOT REGEXP_LIKE(p_password, '[A-Z]') THEN
    RETURN FALSE;
  END IF;

  -- 检查包含小写字母
  IF NOT REGEXP_LIKE(p_password, '[a-z]') THEN
    RETURN FALSE;
  END IF;

  -- 检查包含数字
  IF NOT REGEXP_LIKE(p_password, '[0-9]') THEN
    RETURN FALSE;
  END IF;

  -- 检查包含特殊字符
  IF NOT REGEXP_LIKE(p_password, '[!@#$%^&*()]') THEN
    RETURN FALSE;
  END IF;

  -- 检查不包含用户名
  IF INSTR(UPPER(p_password), UPPER(p_username)) > 0 THEN
    RETURN FALSE;
  END IF;

  RETURN TRUE;
END verify_password;
/

-- 3. 创建使用自定义函数的配置文件
CREATE PROFILE custom_profile LIMIT
  PASSWORD_VERIFY_FUNCTION verify_password;

2.3 双因素认证

-- 1. 启用Oracle Database Vault(需要许可证)
BEGIN
  DVSYS.DBMS_MACADM.ENABLE_DATABASE_VAULT;
END;
/

-- 2. 配置Oracle Wallet存储密码
-- 在服务器端
mkstore -wrl /u01/app/oracle/wallet -create
mkstore -wrl /u01/app/oracle/wallet -createCredential ORCL system "password"

-- 3. 配置sqlnet.ora
echo "WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/wallet)))" >> $ORACLE_HOME/network/admin/sqlnet.ora
echo "SQLNET.WALLET_OVERRIDE=TRUE" >> $ORACLE_HOME/network/admin/sqlnet.ora

-- 4. 用户使用Wallet登录(无需密码)
sqlplus /@ORCL

三、授权管理

3.1 最小权限原则

-- 1. 查看用户当前权限
SELECT * FROM user_sys_privs;
SELECT * FROM user_tab_privs;

-- 2. 创建应用用户(最小权限)
CREATE USER app_user IDENTIFIED BY "AppPass123!";
GRANT CREATE SESSION TO app_user;

-- 3. 只授予必要的表访问权限
GRANT SELECT, INSERT, UPDATE, DELETE ON scott.emp TO app_user;
GRANT SELECT ON scott.dept TO app_user;

-- 4. 撤销不必要的权限
REVOKE CREATE ANY TABLE FROM app_user;
REVOKE CREATE ANY PROCEDURE FROM app_user;

3.2 角色管理

-- 1. 创建应用角色
CREATE ROLE app_read_role;
CREATE ROLE app_write_role;
CREATE ROLE app_admin_role;

-- 2. 为角色分配权限
GRANT SELECT ON scott.emp TO app_read_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON scott.emp TO app_write_role;
GRANT app_read_role TO app_write_role;
GRANT app_write_role TO app_admin_role;

-- 3. 将角色分配给用户
GRANT app_read_role TO app_user;
GRANT app_write_role TO app_admin;

-- 4. 查看角色权限
SELECT * FROM role_tab_privs WHERE role = 'APP_READ_ROLE';
SELECT * FROM role_sys_privs WHERE role = 'APP_WRITE_ROLE';

-- 5. 默认角色设置
ALTER USER app_user DEFAULT ROLE app_read_role;

3.3 权限委托

-- 1. 使用GRANT OPTION(慎用)
GRANT SELECT ON scott.emp TO app_user WITH GRANT OPTION;

-- 2. 使用ADMIN OPTION
GRANT CREATE ANY TABLE TO app_admin WITH ADMIN OPTION;

-- 3. 查看权限继承关系
SELECT grantee, owner, table_name, privilege
FROM dba_tab_privs
WHERE grantor = 'APP_USER';

四、数据保护

4.1 TDE透明数据加密

-- 1. 创建Wallet目录
mkdir -p /u01/app/oracle/wallet
chmod 700 /u01/app/oracle/wallet

-- 2. 配置sqlnet.ora
echo "ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/wallet)))" >> $ORACLE_HOME/network/admin/sqlnet.ora

-- 3. 创建加密密钥
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/wallet' IDENTIFIED BY "WalletPass123!";

-- 4. 打开Wallet
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "WalletPass123!";

-- 5. 创建加密表空间
CREATE TABLESPACE encrypted_ts DATAFILE '/u01/app/oracle/oradata/orcl/encrypted01.dbf' SIZE 100M
ENCRYPTION DEFAULT STORAGE(ENCRYPT);

-- 6. 在加密表空间中创建表
CREATE TABLE sensitive_data (
  id NUMBER,
  name VARCHAR2(50),
  ssn VARCHAR2(20) ENCRYPT
) TABLESPACE encrypted_ts;

-- 7. 查看加密列
SELECT column_name, encryption_alg
FROM dba_encrypted_columns;

4.2 数据脱敏

-- 1. 创建脱敏函数
CREATE OR REPLACE FUNCTION mask_ssn(p_ssn VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  IF p_ssn IS NULL THEN
    RETURN NULL;
  END IF;
  RETURN 'XXX-XX-' || SUBSTR(p_ssn, -4);
END mask_ssn;
/

-- 2. 创建视图进行数据脱敏
CREATE OR REPLACE VIEW emp_masked_v AS
SELECT
  employee_id,
  first_name,
  last_name,
  email,
  mask_ssn(ssn) AS ssn,
  phone_number
FROM employees;

-- 3. 对普通用户隐藏原始数据
REVOKE SELECT ON employees FROM app_user;
GRANT SELECT ON emp_masked_v TO app_user;

-- 4. 使用Oracle Data Redaction(企业版)
BEGIN
  DBMS_REDACT.ADD_POLICY(
    object_schema => 'SCOTT',
    object_name => 'EMP',
    column_name => 'SAL',
    policy_name => 'REDACT_SAL'
  );
END;
/

4.3 数据备份加密

# 1. 创建加密备份
expdp system/password@orcl directory=backup_dir dumpfile=encrypted.dmp encryption=all encrypt_password="BackupPass123!" schemas=scott

# 2. 使用RMAN加密备份
rman target /
RMAN> SET ENCRYPTION ON;
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

# 3. 恢复加密备份
impdp system/password@orcl directory=backup_dir dumpfile=encrypted.dmp encryption_password=BackupPass123!

五、审计监控

5.1 统一审计

-- 1. 启用统一审计
BEGIN
  DBMS_AUDIT_MGMT.INIT_AUDIT_MGMT(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
    AUDIT_TRAIL_PURGE_INTERVAL => 24
  );
END;
/

-- 2. 创建审计策略
CREATE AUDIT POLICY db_security_policy
  ACTIONS CREATE USER, ALTER USER, DROP USER,
         GRANT ANY PRIVILEGE, GRANT ANY ROLE,
         CREATE ANY PROCEDURE, DROP ANY PROCEDURE;

-- 3. 启用审计策略
AUDIT POLICY db_security_policy BY SYS;

-- 4. 查看审计记录
SELECT event_timestamp, os_username, db_username, action_name, object_name
FROM UNIFIED_AUDIT_TRAIL
WHERE db_username = 'APP_USER';

-- 5. 审计成功和失败操作
AUDIT POLICY db_security_policy BY SYS WHENEVER SUCCESSFUL;
AUDIT POLICY db_security_policy BY SYS WHENEVER NOT SUCCESSFUL;

5.2 标准审计

-- 1. 审计登录
AUDIT SESSION;

-- 2. 审计DDL操作
AUDIT CREATE TABLE;
AUDIT DROP TABLE;
AUDIT CREATE INDEX;

-- 3. 审计特定用户操作
AUDIT SELECT, INSERT, UPDATE, DELETE ON scott.emp BY app_user;

-- 4. 查看审计日志
SELECT username, timestamp, action_name, object_name
FROM dba_audit_trail
WHERE username = 'APP_USER';

-- 5. 查看审计记录位置
SELECT * FROM dba_audit_trail WHERE ROWNUM <= 1;

5.3 入侵检测

-- 1. 检测暴力破解
-- 创建触发器记录失败登录
CREATE OR REPLACE TRIGGER log_failed_login
  AFTER SERVERERROR ON DATABASE
DECLARE
  v_ip VARCHAR2(50);
  v_user VARCHAR2(50);
BEGIN
  IF ORA_SERVER_ERROR(1017) THEN
    SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') INTO v_ip FROM DUAL;
    SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER') INTO v_user FROM DUAL;

    INSERT INTO failed_login_log VALUES (SYSDATE, v_user, v_ip);
  END IF;
END;
/

-- 2. 创建失败登录监控表
CREATE TABLE failed_login_log (
  log_time TIMESTAMP,
  username VARCHAR2(50),
  ip_address VARCHAR2(50)
);

-- 3. 检测可疑操作
SELECT username, timestamp, action_name, return_code
FROM dba_audit_trail
WHERE action_name IN ('LOGON', 'LOGOFF')
  AND timestamp > SYSDATE - 1;

-- 4. 设置账户锁定策略
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;

六、网络安全

6.1 监听器安全

# 1. 限制监听器访问IP
# 编辑listener.ora
nano $ORACLE_HOME/network/admin/listener.ora

# 添加:
ADMIN_RESTRICTIONS_LISTENER = ON

# 2. 使用TCPS协议
# 编辑listener.ora
nano $ORACLE_HOME/network/admin/listener.ora

# 添加:
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 1522))
  )

# 3. 配置防火墙限制
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="1521" protocol="tcp" accept'
firewall-cmd --reload

6.2 SQLNet安全

# 1. 禁用非必要协议
# 编辑sqlnet.ora
nano $ORACLE_HOME/network/admin/sqlnet.ora

# 添加:
SQLNET.AUTHENTICATION_SERVICES = (BEQ)
SQLNET.EXPIRE_TIME = 10

# 2. 启用连接加密
SQLNET.ENCRYPTION_CLIENT = REQUESTED
SQLNET.ENCRYPTION_SERVER = REQUIRED

# 3. 禁用BEQ协议
BEQ.PROTOCOL_STACK = EXCLUSIVE

6.3 使用Oracle Connection Manager

# 1. 配置Oracle Connection Manager
nano $ORACLE_HOME/network/admin/cman.ora

# 添加:
CMAN =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1525))

CMAN_RULES =
  (RULE_LIST =
    (RULE =
      (SRC = 192.168.1.0/255.255.255.0)
      (DST = 192.168.1.100)
      (SRV = *)
      (ACT = ACCEPT)
    )
  )

# 2. 启动CMAN
cmadm start cman

# 3. 配置客户端使用CMAN
# 编辑tnsnames.ora
CMAN_HOST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1525))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

七、操作系统级安全

7.1 文件权限

# 1. 设置Oracle文件权限
chown oracle:oinstall $ORACLE_HOME -R
chmod 755 $ORACLE_HOME -R

# 2. 设置数据文件权限
chmod 600 /u01/app/oracle/oradata/orcl/*.dbf

# 3. 设置Wallet文件权限
chmod 700 /u01/app/oracle/wallet

# 4. 检查权限
ls -la $ORACLE_HOME/bin | head -10

7.2 SELinux配置

# 1. 检查SELinux状态
getenforce

# 2. 设置SELinux为permissive模式
sudo setenforce permissive

# 3. 配置Oracle SELinux策略
sudo semodule -i oracle.pp

# 4. 查看Oracle相关进程
ps -efZ | grep ora_

7.3 防火墙配置

# 1. 开放必要端口
firewall-cmd --permanent --add-port=1521/tcp
firewall-cmd --permanent --add-port=1522/tcp

# 2. 限制管理端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="1521" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" accept'

# 3. 拒绝外部访问管理端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="1158" protocol="tcp" drop'

# 4. 重启防火墙
firewall-cmd --reload

八、安全最佳实践

8.1 定期安全检查

-- 1. 检查所有用户密码状态
SELECT username, account_status, lock_date, expiry_date
FROM dba_users
WHERE account_status = 'EXPIRED';

-- 2. 检查PUBLIC权限
SELECT * FROM dba_tab_privs WHERE grantee = 'PUBLIC';

-- 3. 检查SYSDBA/SYSOPER用户
SELECT * FROM v$pwfile_users;

-- 4. 检查非默认端口
SELECT value FROM v$parameter WHERE name = 'local_listener';

-- 5. 检查审计配置
SELECT audit_type, always
FROM dba_audit_policies;

8.2 安全加固清单

□ 修改所有默认密码
□ 启用密码复杂度验证
□ 限制SYSDBA登录
□ 启用统一审计
□ 配置数据加密
□ 配置网络加密
□ 设置防火墙规则
□ 配置SELinux
□ 定期备份审计日志
□ 监控失败登录
□ 禁用不必要的服务
□ 定期更新安全补丁

8.3 应急响应

-- 1. 紧急锁定账户
ALTER USER suspected_user ACCOUNT LOCK;

-- 2. 撤销所有权限
REVOKE ALL FROM suspected_user;

-- 3. 删除用户
DROP USER suspected_user CASCADE;

-- 4. 查看最近的审计记录
SELECT * FROM UNIFIED_AUDIT_TRAIL
WHERE db_username = 'SUSPECTED_USER'
ORDER BY event_timestamp DESC;

-- 5. 导出安全事件日志
SPOOL /tmp/security_audit.log
SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE event_timestamp > SYSDATE - 7;
SPOOL OFF

九、总结

Oracle数据库安全管理是一个系统工程,包括:

  1. 身份验证:强密码策略、双因素认证、Wallet
  2. 授权管理:最小权限原则、角色分离、权限委托
  3. 数据保护:TDE透明加密、数据脱敏、备份加密
  4. 审计监控:统一审计、标准审计、入侵检测
  5. 网络安全:监听器安全、SQLNet安全、防火墙配置
  6. 操作系统安全:文件权限、SELinux、防火墙

核心要点
– 所有默认密码必须修改
– 使用密码验证函数强制复杂度
– 最小权限原则,撤销PUBLIC权限
– 启用数据加密保护敏感信息
– 统一审计跟踪所有重要操作
– 配置防火墙限制访问来源
– 定期进行安全检查和更新

通过本文的指南,你可以在CentOS上构建安全的Oracle数据库环境。

注:本文基于CentOS 7/8和Oracle 19c编写,具体配置可能因版本差异而略有不同。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注