Skip to content

Oracle 权限管理

权限管理概述

Oracle 权限管理是数据库安全的重要组成部分,它控制着用户对数据库对象的访问和操作。合理的权限管理可以确保数据库的安全性,防止未授权的访问和操作,保护敏感数据。

权限管理的重要性

  • 保护数据安全:防止未授权的用户访问和修改敏感数据
  • 遵循最小权限原则:只授予用户执行任务所需的最小权限
  • 满足合规要求:如 GDPR、SOX 等合规要求需要严格的权限管理
  • 便于审计:记录用户的权限变更和操作,便于审计和追溯
  • 提高系统可靠性:防止误操作和恶意操作对系统造成损害

权限管理的挑战

  • 复杂的权限体系:Oracle 提供了细粒度的权限控制,权限体系较为复杂
  • 权限变更管理:随着业务需求的变化,需要频繁调整用户权限
  • 权限审计:需要记录和分析权限变更和操作,确保合规性
  • 跨部门协作:不同部门的用户需要不同的权限,需要协调管理
  • 云环境权限管理:在云环境中,权限管理需要考虑云服务提供商的安全模型

Oracle 权限体系

Oracle 权限体系包括系统权限和对象权限两种类型,它们分别控制着用户对系统资源和数据库对象的访问和操作。

1. 系统权限

系统权限是指用户对数据库系统资源的访问和操作权限,如创建用户、创建表、备份数据库等。

常用系统权限

权限名称描述
CREATE SESSION允许用户连接到数据库
CREATE TABLE允许用户在自己的 Schema 中创建表
CREATE VIEW允许用户在自己的 Schema 中创建视图
CREATE PROCEDURE允许用户在自己的 Schema 中创建存储过程
CREATE SEQUENCE允许用户在自己的 Schema 中创建序列
CREATE TRIGGER允许用户在自己的 Schema 中创建触发器
ALTER SESSION允许用户修改会话参数
ALTER SYSTEM允许用户修改系统参数
DROP USER允许用户删除用户
GRANT ANY PRIVILEGE允许用户授予任何系统权限

系统权限的授予和回收

sql
-- 授予系统权限
GRANT CREATE SESSION, CREATE TABLE TO scott;

-- 授予系统权限并允许传递
GRANT CREATE VIEW TO scott WITH ADMIN OPTION;

-- 回收系统权限
REVOKE CREATE TABLE FROM scott;

2. 对象权限

对象权限是指用户对数据库对象(如表、视图、存储过程等)的访问和操作权限,如 SELECT、INSERT、UPDATE、DELETE 等。

常用对象权限

权限名称描述适用对象
SELECT允许查询对象数据表、视图、序列
INSERT允许插入数据到对象表、视图
UPDATE允许更新对象数据表、视图
DELETE允许删除对象数据表、视图
ALTER允许修改对象结构表、视图、序列、存储过程等
EXECUTE允许执行对象存储过程、函数、包
REFERENCES允许在另一个表中创建引用该表的外键

对象权限的授予和回收

sql
-- 授予对象权限
GRANT SELECT, INSERT, UPDATE ON scott.employees TO hr;

-- 授予对象权限并允许传递
GRANT SELECT ON scott.employees TO hr WITH GRANT OPTION;

-- 授予所有对象权限
GRANT ALL ON scott.employees TO hr;

-- 回收对象权限
REVOKE UPDATE, DELETE ON scott.employees FROM hr;

3. 权限继承

Oracle 12c 引入了权限继承功能,允许用户从角色继承权限,简化了权限管理。

权限继承示例

sql
-- 创建角色
CREATE ROLE sales_role;

-- 授予角色权限
GRANT SELECT, INSERT, UPDATE ON sales.orders TO sales_role;

-- 创建用户并授予角色
CREATE USER sales_user IDENTIFIED BY password;
GRANT sales_role TO sales_user;

-- 启用权限继承
ALTER USER sales_user DEFAULT ROLE ALL;

用户管理

用户是 Oracle 数据库的访问主体,用户管理包括创建用户、修改用户、删除用户等操作。

1. 创建用户

创建用户是权限管理的第一步,需要指定用户名、密码和默认表空间等属性。

创建用户示例

