一、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数据库安全管理是一个系统工程,包括:
- 身份验证:强密码策略、双因素认证、Wallet
- 授权管理:最小权限原则、角色分离、权限委托
- 数据保护:TDE透明加密、数据脱敏、备份加密
- 审计监控:统一审计、标准审计、入侵检测
- 网络安全:监听器安全、SQLNet安全、防火墙配置
- 操作系统安全:文件权限、SELinux、防火墙
核心要点:
– 所有默认密码必须修改
– 使用密码验证函数强制复杂度
– 最小权限原则,撤销PUBLIC权限
– 启用数据加密保护敏感信息
– 统一审计跟踪所有重要操作
– 配置防火墙限制访问来源
– 定期进行安全检查和更新
通过本文的指南,你可以在CentOS上构建安全的Oracle数据库环境。
注:本文基于CentOS 7/8和Oracle 19c编写,具体配置可能因版本差异而略有不同。