Oracle 安全深度解析
Oracle 安全深度解析
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 安全体系[1]:
层次:
- 认证
- 授权
- 加密
- 审计
- 数据保护
详细见:Oracle 数据库安全机制。
2. 用户管理
2.1 创建
CREATE USER alice
IDENTIFIED BY ******
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users
PROFILE default
PASSWORD EXPIRE
ACCOUNT UNLOCK;
2.2 修改
ALTER USER alice IDENTIFIED BY ******
ALTER USER alice DEFAULT ROLE ALL EXCEPT dba;
ALTER USER alice ACCOUNT LOCK;
ALTER USER alice QUOTA UNLIMITED ON users;
2.3 删除
DROP USER alice CASCADE;
3. SYS / SYSTEM
3.1 SYS
- 数据字典所有者
- SYSDBA
- 不可删除
3.2 SYSTEM
- 管理工具
- DBA
- 可锁定
3.3 SYSDBA / SYSOPER
-- SYSDBA
CONNECT sys/Oracle123 AS SYSDBA
-- SYSOPER
CONNECT sys/Oracle123 AS SYSOPER
-- 授权
GRANT SYSDBA TO alice;
4. 权限
4.1 系统
GRANT CREATE SESSION TO alice;
GRANT CREATE TABLE TO alice;
GRANT CREATE PROCEDURE TO alice;
GRANT SELECT ANY TABLE TO alice;
4.2 对象
GRANT SELECT, INSERT ON employees TO alice;
GRANT EXECUTE ON my_pkg TO alice;
GRANT REFERENCES ON employees TO alice;
4.3 WITH GRANT OPTION
GRANT SELECT ON employees TO alice WITH GRANT OPTION;
-- alice 可再授权
5. 角色
5.1 创建
CREATE ROLE app_role;
GRANT SELECT ON employees TO app_role;
GRANT app_role TO alice;
5.2 预定义
- CONNECT
- RESOURCE
- DBA
- SYSDBA
- SYSOPER
5.3 启用/禁用
SET ROLE app_role;
SET ROLE ALL EXCEPT dba;
SET ROLE NONE;
6. Profile
6.1 创建
CREATE PROFILE app_profile LIMIT
SESSIONS_PER_USER 5
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL 30000
CONNECT_TIME 60
IDLE_TIME 30
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_TIME 30
PASSWORD_REUSE_MAX 5
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7
PASSWORD_VERIFY_FUNCTION verify_function;
6.2 分配
ALTER USER alice PROFILE app_profile;
7. 密码策略
7.1 复杂度
CREATE OR REPLACE FUNCTION verify_function(
username VARCHAR2,
password VARCHAR2,
old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
-- 长度
IF LENGTH(password) < 8 THEN
RETURN FALSE;
END IF;
-- 复杂度
IF NOT REGEXP_LIKE(password, '[A-Z]') THEN
RETURN FALSE;
END IF;
IF NOT REGEXP_LIKE(password, '[a-z]') THEN
RETURN FALSE;
END IF;
IF NOT REGEXP_LIKE(password, '[0-9]') THEN
RETURN FALSE;
END IF;
RETURN TRUE;
END;
/
7.2 默认
@?/rdbms/admin/utlpwdmg.sql
8. TDE(Transparent Data Encryption)
8.1 启用
-- 1. Wallet
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY ******
ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY ******
-- 2. 表空间
CREATE TABLESPACE secure_ts DATAFILE '...' SIZE 100M ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);
-- 3. 列
ALTER TABLE employees MODIFY (ssn ENCRYPT USING 'AES256');
详细见:Oracle TDE 透明数据加密。
9. VPD(Virtual Private Database)
9.1 策略
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'scott',
object_name => 'employees',
policy_name => 'emp_policy',
function_schema => 'sys',
policy_function => 'emp_sec_func',
statement_types => 'select, insert, update, delete'
);
END;
/
9.2 函数
CREATE OR REPLACE FUNCTION emp_sec_func(
schema_var IN VARCHAR2,
table_var IN VARCHAR2
) RETURN VARCHAR2 IS
v_user VARCHAR2(100);
BEGIN
v_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
RETURN 'dept_id IN (SELECT id FROM departments WHERE mgr = ''' || v_user || ''')';
END;
/
详细见:Oracle VPD 虚拟专用数据库。
10. Database Vault
10.1 概述
- 分离职责
- 多层访问控制
- DBA 限制
10.2 Realm
- 保护对象
- Realm Owner
- Realm Authorization
11. Data Redaction
11.1 策略
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'scott',
object_name => 'employees',
policy_name => 'redact_ssn',
column_name => 'ssn',
function_type => DBMS_REDACT.FULL,
expression => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') != ''HR'''
);
END;
/
详细见:Oracle Data Redaction 数据脱敏。
12. Label Security
-- 标签
SA_SYSDBA.CREATE_POLICY('EMP_POLICY', 'EMP_LABEL');
-- 表
SA_COMPONENTS.CREATE_LEVEL('EMP_POLICY', 100, 'S', 'SECRET');
SA_COMPONENTS.CREATE_LEVEL('EMP_POLICY', 90, 'C', 'CONFIDENTIAL');
-- 应用
SA_POLICY_ADMIN.APPLY_TABLE_POLICY('EMP_POLICY', 'SCOTT', 'EMPLOYEES');
13. 审计
13.1 传统
AUDIT SELECT ON employees BY ACCESS;
AUDIT CREATE TABLE BY alice BY ACCESS;
AUDIT ALL;
NOAUDIT ALL;
13.2 Unified Audit(12c+)
CREATE AUDIT POLICY emp_audit
PRIVILEGES SELECT ANY TABLE
ACTIONS SELECT ON scott.employees
WHENEVER SUCCESSFUL;
AUDIT POLICY emp_audit BY alice;
详细见:Oracle Audit 审计配置。
14. 网络加密
14.1 Native
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
14.2 SSL
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
WALLET_LOCATION = (SOURCE = ...)
详细见:Oracle 网络加密与 SSL。
15. SQL Firewall(23ai+)
BEGIN
DBMS_SQL_FIREWALL.CREATE_PROFILE('app_profile');
DBMS_SQL_FIREWALL.ENABLE_PROFILE('app_profile');
DBMS_SQL_FIREWALL.SET_MODE('app_profile', 'LEARN');
END;
/
16. 监控
16.1 登录
SELECT
username,
userhost,
terminal,
timestamp,
action_name
FROM dba_audit_session
WHERE timestamp > SYSDATE - 1;
16.2 失败登录
SELECT * FROM dba_audit_session WHERE returncode != 0;
16.3 用户
SELECT username, account_status, lock_date, expiry_date
FROM dba_users;
17. 常见坑与排错
17.1 ORA-01017
- 用户名/密码错
- 大小写敏感
- sec_case_sensitive_logon
17.2 ORA-28000
- 账户锁定
- FAILED_LOGIN_ATTEMPTS
- ALTER USER ... ACCOUNT UNLOCK
17.3 ORA-28365
- Wallet 未打开
- ALTER SYSTEM SET WALLET OPEN
18. 最佳实践
- 最小权限:安全
- 角色管理:清晰
- 密码策略:复杂
- Profile:资源
- TDE:加密
- VPD:行级
- Database Vault:DBA 控制
- Redaction:脱敏
- 审计:监控
- 网络加密:传输
19. 参考资料
[1] Oracle Database Security Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/