|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
Oracle数据库作为企业级数据库管理系统的代表,其安全性对于企业数据保护至关重要。在Oracle数据库的安全体系中,用户权限分配是核心环节,直接关系到数据库的安全性和合规性。本教程将从基础概念讲起,逐步深入到高级配置,帮助您全面掌握Oracle数据库的用户权限管理技巧,确保数据库环境的安全稳定运行。
Oracle数据库安全基础
用户和模式的概念
在Oracle数据库中,用户(User)是可以访问数据库的实体,每个用户都有一个唯一的用户名和密码。用户创建后,Oracle会同时创建一个与用户同名的模式(Schema)。模式是数据库对象的集合,包括表、视图、索引、存储过程等。
- -- 查看当前用户
- SELECT USER FROM DUAL;
- -- 查看所有用户
- SELECT username FROM dba_users;
复制代码
权限和角色的基本概念
权限(Privilege)是执行特定SQL语句或访问其他用户对象的权利。Oracle数据库中有两种主要类型的权限:
1. 系统权限(System Privilege):允许用户执行特定的数据库操作,如创建会话、创建表等。
2. 对象权限(Object Privilege):允许用户操作特定的数据库对象,如对表进行查询、插入、更新或删除。
角色(Role)是一组权限的集合,可以授予用户或其他角色,简化权限管理。
- -- 查看系统权限
- SELECT * FROM system_privilege_map;
- -- 查看对象权限
- SELECT * FROM table_privilege_map;
- -- 查看角色
- SELECT * FROM dba_roles;
复制代码
用户管理基础
创建用户
创建用户是权限管理的第一步。在创建用户时,需要指定用户名、密码和默认表空间等属性。
- -- 基本语法
- CREATE USER username IDENTIFIED BY password
- [DEFAULT TABLESPACE tablespace_name]
- [TEMPORARY TABLESPACE tablespace_name]
- [QUOTA integer [K|M] | UNLIMITED ON tablespace_name]
- [PROFILE profile_name]
- [PASSWORD EXPIRE]
- [ACCOUNT LOCK | ACCOUNT UNLOCK];
- -- 示例:创建一个名为hr的用户
- CREATE USER hr IDENTIFIED BY hr_password
- DEFAULT TABLESPACE users
- TEMPORARY TABLESPACE temp
- QUOTA 100M ON users
- PROFILE default
- PASSWORD EXPIRE;
- -- 创建用户并授予基本权限
- CREATE USER sales IDENTIFIED BY sales123
- DEFAULT TABLESPACE users
- TEMPORARY TABLESPACE temp
- QUOTA 500M ON users;
复制代码
修改用户
创建用户后,可以使用ALTER USER语句修改用户属性。
- -- 基本语法
- ALTER USER username
- [IDENTIFIED BY password]
- [DEFAULT TABLESPACE tablespace_name]
- [TEMPORARY TABLESPACE tablespace_name]
- [QUOTA integer [K|M] | UNLIMITED ON tablespace_name]
- [PROFILE profile_name]
- [PASSWORD EXPIRE]
- [ACCOUNT LOCK | ACCOUNT UNLOCK];
- -- 示例:修改hr用户的密码和表空间配额
- ALTER USER hr IDENTIFIED BY new_hr_password
- QUOTA 200M ON users;
- -- 锁定用户账户
- ALTER USER hr ACCOUNT LOCK;
- -- 解锁用户账户
- ALTER USER hr ACCOUNT UNLOCK;
复制代码
删除用户
当用户不再需要时,可以使用DROP USER语句删除用户。如果用户包含数据库对象,需要使用CASCADE选项。
- -- 基本语法
- DROP USER username [CASCADE];
- -- 示例:删除不包含对象的用户
- DROP USER hr;
- -- 示例:删除包含对象的用户及其所有对象
- DROP USER sales CASCADE;
复制代码
系统权限管理
常见系统权限介绍
系统权限允许用户执行特定的数据库操作。以下是一些常见的系统权限:
1. CREATE SESSION:连接到数据库
2. CREATE TABLE:创建表
3. CREATE VIEW:创建视图
4. CREATE PROCEDURE:创建存储过程
5. CREATE USER:创建用户
6. DROP USER:删除用户
7. ALTER USER:修改用户
8. SYSDBA:数据库管理员权限
9. SYSOPER:数据库操作员权限
- -- 查看所有系统权限
- SELECT name FROM system_privilege_map ORDER BY name;
复制代码
授予和撤销系统权限
使用GRANT语句授予系统权限,使用REVOKE语句撤销系统权限。
- -- 授予系统权限的基本语法
- GRANT system_privilege [, system_privilege ...]
- TO {user | role | PUBLIC}
- [WITH ADMIN OPTION];
- -- 示例:授予hr用户创建会话和创建表的权限
- GRANT CREATE SESSION, CREATE TABLE TO hr;
- -- 授予系统权限并允许传递
- GRANT CREATE VIEW TO hr WITH ADMIN OPTION;
- -- 撤销系统权限的基本语法
- REVOKE system_privilege [, system_privilege ...]
- FROM {user | role | PUBLIC};
- -- 示例:撤销hr用户的创建表权限
- REVOKE CREATE TABLE FROM hr;
复制代码
注意:使用WITH ADMIN OPTION授予的权限,被授权者可以将该权限授予其他用户。撤销系统权限时,如果该权限是通过WITH ADMIN OPTION传递的,撤销操作不会级联。
系统权限的最佳实践
1. 最小权限原则:只授予用户完成工作所需的最低权限
2. 定期审查:定期检查用户权限,确保没有多余的权限
3. 使用角色:通过角色管理权限,而不是直接授予用户
4. 限制高权限用户:严格控制具有SYSDBA和SYSOPER权限的用户
- -- 查看用户被授予的系统权限
- SELECT * FROM dba_sys_privs WHERE grantee = 'HR';
- -- 查看用户通过角色获得的系统权限
- SELECT b.grantee, a.granted_role, b.privilege
- FROM dba_role_privs a, dba_sys_privs b
- WHERE a.granted_role = b.grantee
- AND a.grantee = 'HR';
复制代码
对象权限管理
常见对象权限介绍
对象权限允许用户操作特定的数据库对象。以下是一些常见的对象权限:
1. SELECT:查询对象
2. INSERT:插入数据
3. UPDATE:更新数据
4. DELETE:删除数据
5. EXECUTE:执行存储过程或函数
6. INDEX:创建索引
7. ALTER:修改对象结构
8. REFERENCES:创建外键约束
9. ALL:所有对象权限
- -- 查看所有对象权限类型
- SELECT name FROM table_privilege_map ORDER BY name;
复制代码
授予和撤销对象权限
使用GRANT语句授予对象权限,使用REVOKE语句撤销对象权限。
- -- 授予对象权限的基本语法
- GRANT object_privilege [, object_privilege ...] | ALL
- ON [schema.]object
- TO {user | role | PUBLIC}
- [WITH GRANT OPTION];
- -- 示例:授予hr用户对employees表的查询权限
- GRANT SELECT ON hr.employees TO sales;
- -- 授予多个权限
- GRANT SELECT, INSERT, UPDATE ON hr.employees TO sales;
- -- 授予所有权限
- GRANT ALL ON hr.employees TO sales_manager;
- -- 授予对象权限并允许传递
- GRANT SELECT ON hr.employees TO sales WITH GRANT OPTION;
- -- 撤销对象权限的基本语法
- REVOKE object_privilege [, object_privilege ...] | ALL
- ON [schema.]object
- FROM {user | role | PUBLIC} [CASCADE CONSTRAINTS];
- -- 示例:撤销sales用户对employees表的插入权限
- REVOKE INSERT ON hr.employees FROM sales;
- -- 撤销所有权限
- REVOKE ALL ON hr.employees FROM sales_manager;
复制代码
注意:使用WITH GRANT OPTION授予的权限,被授权者可以将该权限授予其他用户。撤销对象权限时,如果该权限是通过WITH GRANT OPTION传递的,撤销操作会级联。
对象权限的传递
对象权限可以通过WITH GRANT OPTION传递,也可以通过角色间接传递。
- -- 创建角色
- CREATE ROLE sales_read_only;
- -- 授予角色对象权限
- GRANT SELECT ON hr.employees TO sales_read_only;
- -- 将角色授予用户
- GRANT sales_read_only TO sales, marketing;
- -- 查看对象权限的授予情况
- SELECT table_name, grantee, privilege, grantable
- FROM dba_tab_privs
- WHERE table_name = 'EMPLOYEES' AND owner = 'HR';
复制代码
角色管理
创建角色
角色是权限的集合,可以简化权限管理。创建角色时,可以设置是否需要验证。
- -- 基本语法
- CREATE ROLE role_name [NOT IDENTIFIED | IDENTIFIED BY password | IDENTIFIED EXTERNALLY | IDENTIFIED GLOBALLY];
- -- 示例:创建不需要验证的角色
- CREATE ROLE sales_role;
- -- 示例:创建需要密码验证的角色
- CREATE ROLE hr_manager IDENTIFIED BY hr_mgr_pwd;
- -- 示例:创建由操作系统验证的角色
- CREATE ROLE admin_role IDENTIFIED EXTERNALLY;
复制代码
为角色授权
角色可以被授予系统权限和对象权限。
- -- 为角色授予系统权限
- GRANT CREATE SESSION, CREATE TABLE TO sales_role;
- -- 为角色授予对象权限
- GRANT SELECT, INSERT, UPDATE ON hr.employees TO sales_role;
- -- 为角色授予其他角色
- GRANT hr_manager TO sales_role;
复制代码
为用户分配角色
创建角色并授权后,可以将角色分配给用户。
- -- 基本语法
- GRANT role_name [, role_name ...] TO {user | role | PUBLIC} [WITH ADMIN OPTION];
- -- 示例:将角色授予用户
- GRANT sales_role TO sales_user;
- -- 授予角色并允许用户将该角色授予其他用户
- GRANT sales_role TO sales_manager WITH ADMIN OPTION;
- -- 设置用户的默认角色
- ALTER USER sales_user DEFAULT ROLE sales_role, connect;
- -- 设置所有角色为非默认角色
- ALTER USER sales_user DEFAULT ROLE NONE;
- -- 设置所有授予的角色为默认角色
- ALTER USER sales_user DEFAULT ROLE ALL;
复制代码
角色的继承和管理
角色可以继承其他角色的权限,形成层次结构。
- -- 创建子角色
- CREATE ROLE sales_rep;
- CREATE ROLE sales_supervisor;
- CREATE ROLE sales_manager;
- -- 为角色分配权限
- GRANT SELECT ON hr.employees TO sales_rep;
- GRANT INSERT, UPDATE ON hr.employees TO sales_supervisor;
- GRANT DELETE ON hr.employees TO sales_manager;
- -- 建立角色层次
- GRANT sales_rep TO sales_supervisor;
- GRANT sales_supervisor TO sales_manager;
- -- 查看角色层次
- SELECT role, granted_role
- FROM role_role_privs
- WHERE role IN ('SALES_REP', 'SALES_SUPERVISOR', 'SALES_MANAGER');
- -- 启用和禁用角色
- SET ROLE sales_manager; -- 启用特定角色
- SET ROLE ALL; -- 启用所有角色
- SET ROLE NONE; -- 禁用所有角色
复制代码
高级权限配置
细粒度访问控制
细粒度访问控制(Fine-Grained Access Control, FGAC)允许在行级别或列级别控制数据访问。
- -- 创建策略函数
- CREATE OR REPLACE FUNCTION hr.secure_employees(
- p_schema IN VARCHAR2,
- p_table IN VARCHAR2
- )
- RETURN VARCHAR2
- AS
- BEGIN
- -- 只允许用户查看自己部门的信息
- RETURN 'department_id = SYS_CONTEXT(''USERENV'', ''CURRENT_DEPARTMENT_ID'')';
- END secure_employees;
- /
- -- 添加策略
- BEGIN
- DBMS_RLS.ADD_POLICY(
- object_schema => 'hr',
- object_name => 'employees',
- policy_name => 'employees_policy',
- function_schema => 'hr',
- policy_function => 'secure_employees',
- statement_types => 'SELECT, INSERT, UPDATE, DELETE'
- );
- END;
- /
- -- 查看策略信息
- SELECT * FROM dba_policies WHERE object_name = 'EMPLOYEES';
复制代码
虚拟私有数据库(VPD)
虚拟私有数据库(Virtual Private Database, VPD)是细粒度访问控制的实现方式,通过在SQL语句中自动添加WHERE子句来限制数据访问。
- -- 创建VPD策略函数
- CREATE OR REPLACE FUNCTION hr.vpd_function(
- p_schema IN VARCHAR2,
- p_table IN VARCHAR2
- )
- RETURN VARCHAR2
- AS
- v_return VARCHAR2(4000);
- BEGIN
- -- 根据用户角色返回不同的谓词
- IF SYS_CONTEXT('USERENV', 'ISDBA') = 'TRUE' THEN
- v_return := NULL; -- DBA可以看到所有数据
- ELSIF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'HR_MANAGER' THEN
- v_return := 'department_id IN (10, 20, 30)'; -- HR经理只能看到特定部门
- ELSE
- v_return := 'employee_id = SYS_CONTEXT(''USERENV'', ''CURRENT_USER_ID'')'; -- 普通用户只能看到自己的记录
- END IF;
-
- RETURN v_return;
- END vpd_function;
- /
- -- 应用VPD策略
- BEGIN
- DBMS_RLS.ADD_POLICY(
- object_schema => 'hr',
- object_name => 'employees',
- policy_name => 'hr_vpd_policy',
- function_schema => 'hr',
- policy_function => 'vpd_function',
- sec_relevant_cols => 'salary, commission_pct', -- 敏感列
- sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS -- 显示所有行但隐藏敏感列的值
- );
- END;
- /
复制代码
数据库资源限制
通过配置文件(Profile)可以限制数据库资源使用,增强安全性。
- -- 创建配置文件
- CREATE PROFILE app_user LIMIT
- SESSIONS_PER_USER 1
- CPU_PER_SESSION 10000
- CPU_PER_CALL 5000
- CONNECT_TIME 60
- IDLE_TIME 30
- LOGICAL_READS_PER_SESSION 10000
- LOGICAL_READS_PER_CALL 1000
- PRIVATE_SGA 10K
- COMPOSITE_LIMIT 1000000
- FAILED_LOGIN_ATTEMPTS 3
- PASSWORD_LIFE_TIME 90
- PASSWORD_REUSE_TIME 180
- PASSWORD_REUSE_MAX 5
- PASSWORD_VERIFY_FUNCTION verify_function
- PASSWORD_LOCK_TIME 1/24
- PASSWORD_GRACE_TIME 10;
- -- 将配置文件分配给用户
- ALTER USER hr PROFILE app_user;
- -- 查看配置文件信息
- SELECT * FROM dba_profiles WHERE profile = 'APP_USER';
- -- 修改配置文件
- ALTER PROFILE app_user LIMIT
- FAILED_LOGIN_ATTEMPTS 5
- PASSWORD_LIFE_TIME 60;
- -- 删除配置文件
- DROP PROFILE app_user CASCADE;
复制代码
审计和合规性
审计是跟踪数据库活动的重要手段,有助于满足合规性要求。
- -- 启用数据库审计
- ALTER SYSTEM SET audit_trail = DB SCOPE=SPFILE;
- -- 重启数据库使设置生效
- -- 审计特定操作
- AUDIT SELECT, INSERT, UPDATE, DELETE ON hr.employees BY ACCESS;
- -- 审计特定用户的所有操作
- AUDIT ALL BY hr_user BY ACCESS;
- -- 审计特权操作
- AUDIT ALTER SYSTEM, AUDIT SYSTEM BY ACCESS;
- -- 查看审计记录
- SELECT username, action_name, obj_name, timestamp
- FROM dba_audit_trail
- WHERE obj_name = 'EMPLOYEES';
- -- 停止审计
- NOAUDIT ALL;
复制代码
权限管理的最佳实践
最小权限原则
最小权限原则(Principle of Least Privilege)是信息安全的基本原则,意味着只授予用户完成工作所需的最低权限。
- -- 不好的做法:授予过多权限
- GRANT DBA TO app_user;
- -- 好的做法:只授予必要的权限
- GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE TO app_user;
- GRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.employees TO app_user;
复制代码
权限分离
权限分离(Separation of Duties)要求将关键任务分配给多个用户,防止单个用户拥有过多权限。
- -- 创建不同角色
- CREATE ROLE order_entry;
- CREATE ROLE order_approval;
- CREATE ROLE order_fulfillment;
- -- 为角色分配不同权限
- GRANT INSERT, UPDATE ON orders TO order_entry;
- GRANT UPDATE ON orders TO order_approval;
- GRANT SELECT ON orders TO order_fulfillment;
- -- 将角色分配给不同用户
- GRANT order_entry TO order_clerk;
- GRANT order_approval TO order_manager;
- GRANT order_fulfillment TO warehouse_staff;
复制代码
定期审查权限
定期审查用户权限,确保没有多余的权限,是维护数据库安全的重要步骤。
- -- 查看用户直接被授予的系统权限
- SELECT grantee, privilege, admin_option
- FROM dba_sys_privs
- WHERE grantee NOT IN ('PUBLIC', 'SYS', 'SYSTEM')
- ORDER BY grantee, privilege;
- -- 查看用户通过角色获得的系统权限
- SELECT b.grantee, a.granted_role, b.privilege
- FROM dba_role_privs a, dba_sys_privs b
- WHERE a.granted_role = b.grantee
- AND b.grantee NOT IN ('PUBLIC', 'SYS', 'SYSTEM')
- ORDER BY b.grantee, a.granted_role, b.privilege;
- -- 查看用户被授予的对象权限
- SELECT grantee, owner, table_name, privilege, grantable
- FROM dba_tab_privs
- WHERE grantee NOT IN ('PUBLIC', 'SYS', 'SYSTEM')
- ORDER BY grantee, owner, table_name, privilege;
- -- 查看用户通过角色获得的对象权限
- SELECT b.grantee, a.granted_role, c.owner, c.table_name, c.privilege
- FROM dba_role_privs a, dba_role_privs b, dba_tab_privs c
- WHERE a.granted_role = b.grantee
- AND a.granted_role = c.grantee
- AND b.grantee NOT IN ('PUBLIC', 'SYS', 'SYSTEM')
- ORDER BY b.grantee, a.granted_role, c.owner, c.table_name, c.privilege;
复制代码
常见问题和解决方案
问题1:用户无法连接数据库
原因分析:
• 用户没有CREATE SESSION权限
• 用户账户被锁定
• 密码过期
解决方案:
- -- 授予CREATE SESSION权限
- GRANT CREATE SESSION TO username;
- -- 解锁用户账户
- ALTER USER username ACCOUNT UNLOCK;
- -- 重置密码
- ALTER USER username IDENTIFIED BY new_password;
复制代码
问题2:用户无法访问特定表
原因分析:
• 用户没有被授予该表的权限
• 权限通过角色授予,但角色未启用
解决方案:
- -- 直接授予表权限
- GRANT SELECT ON schema.table TO username;
- -- 查看用户的角色
- SELECT * FROM dba_role_privs WHERE grantee = 'USERNAME';
- -- 启用角色
- SET ROLE ALL;
复制代码
问题3:权限传递问题
原因分析:
• 权限没有使用WITH ADMIN OPTION或WITH GRANT OPTION授予
• 系统权限和对象权限的传递规则不同
解决方案:
- -- 系统权限使用WITH ADMIN OPTION
- GRANT CREATE TABLE TO username WITH ADMIN OPTION;
- -- 对象权限使用WITH GRANT OPTION
- GRANT SELECT ON schema.table TO username WITH GRANT OPTION;
复制代码
问题4:权限过多导致安全风险
原因分析:
• 用户被授予了不必要的权限
• 权限随时间累积,没有定期审查
解决方案:
- -- 撤销不必要的系统权限
- REVOKE UNLIMITED TABLESPACE FROM username;
- -- 撤销不必要的对象权限
- REVOKE ALL ON schema.table FROM username;
- -- 创建具有适当权限的角色
- CREATE ROLE limited_access;
- GRANT SELECT, INSERT ON schema.table TO limited_access;
- GRANT limited_access TO username;
复制代码
总结
Oracle数据库用户权限分配是数据库安全管理的核心环节。本教程从基础概念讲起,详细介绍了用户管理、系统权限、对象权限、角色管理等核心内容,并深入探讨了细粒度访问控制、虚拟私有数据库、资源限制和审计等高级配置。
通过遵循最小权限原则、权限分离和定期审查等最佳实践,可以有效地管理Oracle数据库的权限,确保数据库的安全性和合规性。同时,解决常见问题的技巧和示例代码也能帮助您在实际工作中快速应对各种权限管理挑战。
掌握Oracle数据库权限管理不仅需要理论知识,还需要实践经验。建议您在测试环境中充分练习本教程中的示例,并逐步将这些技术应用到生产环境中,以确保数据库的安全稳定运行。 |
|