sql
-- 创建用户
CREATE USER scott IDENTIFIED BY tiger
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users
  QUOTA 100M ON temp
  PROFILE default
  ACCOUNT UNLOCK;

-- 授予连接权限
GRANT CREATE SESSION TO scott;

用户属性说明

  • IDENTIFIED BY:指定用户密码
  • DEFAULT TABLESPACE:指定用户的默认表空间
  • TEMPORARY TABLESPACE:指定用户的临时表空间
  • QUOTA:指定用户在表空间上的配额
  • PROFILE:指定用户的配置文件,用于限制用户的资源使用
  • ACCOUNT UNLOCK:解锁用户账户

2. 修改用户

修改用户包括修改用户密码、默认表空间、配额等属性。

修改用户示例

sql
-- 修改用户密码
ALTER USER scott IDENTIFIED BY new_password;

-- 修改用户默认表空间
ALTER USER scott DEFAULT TABLESPACE new_tablespace;

-- 修改用户配额
ALTER USER scott QUOTA 200M ON users;

-- 锁定用户账户
ALTER USER scott ACCOUNT LOCK;

-- 解锁用户账户
ALTER USER scott ACCOUNT UNLOCK;

3. 删除用户

删除用户是权限管理的最后一步,需要注意删除用户的同时会删除该用户的所有对象。

删除用户示例

sql
-- 删除用户,但保留其对象
DROP USER scott;

-- 删除用户及其所有对象
DROP USER scott CASCADE;

4. 用户状态管理

Oracle 用户账户有多种状态,包括 OPEN、LOCKED、EXPIRED 等,需要根据业务需求管理用户状态。

用户状态示例

sql
-- 查看用户状态
SELECT username, account_status FROM dba_users WHERE username = 'SCOTT';

-- 使用户密码过期
ALTER USER scott PASSWORD EXPIRE;

-- 强制用户修改密码
ALTER USER scott PASSWORD EXPIRE FORCE;

角色管理

角色是一组权限的集合,它可以简化权限管理,便于批量授予和回收权限。

1. 创建角色

创建角色是角色管理的第一步,需要指定角色名称和验证方式。

创建角色示例

sql
-- 创建不验证的角色
CREATE ROLE sales_role;

-- 创建需要密码验证的角色
CREATE ROLE manager_role IDENTIFIED BY password;

-- 创建外部验证的角色
CREATE ROLE external_role IDENTIFIED EXTERNALLY;

-- 创建全局验证的角色
CREATE ROLE global_role IDENTIFIED GLOBALLY;

2. 授予角色权限

创建角色后,需要授予角色相应的权限,以便将这些权限传递给用户。

授予角色权限示例

sql
-- 授予角色系统权限
GRANT CREATE SESSION, CREATE TABLE TO sales_role;

-- 授予角色对象权限
GRANT SELECT, INSERT, UPDATE ON sales.orders TO sales_role;
GRANT SELECT, INSERT, UPDATE ON sales.order_items TO sales_role;

3. 授予角色给用户

创建角色并授予权限后,需要将角色授予用户,以便用户继承角色的权限。

授予角色给用户示例

sql
-- 授予角色给用户
GRANT sales_role, manager_role TO scott;

-- 授予角色给用户并允许管理角色
GRANT sales_role TO scott WITH ADMIN OPTION;

-- 设置用户的默认角色
ALTER USER scott DEFAULT ROLE sales_role, manager_role;

4. 修改角色

修改角色包括修改角色的验证方式、密码等属性。

修改角色示例

sql
-- 修改角色验证方式为密码验证
ALTER ROLE sales_role IDENTIFIED BY password;

-- 修改角色验证方式为不验证
ALTER ROLE sales_role NOT IDENTIFIED;

-- 修改角色密码
ALTER ROLE manager_role IDENTIFIED BY new_password;

5. 删除角色

删除角色会同时回收所有用户的该角色权限。

删除角色示例

sql
-- 删除角色
DROP ROLE sales_role;

6. 预定义角色

Oracle 提供了一些预定义角色,它们包含了常用的权限集合,便于快速授予用户权限。

常用预定义角色

