【Oracle数据库指南】第36篇:Oracle用户与权限管理详解(完整版)
上一篇【第35篇】Oracle特殊对象——簇与索引组织表IOT下一篇【第37篇】Oracle角色与PROFILE管理详解摘要Oracle数据库的用户与权限管理是安全管理的核心建立科学的用户体系是保障数据安全的第一步。本文系统讲解Oracle用户账户的完整生命周期管理、系统权限System Privilege与对象权限Object Privilege的授予与回收机制、权限的传递WITH ADMIN OPTION / WITH GRANT OPTION、权限继承与级联回收的差异并提供基于最小权限原则的用户体系设计方案帮助DBA建立安全、可维护的访问控制体系。一、用户管理完整生命周期1.1 创建用户-- 语法CREATEUSERusername IDENTIFIEDBYpassword-- 密码或 EXTERNALLY/GLOBALLY[DEFAULTTABLESPACEts_name]-- 默认表空间存放对象[TEMPORARYTABLESPACEts_name]-- 临时表空间排序等[QUOTA quotaONts_name]-- 表空间配额[PROFILE profile_name]-- 资源/密码配置文件[PASSWORD EXPIRE]-- 强制首次登录改密码[ACCOUNTLOCK|UNLOCK];-- 账户状态-- 示例创建应用程序用户CREATEUSERapp_user IDENTIFIEDBYApp1234DEFAULTTABLESPACEusers_dataTEMPORARYTABLESPACEtempQUOTA500MONusers_data QUOTA UNLIMITEDONusers_index PROFILE app_profile PASSWORD EXPIRE ACCOUNTUNLOCK;1.2 修改用户-- 修改密码ALTERUSERapp_user IDENTIFIEDBYNewPass2024;-- 修改表空间配额ALTERUSERapp_user QUOTA1GONusers_data;ALTERUSERapp_user QUOTA0ONusers_data;-- 禁止使用该表空间-- 锁定账户临时禁止登录不删除数据ALTERUSERapp_user ACCOUNTLOCK;-- 解锁账户ALTERUSERapp_user ACCOUNTUNLOCK;-- 强制下次登录改密码ALTERUSERapp_user PASSWORD EXPIRE;-- 修改默认角色会话启动时激活的角色ALTERUSERapp_userDEFAULTROLE app_developer,app_reader;ALTERUSERapp_userDEFAULTROLEALL;-- 激活所有角色ALTERUSERapp_userDEFAULTROLE NONE;-- 不自动激活任何角色1.3 删除用户-- 查看用户下有哪些对象删除前确认SELECTobject_type,COUNT(*)FROMdba_objectsWHEREownerAPP_USERGROUPBYobject_type;-- 删除空用户无任何对象DROPUSERapp_user;-- 删除用户及其所有对象CASCADE 删除Schema下所有内容DROPUSERapp_userCASCADE;二、系统权限System Privilege2.1 系统权限分类-- 查看所有系统权限SELECTnameFROMsystem_privilege_mapORDERBYname;-- 核心系统权限列表-- 连接类CREATE SESSION-- 创建对象类CREATE TABLE, CREATE VIEW, CREATE INDEX,-- CREATE SEQUENCE, CREATE PROCEDURE, CREATE TRIGGER-- 任意权限ANYSELECT ANY TABLE, DROP ANY TABLE危险-- 管理类CREATE USER, DROP USER, GRANT ANY PRIVILEGE-- 系统级SYSDBA, SYSOPER2.2 授予系统权限-- 基本授予GRANTCREATESESSIONTOapp_user;-- 授予多个权限GRANTCREATETABLE,CREATEVIEW,CREATESEQUENCE,CREATEPROCEDURE,CREATETRIGGERTOapp_user;-- WITH ADMIN OPTION可以将该权限继续授予他人GRANTCREATETABLETOapp_adminWITHADMINOPTION;-- 注意回收 app_admin 的权限后他转授的权限不会被级联回收-- 授予给角色GRANTCREATESESSIONTOdeveloper_role;2.3 回收系统权限-- 回收单个权限REVOKECREATETABLEFROMapp_user;-- 回收多个权限REVOKECREATEVIEW,CREATESEQUENCEFROMapp_user;-- 重要特性WITH ADMIN OPTION 回收后不级联-- 即A授予BWITH ADMIN OPTIONB转授给C-- REVOKE A的权限后C的权限依然保留三、对象权限Object Privilege3.1 对象权限类型对象可用权限表TABLESELECT、INSERT、UPDATE、DELETE、ALTER、INDEX、REFERENCES视图VIEWSELECT、INSERT、UPDATE、DELETE序列SEQUENCESELECT、ALTER过程/函数/包EXECUTE目录DIRECTORYREAD、WRITE类型TYPEEXECUTE、UNDER3.2 授予对象权限-- 表的权限GRANTSELECTONscott.empTOapp_user;GRANTSELECT,INSERT,UPDATEONscott.empTOapp_user;-- 列级权限仅 UPDATE 和 INSERT 支持列级GRANTUPDATE(sal,comm)ONscott.empTOapp_user;-- 执行权限GRANTEXECUTEONscott.pkg_emp_mgrTOapp_user;-- WITH GRANT OPTION允许被授权者将该权限转授他人GRANTSELECTONscott.empTOapp_managerWITHGRANTOPTION;-- 注意回收 app_manager 的权限后其转授的权限会被级联回收-- 这与 WITH ADMIN OPTION 的行为不同3.3 对象权限回收-- 回收权限WITH GRANT OPTION 回收会级联REVOKESELECTONscott.empFROMapp_manager;-- app_manager 转授给他人的 SELECT 权限也同时被回收-- 查看对象权限授权者视角SELECTgrantee,owner,table_name,privilege,grantableFROMdba_tab_privsWHEREownerSCOTTANDtable_nameEMPORDERBYgrantee;四、权限查询4.1 查询当前用户的权限-- 当前用户的系统权限SELECTprivilege,admin_optionFROMuser_sys_privs;-- 当前用户的对象权限SELECTowner,table_name,privilege,grantableFROMuser_tab_privs;-- 当前用户拥有的角色SELECTgranted_role,admin_option,default_roleFROMuser_role_privs;-- 通过角色间接获得的系统权限SELECTprivilegeFROMrole_sys_privsWHEREroleIN(SELECTgranted_roleFROMuser_role_privs);4.2 DBA 视角查询所有权限-- 查看所有用户的系统权限SELECTgrantee,privilege,admin_optionFROMdba_sys_privsWHEREgranteeNOTIN(SYS,SYSTEM,DBA,CONNECT,RESOURCE)ORDERBYgrantee,privilege;-- 查看所有用户对某张表的权限SELECTgrantee,privilege,grantable,hierarchyFROMdba_tab_privsWHEREownerSCOTTANDtable_nameEMP;-- 权限树递归展示用户的所有角色包括嵌套角色SELECTLPAD( ,3*(LEVEL-1))||granted_roleASrole_tree,grantee,admin_optionFROMdba_role_privsCONNECTBYPRIOR granted_rolegranteeSTARTWITHgranteeAPP_USERORDERSIBLINGSBYgranted_role;五、特殊权限5.1 SYSDBA 和 SYSOPER-- 查看拥有 SYSDBA/SYSOPER 的用户SELECT*FROMv$pwfile_users;-- 授予 SYSDBA 权限需要密码文件支持GRANTSYSDBATOsys_backup_user;-- SYSDBA 可以执行-- STARTUP/SHUTDOWN、CREATE DATABASE、ALTER DATABASE OPEN/MOUNT-- CREATE SPFILE、ARCHIVELOG MODE、完全恢复-- SYSOPER 权限范围小于 SYSDBA-- STARTUP/SHUTDOWN、CREATE SPFILE、ARCHIVELOG MODE、不完全恢复5.2 PUBLIC 伪用户权限-- 授予所有用户某个权限不推荐滥用GRANTSELECTONscott.deptTOPUBLIC;-- 查看授予 PUBLIC 的权限安全审计SELECTowner,table_name,privilegeFROMdba_tab_privsWHEREgranteePUBLICORDERBYowner,table_name;六、用户权限体系设计实践6.1 三层用户模型推荐┌─────────────────────────────────────────────┐ │ 第1层对象所有者Owner │ │ app_owner拥有所有表、视图、包等对象 │ │ 只用于创建对象不用于日常连接 │ ├─────────────────────────────────────────────┤ │ 第2层应用程序用户App User │ │ app_runtime通过角色获得执行权限日常使用 │ │ app_readonly只有SELECT权限的只读账户 │ │ app_admin拥有数据维护和管理权限 │ ├─────────────────────────────────────────────┤ │ 第3层DBA管理用户 │ │ sys系统管理仅紧急情况使用 │ │ system日常DBA操作 │ │ dba_user自建DBA账户不使用系统默认账户 │ └─────────────────────────────────────────────┘6.2 安全审计SQL-- 1. 查找权限过大的用户有ANY权限SELECTgrantee,privilegeFROMdba_sys_privsWHEREprivilegeLIKE%ANY%ANDgranteeNOTIN(SYS,DBA,IMP_FULL_DATABASE,EXP_FULL_DATABASE,DATAPUMP_IMP_FULL_DATABASE);-- 2. 查找有DBA角色的普通用户SELECTgranteeFROMdba_role_privsWHEREgranted_roleDBAANDgranteeNOTIN(SYS,SYSTEM);-- 3. 查找密码即将过期7天内的用户SELECTusername,expiry_dateFROMdba_usersWHEREaccount_statusOPENANDexpiry_dateSYSDATE7ANDexpiry_dateISNOTNULL;七、最佳实践最小权限原则只授予完成工作所需的最少权限禁止直接使用 SYS/SYSTEM为 DBA 创建独立账户不滥用 ANY 权限SELECT ANY TABLE等权限只在必要时授予密码策略强制使用密码策略见文章37密码不得少于12位定期审计每季度检查用户权限回收不再需要的权限禁止权限直接授予用户通过角色管理权限提高可维护性八、总结Oracle用户权限管理的核心要点用户生命周期CREATE → 授权 → 使用 → 锁定 → DROP系统权限数据库级操作WITH ADMIN OPTION 回收不级联对象权限特定对象操作WITH GRANT OPTION 回收级联权限查询USER_/DBA_ 系列视图查看权限分配三层用户模型对象所有者/应用用户/DBA 分离安全审计定期检查过大权限、过期密码、锁定账户上一篇【第35篇】Oracle特殊对象——簇与索引组织表IOT下一篇【第37篇】Oracle角色与PROFILE管理详解参考资料《Oracle 11g数据库管理员指南》— 刘宪军著Oracle官方文档Database Security Guide - Managing Users and Securing the DatabaseOracle官方文档Database SQL Reference - GRANT and REVOKE
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2613455.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!