【Oracle数据库指南】第22篇:Oracle用户与权限管理详解
上一篇【第21篇】Oracle表空间管理详解
下一篇【第23篇】Oracle模式对象管理详解
摘要
用户与权限管理是Oracle数据库安全管理的核心。本文详细讲解Oracle用户账户的创建与管理、系统权限与对象权限的授予与回收、角色(Role)的创建与应用、资源配置文件(Profile)的使用,以及权限审计与最佳实践,帮助DBA构建安全、可控的数据库访问体系。
一、Oracle用户管理
1.1 用户账户概述
Oracle用户账户是连接数据库的身份标识,包含:
- 用户名和密码
- 默认表空间
- 临时表空间
- 表空间配额
- 账户状态(锁定/解锁)
- 资源配置文件
-- 查看所有用户SELECTusername,account_status,default_tablespace,temporary_tablespace,createdFROMdba_usersORDERBYusername;1.2 创建用户
-- 基本语法CREATEUSERusername IDENTIFIEDBYpassword[DEFAULTTABLESPACEtablespace_name][TEMPORARYTABLESPACEtemp_tablespace_name][QUOTA size|UNLIMITEDONtablespace_name][PROFILE profile_name][PASSWORD EXPIRE][ACCOUNTLOCK|UNLOCK];-- 示例1:创建普通用户CREATEUSERapp_user IDENTIFIEDBY"App#2024!"DEFAULTTABLESPACEusers_dataTEMPORARYTABLESPACEtempQUOTA100MONusers_data QUOTA UNLIMITEDONusers_index PROFILE app_profile ACCOUNTUNLOCK;-- 示例2:创建只读用户CREATEUSERreadonly_user IDENTIFIEDBY"ReadOnly#2024!"DEFAULTTABLESPACEusers_dataTEMPORARYTABLESPACEtempQUOTA0ONusers_data PROFILEdefaultPASSWORD EXPIRE ACCOUNTUNLOCK;1.3 修改用户
-- 修改密码ALTERUSERapp_user IDENTIFIEDBY"NewPass#2024!";-- 修改默认表空间ALTERUSERapp_userDEFAULTTABLESPACEnew_data_ts;-- 修改临时表空间ALTERUSERapp_userTEMPORARYTABLESPACEtemp2;-- 修改表空间配额ALTERUSERapp_user QUOTA200MONusers_data;ALTERUSERapp_user QUOTA UNLIMITEDONusers_index;-- 锁定/解锁账户ALTERUSERapp_user ACCOUNTLOCK;ALTERUSERapp_user ACCOUNTUNLOCK;-- 强制用户修改密码ALTERUSERapp_user PASSWORD EXPIRE;1.4 删除用户
-- 删除用户(用户下无对象)DROPUSERapp_user;-- 删除用户及其所有对象DROPUSERapp_userCASCADE;-- 先查看用户下有哪些对象SELECTobject_type,COUNT(*)FROMdba_objectsWHEREowner='APP_USER'GROUPBYobject_type;二、系统权限管理
2.1 系统权限概述
系统权限(System Privilege)允许用户在数据库级别执行特定操作,例如:
CREATE SESSION:连接数据库CREATE TABLE:创建表CREATE VIEW:创建视图CREATE PROCEDURE:创建存储过程CREATE USER:创建用户ALTER DATABASE:修改数据库SYSDBA:系统管理员权限
-- 查看所有系统权限SELECTnameFROMsystem_privilege_mapORDERBYname;-- 查看某个用户的系统权限SELECTprivilege,admin_optionFROMdba_sys_privsWHEREgrantee='APP_USER';2.2 授予系统权限
-- 授予基本连接权限GRANTCREATESESSIONTOapp_user;-- 授予创建对象的权限GRANTCREATETABLE,CREATEVIEW,CREATEPROCEDURETOapp_user;-- 授予表空间使用权限GRANTUNLIMITEDTABLESPACETOapp_user;-- 授予WITH ADMIN OPTION(允许转授)GRANTCREATESESSIONTOapp_userWITHADMINOPTION;-- 授予多个用户GRANTCREATESESSIONTOuser1,user2,user3;2.3 回收系统权限
-- 回收系统权限REVOKECREATETABLEFROMapp_user;-- 回收所有系统权限REVOKEALLPRIVILEGESFROMapp_user;-- 注意:WITH ADMIN OPTION回收后,被转授的权限不会级联回收三、对象权限管理
3.1 对象权限概述
对象权限(Object Privilege)允许用户对特定对象(表、视图、过程等)执行操作:
| 对象类型 | 可用权限 |
|---|---|
| 表/视图 | SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX |
| 存储过程/函数 | EXECUTE |
| 序列 | SELECT, ALTER |
| 同义词 | 无(依赖基表权限) |
-- 查看某个用户的对象权限SELECTowner,table_name,privilege,grantableFROMdba_tab_privsWHEREgrantee='APP_USER';3.2 授予对象权限
-- 授予表权限GRANTSELECT,INSERT,UPDATE,DELETEONscott.empTOapp_user;-- 授予列级权限GRANTUPDATE(sal,comm)ONscott.empTOapp_user;-- 授予视图权限GRANTSELECTONscott.emp_viewTOapp_user;-- 授予执行存储过程权限GRANTEXECUTEONscott.calculate_bonusTOapp_user;-- 授予WITH GRANT OPTION(允许转授)GRANTSELECTONscott.empTOapp_userWITHGRANTOPTION;3.3 回收对象权限
-- 回收对象权限REVOKEINSERT,UPDATEONscott.empFROMapp_user;-- 回收所有权限REVOKEALLONscott.empFROMapp_user;-- 注意:WITH GRANT OPTION回收后,被转授的权限会级联回收四、角色(Role)管理
4.1 角色概述
角色是权限的集合,用于简化权限管理。Oracle内置角色:
CONNECT:基本连接权限(Oracle 10g后需要显式授予)RESOURCE:创建对象的权限DBA:数据库管理员权限EXP_FULL_DATABASE:导出权限IMP_FULL_DATABASE:导入权限
4.2 创建角色
-- 创建角色CREATEROLE app_developer;CREATEROLE app_reader;CREATEROLE app_writer;-- 创建角色并立即授予权限CREATEROLE app_admin IDENTIFIEDBY"Role#2024!";4.3 给角色授予权限
-- 给开发者角色授予权限GRANTCREATESESSION,CREATETABLE,CREATEVIEW,CREATESEQUENCE,CREATEPROCEDURE,CREATETRIGGERTOapp_developer;-- 给只读角色授予权限GRANTCREATESESSIONTOapp_reader;GRANTSELECTONscott.empTOapp_reader;GRANTSELECTONscott.deptTOapp_reader;-- 给写入角色授予权限GRANTCREATESESSIONTOapp_writer;GRANTINSERT,UPDATE,DELETEONscott.empTOapp_writer;4.4 将角色授予用户
-- 将角色授予用户GRANTapp_developerTOapp_user;-- 授予多个角色GRANTapp_reader,app_writerTOreport_user;-- 设置默认角色ALTERUSERapp_userDEFAULTROLE app_developer;-- 激活/禁用角色SETROLE app_developer;SETROLEALLEXCEPTapp_writer;4.5 回收和删除角色
-- 回收角色REVOKEapp_developerFROMapp_user;-- 删除角色DROPROLE app_developer;-- 查看角色包含的系统权限SELECTprivilegeFROMrole_sys_privsWHERErole='APP_DEVELOPER';-- 查看角色包含的对象权限SELECTowner,table_name,privilegeFROMrole_tab_privsWHERErole='APP_READER';五、资源配置文件(Profile)
5.1 Profile概述
Profile用于限制用户使用的系统资源和密码策略:
- 密码策略:复杂度、有效期、失败锁定
- 资源限制:CPU、连接时间、空闲时间
-- 查看所有ProfileSELECTprofile,resource_name,limitFROMdba_profilesORDERBYprofile,resource_name;5.2 创建Profile
-- 创建应用程序用户ProfileCREATEPROFILE app_profileLIMIT-- 密码策略FAILED_LOGIN_ATTEMPTS5PASSWORD_LIFE_TIME90PASSWORD_REUSE_TIME365PASSWORD_REUSE_MAX10PASSWORD_LOCK_TIME1PASSWORD_GRACE_TIME7PASSWORD_VERIFY_FUNCTION verify_function_11G-- 资源限制SESSIONS_PER_USER10CPU_PER_SESSION UNLIMITED CPU_PER_CALL3000CONNECT_TIME480IDLE_TIME30;5.3 修改和删除Profile
-- 修改ProfileALTERPROFILE app_profileLIMITFAILED_LOGIN_ATTEMPTS3PASSWORD_LIFE_TIME60;-- 删除ProfileDROPPROFILE app_profile;DROPPROFILE app_profileCASCADE;-- 同时移除用户的Profile关联六、权限查询与审计
6.1 权限查询
-- 查看当前用户权限SELECT*FROMuser_sys_privs;SELECT*FROMuser_tab_privs;SELECT*FROMuser_role_privs;-- 查看指定用户权限(需要DBA权限)SELECTgrantee,privilege,admin_optionFROMdba_sys_privsWHEREgrantee='APP_USER';SELECTgrantee,owner,table_name,privilegeFROMdba_tab_privsWHEREgrantee='APP_USER';SELECTgrantee,granted_role,admin_optionFROMdba_role_privsWHEREgrantee='APP_USER';-- 查看角色层级(谁拥有哪个角色)SELECT*FROMdba_role_privsSTARTWITHgrantee='APP_USER'CONNECTBYPRIOR granted_role=grantee;6.2 权限审计
-- 启用会话审计AUDITSESSION;-- 审计特定用户的操作AUDITSELECTTABLE,INSERTTABLE,UPDATETABLE,DELETETABLEBYapp_userBYACCESS;-- 审计所有用户的对象访问AUDITSELECTANYTABLE;-- 查看审计记录SELECTusername,obj_name,action_name,timestampFROMdba_audit_trailWHEREusername='APP_USER'ORDERBYtimestampDESC;七、最佳实践
7.1 权限设计原则
- 最小权限原则:只授予必要的权限
- 使用角色:通过角色管理权限,而非直接授予用户
- 分离职责:开发、测试、生产环境使用不同用户
- 定期审计:定期检查用户权限,回收不必要权限
- 密码策略:使用Profile强制密码复杂度
7.2 常见权限配置模板
-- 模板1:应用程序连接用户CREATEUSERapp_conn IDENTIFIEDBY"AppConn#2024!"DEFAULTTABLESPACEusers_dataTEMPORARYTABLESPACEtempQUOTA0ONusers_data PROFILE app_profile;GRANTCREATESESSIONTOapp_conn;-- 模板2:应用程序对象所有者CREATEUSERapp_owner IDENTIFIEDBY"AppOwner#2024!"DEFAULTTABLESPACEusers_dataTEMPORARYTABLESPACEtempQUOTA UNLIMITEDONusers_data QUOTA UNLIMITEDONusers_index PROFILE app_profile;GRANTCREATESESSION,CREATETABLE,CREATEVIEW,CREATESEQUENCE,CREATEPROCEDURE,CREATETRIGGERTOapp_owner;-- 模板3:只读用户CREATEUSERapp_reader IDENTIFIEDBY"AppReader#2024!"DEFAULTTABLESPACEusers_dataTEMPORARYTABLESPACEtempQUOTA0ONusers_data PROFILE app_profile;GRANTCREATESESSIONTOapp_reader;-- 然后授予具体表的SELECT权限7.3 安全检查清单
-- 1. 查找具有DBA角色的用户SELECTgranteeFROMdba_role_privsWHEREgranted_role='DBA'ANDgranteeNOTIN('SYS','SYSTEM');-- 2. 查找具有SYSDBA权限的用户SELECT*FROMv$pwfile_users;-- 3. 查找密码过期的用户SELECTusername,expiry_dateFROMdba_usersWHEREexpiry_date<SYSDATE+30;-- 4. 查找被锁定的用户SELECTusername,account_status,lock_dateFROMdba_usersWHEREaccount_statusLIKE'%LOCKED%';-- 5. 查找具有ANY权限的用户(安全风险)SELECTgrantee,privilegeFROMdba_sys_privsWHEREprivilegeLIKE'%ANY%';八、总结
Oracle用户与权限管理的核心要点:
- 用户管理:创建、修改、删除用户,设置表空间配额
- 系统权限:数据库级别的操作权限,使用WITH ADMIN OPTION
- 对象权限:针对特定对象的操作权限,使用WITH GRANT OPTION
- 角色管理:权限集合,简化权限管理
- Profile:密码策略和资源限制
- 权限审计:定期审查权限使用情况
- 最佳实践:最小权限、使用角色、定期审计
上一篇【第21篇】Oracle表空间管理详解
下一篇【第23篇】Oracle模式对象管理详解
参考资料
- 《Oracle 11g数据库管理员指南》— 刘宪军著
- Oracle官方文档:Database Security Guide - Managing Users and Securing the Database
- Oracle官方文档:Database SQL Reference - CREATE USER