角色名称描述
CONNECT包含基本的连接权限,如 CREATE SESSION
RESOURCE包含创建数据库对象的权限,如 CREATE TABLE、CREATE VIEW 等
DBA包含所有系统权限,是数据库管理员角色
EXP_FULL_DATABASE包含导出数据库的所有权限
IMP_FULL_DATABASE包含导入数据库的所有权限
SELECT_CATALOG_ROLE包含查询数据字典视图的权限
EXECUTE_CATALOG_ROLE包含执行数据字典存储过程的权限

预定义角色示例

sql
-- 授予预定义角色
GRANT CONNECT, RESOURCE TO scott;

权限授予和回收

权限授予和回收是权限管理的核心操作,需要遵循最小权限原则,只授予用户执行任务所需的最小权限。

1. 最小权限原则

最小权限原则是指只授予用户执行任务所需的最小权限,减少权限滥用的风险。

最小权限原则示例

sql
-- 错误示例:授予过多权限
GRANT DBA TO application_user;

-- 正确示例:只授予所需权限
GRANT CREATE SESSION TO application_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.employees TO application_user;

2. 权限授予的最佳实践

  • 使用角色管理权限:将权限分配给角色,再将角色分配给用户,简化权限管理
  • 遵循最小权限原则:只授予用户执行任务所需的最小权限
  • 定期审查权限:定期审查用户权限,撤销不再需要的权限
  • 使用命名约定:为角色和权限使用清晰的命名约定,便于管理和审计
  • 记录权限变更:记录所有权限变更,便于审计和追溯

3. 权限回收的注意事项

  • 权限回收的级联效应:回收角色权限会同时回收所有用户的该角色权限
  • WITH ADMIN OPTION 和 WITH GRANT OPTION 的区别
    • WITH ADMIN OPTION:授予系统权限时使用,回收系统权限不会级联回收
    • WITH GRANT OPTION:授予对象权限时使用,回收对象权限会级联回收
  • 权限回收的影响:回收权限可能会导致用户的应用程序无法正常运行,需要提前测试

权限回收示例

sql
-- 回收系统权限(不会级联回收)
REVOKE CREATE TABLE FROM sales_role;

-- 回收对象权限(会级联回收)
REVOKE SELECT ON scott.employees FROM hr;

权限审计

权限审计是指记录和分析用户的权限变更和操作,确保合规性和安全性。

1. 审计类型

Oracle 提供了多种审计类型,包括语句审计、特权审计和对象审计。

审计类型示例

sql
-- 语句审计:审计 CREATE TABLE 语句
AUDIT CREATE TABLE;

-- 特权审计:审计系统权限的使用
AUDIT CREATE USER BY ACCESS;

-- 对象审计:审计表的访问和操作
AUDIT SELECT, INSERT, UPDATE, DELETE ON scott.employees BY ACCESS;

2. 审计记录查询

审计记录存储在数据字典视图中,可以通过查询这些视图查看审计信息。

审计记录查询示例

sql
-- 查看审计记录
SELECT * FROM dba_audit_trail WHERE obj_name = 'EMPLOYEES' ORDER BY timestamp DESC;

-- 查看语句审计记录
SELECT * FROM dba_audit_statement WHERE action_name = 'CREATE TABLE' ORDER BY timestamp DESC;

-- 查看特权审计记录
SELECT * FROM dba_audit_privilege WHERE privilege_name = 'CREATE USER' ORDER BY timestamp DESC;

-- 查看对象审计记录
SELECT * FROM dba_audit_object WHERE obj_name = 'EMPLOYEES' ORDER BY timestamp DESC;

3. 细粒度审计(FGA)

Oracle 提供了细粒度审计(FGA)功能,可以根据特定条件审计数据访问,如访问敏感数据时生成审计记录。

细粒度审计示例

sql
-- 创建细粒度审计策略
BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema => 'scott',
    object_name => 'employees',
    policy_name => 'emp_salary_audit',
    audit_condition => 'salary > 10000',
    audit_column => 'salary',
    handler_schema => NULL,
    handler_module => NULL,
    enable => TRUE,
    statement_types => 'SELECT',
    audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED
  );
END;
/

-- 查看细粒度审计记录
SELECT * FROM dba_fga_audit_trail WHERE object_name = 'EMPLOYEES' ORDER BY timestamp DESC;

权限管理最佳实践

1. 设计阶段

  • 设计合理的权限模型:根据业务需求设计合理的权限模型,包括系统权限、对象权限和角色
  • 遵循最小权限原则:只授予用户执行任务所需的最小权限
  • 使用角色管理权限:将权限分配给角色,再将角色分配给用户,简化权限管理
  • 设计清晰的命名约定:为角色和权限使用清晰的命名约定,便于管理和审计

2. 开发阶段

  • 使用应用程序角色:在应用程序中使用角色管理权限,便于动态调整权限
  • 实现权限检查:在应用程序中实现权限检查,确保用户只能访问授权的资源
  • 使用绑定变量:使用绑定变量可以减少 SQL 注入的风险
  • 记录权限操作:在应用程序中记录用户的权限操作,便于审计和追溯

3. 运维阶段

  • 定期审查权限:定期审查用户权限,撤销不再需要的权限
  • 监控权限变更:监控权限变更,及时发现异常操作
  • 备份权限信息:定期备份权限信息,以便在系统故障时恢复
  • 培训用户:培训用户了解权限管理的重要性,避免误操作

4. 版本差异处理

  • Oracle 11g 及以下版本

    • 权限管理较为传统,需要手动管理用户和角色
    • 不支持权限继承和细粒度审计的高级功能
  • Oracle 12c 及以上版本

    • 引入了权限继承功能,简化了权限管理
    • 增强了细粒度审计功能,支持更灵活的审计策略
    • 引入了多租户架构,需要考虑容器数据库和可插拔数据库的权限管理
  • Oracle 19c 及以上版本

    • 增强了安全功能,如透明数据加密、数据脱敏等
    • 支持云环境的权限管理,如 Oracle Autonomous Database 的权限模型

5. 云环境权限管理

  • 了解云服务提供商的安全模型:如 Oracle Cloud、AWS、Azure 等云服务提供商的安全模型
  • 使用云服务提供商的 IAM 服务:如 Oracle Cloud Identity and Access Management、AWS IAM 等
  • 遵循云环境的最佳实践:如使用最小权限原则、定期审查权限、启用多因素认证等
  • 加密数据:在云环境中,使用透明数据加密等功能保护敏感数据

常见问题(FAQ)

1. 如何查看用户的权限?

sql
-- 查看用户的系统权限
SELECT * FROM dba_sys_privs WHERE grantee = 'SCOTT';
SELECT * FROM session_privs;

-- 查看用户的对象权限
SELECT * FROM dba_tab_privs WHERE grantee = 'SCOTT';

-- 查看用户的角色
SELECT * FROM dba_role_privs WHERE grantee = 'SCOTT';

-- 查看角色的权限
SELECT * FROM dba_sys_privs WHERE grantee = 'SALES_ROLE';
SELECT * FROM dba_tab_privs WHERE grantee = 'SALES_ROLE';

2. 如何撤销用户的所有权限?

sql
-- 撤销用户的所有角色
REVOKE ALL PRIVILEGES FROM scott;

-- 撤销用户的所有系统权限
DECLARE
  CURSOR c_privs IS
    SELECT privilege FROM dba_sys_privs WHERE grantee = 'SCOTT';
BEGIN
  FOR r_priv IN c_privs LOOP
    EXECUTE IMMEDIATE 'REVOKE ' || r_priv.privilege || ' FROM scott';
  END LOOP;
END;
/

-- 撤销用户的所有对象权限
DECLARE
  CURSOR c_obj_privs IS
    SELECT owner, table_name, privilege FROM dba_tab_privs WHERE grantee = 'SCOTT';
BEGIN
  FOR r_obj_priv IN c_obj_privs LOOP
    EXECUTE IMMEDIATE 'REVOKE ' || r_obj_priv.privilege || ' ON ' || 
                      r_obj_priv.owner || '.' || r_obj_priv.table_name || 
                      ' FROM scott';
  END LOOP;
END;
/

3. 如何处理权限冲突?

权限冲突是指用户同时拥有多个角色,这些角色的权限可能存在冲突。处理权限冲突的方法包括:

  • 使用角色优先级:在 Oracle 12c 及以上版本中,可以为角色设置优先级
  • 重新设计角色:重新设计角色的权限,避免权限冲突
  • 使用最小权限原则:只授予用户执行任务所需的最小权限

4. 如何实现行级安全性?

行级安全性是指限制用户只能访问表中的特定行,可以通过以下方法实现:

  • 使用虚拟专用数据库(VPD):Oracle 提供的 VPD 功能可以根据用户的身份和上下文限制行访问
  • 使用视图:创建视图,只包含用户有权访问的行
  • 使用细粒度审计(FGA):监控用户对特定行的访问

5. 如何备份和恢复权限信息?

可以使用以下方法备份和恢复权限信息:

sql
-- 备份用户和角色信息
expdump system/password@orcl schemas=system include=user,role,system_grant,object_grant directory=DATA_PUMP_DIR dumpfile=privileges.dmp logfile=privileges_exp.log

-- 恢复用户和角色信息
impdump system/password@orcl schemas=system include=user,role,system_grant,object_grant directory=DATA_PUMP_DIR dumpfile=privileges.dmp logfile=privileges_imp.log

6. 如何监控权限变更?

可以使用以下方法监控权限变更:

  • 启用审计功能:审计系统权限和对象权限的变更
  • 使用 Oracle Enterprise Manager(OEM):OEM 提供了权限变更的监控和告警功能
  • 使用第三方工具:如 Oracle Audit Vault and Database Firewall 等

7. 如何处理离职员工的权限?

处理离职员工的权限是权限管理的重要任务,需要:

  • 立即锁定或删除离职员工的账户
  • 撤销离职员工的所有权限和角色
  • 审查离职员工的权限变更和操作记录
  • 重新分配离职员工的工作和权限

8. 如何实现权限的自动化管理?

可以使用以下方法实现权限的自动化管理:

  • 使用 Oracle Enterprise Manager(OEM):OEM 提供了权限管理的自动化功能
  • 使用 PL/SQL 脚本:编写 PL/SQL 脚本自动管理权限
  • 使用第三方工具:如 Oracle Identity Management 等
  • 使用云服务提供商的 IAM 服务:如 Oracle Cloud Identity and Access Management、AWS IAM 等

9. 如何处理权限的合规性要求?

处理权限的合规性要求需要:

  • 遵循最小权限原则
  • 定期审查和更新权限
  • 记录和分析权限变更和操作
  • 进行权限审计和合规性检查
  • 培训用户了解合规要求

10. 如何在多租户环境中管理权限?

在 Oracle 多租户环境中,权限管理需要考虑容器数据库(CDB)和可插拔数据库(PDB)的权限模型:

  • CDB 级别的权限:控制用户对 CDB 资源的访问
  • PDB 级别的权限:控制用户对特定 PDB 资源的访问
  • 通用用户和本地用户:通用用户可以访问多个 PDB,本地用户只能访问特定 PDB
sql
-- 创建通用用户
CREATE USER c##common_user IDENTIFIED BY password CONTAINER=ALL;

-- 创建本地用户
CREATE USER local_user IDENTIFIED BY password CONTAINER=CURRENT;

-- 授予通用用户权限
GRANT CREATE SESSION TO c##common_user CONTAINER=ALL;

-- 授予本地用户权限
GRANT CREATE SESSION TO local_user CONTAINER=CURRENT;

总结

Oracle 权限管理是数据库安全的重要组成部分,它控制着用户对系统资源和数据库对象的访问和操作。Oracle 权限体系包括系统权限和对象权限两种类型,它们分别控制着用户对系统资源和数据库对象的访问和操作。

用户管理和角色管理是权限管理的核心操作,需要遵循最小权限原则,只授予用户执行任务所需的最小权限。权限授予和回收需要谨慎操作,避免权限滥用和误操作。

权限审计是确保合规性和安全性的重要手段,需要记录和分析用户的权限变更和操作。Oracle 提供了多种审计类型,包括语句审计、特权审计和对象审计,以及细粒度审计功能。

不同版本的 Oracle 数据库和云环境中的权限管理存在差异,需要根据实际情况选择合适的权限管理策略。通过遵循最佳实践,如设计合理的权限模型、使用角色管理权限、定期审查权限等,可以提高权限管理的效率和安全性。

权限管理是一个持续的过程,需要随着业务需求的变化不断调整和优化。通过不断学习和实践,积累权限管理经验,可以提高数据库的安全性和合规性,保护敏感数据。