教你如何成为Oracle 10g OCP - 第八章 用户、权限和角色管理

 

8.1  用户管理

每个用户有一系列的属性,包括以下几个方面:

A. 唯一的用户名,必须字母开头,最多30字节,不能有特殊字符。
B. 认证: 通常使用密码认证
C. 默认表空间: 用户创建后,如果在用户下创建了对象,那么生成与用户同名的schema,
即schema与用户名的区别在于是否存在用户对象。10g之前,如果没有指定default tbs,
那么system会被作为默认表空间;10g或之后,在建库的时候就可以指定一个数据库级的
默认表空间,这样定义用户没有指定默认表空间的话,默认就使用这个数据库级的TBS.
可以通过下面的语句查询:
select * from database_properties ;
或者 select name,value$ from props$ where name like 'DEFAULT%'
D. 默认临时表空间: Oracle9i之前,如果没有指定,会使用system作为临时表空间,9i开始,
可以为数据库指定默认临时表空间,定义用户时没有指定的话,使用数据库默认的临时表空间。
E. profile(配置文件),用于控制用户密码策略以及资源使用。
F. 用户组
G. 锁定状态: 可以将用户锁定和解锁 。

 

数据库创建后,会预先建立两个非常重要的用户:sys及system, sys是超级用户,权限太大,
所以登陆的时候需要加入as sysdba 增强安全性,因为以as sysdba登陆后,登陆的时间信息
会记录在审计文件中。system仅仅时候数据库管理员,没有sys那么大权限。

通常我们不使用sys及system等用户登入数据库进行管理,而是创建一个用户,赋予该用户DBA
角色权限,用该用户来进行日常管理工作。


8.1.1  创建和删除用户

CREATE USER sidney
    IDENTIFIED BY out_standing1
    DEFAULT TABLESPACE example
    QUOTA 10M ON example
    TEMPORARY TABLESPACE temp
    QUOTA 5M ON system
    PROFILE app_user
    PASSWORD EXPIRE;

认证方式: 密码认证,外部认证,全局认证


外部认证 -
密码认证大家都熟悉,这里介绍一下外部认证。使用外部认证需要使用参数os_authent_prefix,
如果操作系统存在一个用户susan,  而数据库中存在一个用户ops$susan, 则只要以susan用户登
陆OS, 当登陆数据库时,可以不用提供用户密码,即可以以ops$susan登陆到数据库。若此参数为
空,那么只要数据库中存在与操作系统同名的用户,该用户就可以通过外部认证登陆数据库,因
为不完全,oracle不建议采用该认证方式。 

SQL> show parameter os_authent_prefix

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix                    string      ops$


全局认证 -  需要采用oracle的高级安全设置.

 

-------------- 


创建用户语法:
  CREATE USER username
            IDENTIFIED {BY password|EXTERNALLY}
           [DEFAULT TABLESPACE tablespace_name]
           [TEMPORARY TABLESPACE tablespace_name]
           [QUOTA [n [K|M]] ON tablespace_name]
           [PASSWORD EXPIRE]
           [ACCOUNT LOCK|UNLOCK]
           [PROFILE filename];

参数:

IDENTIFIED BY password:
     用来指定用户的确认方式为数据库确认,password是为该用户指定的密码

IDENTIFIED   EXTERNALLY:
     指定确认方式为操作系统确认,并且生成一个用操作系统确认的用户

DEFAULT TABLESPACE:
     用户默认的表空间,用于在该用户模式下创建的对象(如表、索引、簇、视图等)没有指
定表空间时数据库默认的存储表空间

TEMPORARY TABLESPACE:
        临时表空间,用于存储排序等事务处理时的存储空间用户暂存段表空间

QUOTA [n [K|M]] [UNLIMITD] ON tsname:
        指定表空间的限制配额,就是限制允许用户使用的表空间的数量(大小),UNLIMITD
表示无大小限制

PASSWORD EXPIRE:
     表明用户第一次登录时要修改密码

ACCOUNT LOCK|UNLOCK:
         锁定用户,lock为锁定,unlock为未锁定或解锁,默认为不锁定(unlocked)

PROFILE filename:
         用户的配置文件,用于限制用户对系统资源的使用,如果没有指定,则系统使用默
认的用户配置文件

 


举例:

1. 创建一个数据库验证的用户:

  CREATE USER testUser
      IDENTIFIED BY test
      DEFAULT TABLESPACE basedata
      TEMPORARY TABLESPACE TEMP
      QUOTA UNLIMITED ON USERS
      PASSWORD EXPIRE
      ACCOUNT UNLOCK
      PROFILE DEFAULT;
2. 授予用户连接权限 (用户只有拥有CREATE SESSION 权限才可能与数据库建立连接)
     GRANT CREATE SESSION TO testUser;
3. 修改用户信息:
     ALTER USER testUser IDENTIFIED BY temp;     -- 修改密码
     ALTER USER testUser ACCOUNT LOCK;       -- 锁定用户
4. 删除用户:
     DROP USER testUser CASCADE;    -- 级联删除,即将此用户拥有的全部对象一起删除
5. 查询用户信息:
     SELECT * FROM ALL_USERS;
     SELECT username, password, account_status FROM DBA_USERS;
 

 


8.1.1.2  sysdba的认证方式

对于sys用户来说,oracle提供了比较特殊的认证方式。 对于sys的认证就是oracle是否允许
我们以sysdba的权限登陆到数据库进行管理工作,因为数据库内建用户都放在数据字典中,数
据库没有开启之前无法访问数据字典,普通用户无法通过数据库验证身份,sys如果也放在数据
字典,同样无法登陆数据库,数据库启动都无法实现。

所以Oracle对sys用户认证提供两种方式: 操作系统认证和密码文件认证


A. 操作系统认证 -

操作系统用户A同时也是服务器数据库管理员组的成员(unix上是dba组,windows是ora_dba组,这些
用户组是在安装oracle软件的时候就建立了,不是dbca时),表示A已经具有操作系统权限,不再需要
提供sys的密码了,而是直接以sysdba权限登陆。比如:
SQL> connect  /   as sysdba 

ORA_DBA描述是: Members can connect to the Oracle database as a DBA without a password


设置操作系统认证: sqlnet.ora

sqlnet.authentication_services=(NTS)
如果是NTS, 表示要进行操作系统验证,如果没有sqlnet.ora文件,或该文件没有记录该条目,也
表示进行操作系统认证。否则,如果记录为NONE,

sqlnet.authentication_services=(NONE)
如果是NONE, 表示不进行操作系统认证,即便是dba组成员登陆OS, 如果想以sys的身份登入还是
需要输入密码,这个密码在密码文件中。


B. 密码文件认证 -

密码文件中记录着 sys用户的口令以及其它"特权用户"的用户名/口令,通俗的说就是这个文件中
记录了当前具有sysdba/sysoper权限的用户名及其口令。创建数据库实例的时侯,Oracle系统会自动创建一个与实例对应的密码文件。

对于unix/linux而言,密码文件存放在$ORACLE_HOME/dbs目录下,对于windows而言,%ORACLE_HOME%\
database下,unix下密码文件格式为orapw.ora,如果环境变量中ORACLE_SID为大写,比如TEST,
那么密码文件中的部分也要大写,小写也一样要匹配,否则登入会报错。windows下面文件格式为
PWD.ora, SID部分也要遵循大小写规则。


sys用户拥有dba,sysdba,sysoper等角色或权限,是oracle权限最高的用户,所有oracle的数据
字典的基表和视图都存放在sys用户中,登陆时也只能用sysdba、sysoper这两个身份,不能用normal
身份system用户拥有普通角色权限, 只能用normal身份登陆, 除非你对它授予了sysdba的系统权限
或者syspoer系统权限。

 


创建密码文件 -
linux/unix下面(在dbs目录下):
$orapwd file=orapwora10g.ora password=oracle entries=5 

window下面(在database目录下):
$orapwd file=PWDora10g.ora password=oracle entries=5 

其中entries表示同时有几个用户拥有sysdba的权限,同时他们的密码都放在密码文件中。
建立密码文件后,必须重新启动数据库才能使它生效。

 

参数remote_login_passwordfile -
该参数用来控制能否使用密码文件验证,参数有三个值:
A. None, 远程用户无法通过网络方式以sysdba或sysoper的权限登陆到数据库。且授权或回收SYSDBASYSOPER权限会失败。
B. Exclusive, 默认值,表示该密码文件只能被一个实例使用,可以向密码文件添加新的用户,若密码丢失,用户同样无法通过密码认证的方式登陆到数据库。
C. Shared,  该密码文件可以被多个数据库共享 , 但是密码文件只能存放sys用户的密码,不能添加其他用户。 任何使用这个密码文件的数据库都不能进行授权回收SYSDBASYSOPER权限的操作,但是这些数据库可以使用这个密码文件来进行验证。这种方式一般用于管理RAC数据库,或者同一台服务器上的多个不同数据库实例。


8.1.1.3  删除用户

SQL> drop user susan ; 如果有其他session以该身份登入,删除用户会失败,需要中断以该用户
登入实行的session , 然后等待PMON回收资源(查询v$session), 最后删除用户。

如果用户下面有对象存在,也会报错,需要加入cascade ;
SQL> drop user susan cascade ;  删除该用户及其下面的对象全部删除。

 

 

8.1.2   Profile与用户管理

可以使用Profile对用户所能使用的资源进行管理,profile存放在数据字典中,默认就有一个名为
default的profile . 可以通过dba_profiles 显示或者通过工具比如toad查看。

CREATE PROFILE DEFAULT LIMIT
  SESSIONS_PER_USER UNLIMITED
  CPU_PER_SESSION UNLIMITED
  CPU_PER_CALL UNLIMITED
  CONNECT_TIME UNLIMITED
  IDLE_TIME UNLIMITED
  LOGICAL_READS_PER_SESSION UNLIMITED
  LOGICAL_READS_PER_CALL UNLIMITED
  COMPOSITE_LIMIT UNLIMITED
  PRIVATE_SGA UNLIMITED
  FAILED_LOGIN_ATTEMPTS 10  
  PASSWORD_LIFE_TIME UNLIMITED
  PASSWORD_REUSE_TIME UNLIMITED
  PASSWORD_REUSE_MAX UNLIMITED
  PASSWORD_LOCK_TIME UNLIMITED
  PASSWORD_GRACE_TIME UNLIMITED
  PASSWORD_VERIFY_FUNCTION NULL;

从字段RESOURCE_TYPE中可以看出,profile管理的资源包括两类: password和kernel .

密码管理:
A.  FAILED_LOGIN_ATTEMPTS  10 , 连续登陆10次不成功锁定账号
B.  PASSWORD_LIFE_TIME UNLIMITED , 密码在多少天后失效,失效后必须修改密码
C.  PASSWORD_REUSE_TIME UNLIMITED, 指定的天数内,设置的密码不能重复
D.  PASSWORD_REUSE_MAX UNLIMITED,  指定的密码修改次数之内,密码不能重复
E.  PASSWORD_LOCK_TIME UNLIMITED,  一旦登陆次数超过指定的值,则锁定账号多少天
F.  PASSWORD_GRACE_TIME UNLIMITED,  密码失效缓冲期,期间可以登陆,但是每次都提示更改密码,
                                    指定的天数内还不更改密码,超过天数后账号被锁定。
G.  PASSWORD_VERIFY_FUNCTION NULL,  指定函数控制密码复杂度,函数样例在utlpwdmg.sql脚本中。


内部资源管理:
A. SESSIONS_PER_USER , 同一个用户最多能产生多少session
B. CPU_PER_SESSION , 每个session一次最多能持续占用CPU多长时间,百分之一秒为单位。
C. CPU_PER_CALL,  一次调用最多能持续占用cpu多长时间,比如执行SQL时,会有解析调用,执行调用等。
D. LOGICAL_READS_PER_SESSION, 每个session能够进行的逻辑读的最大个数
E. LOGICAL_READS_PER_CALL, 一次调用能够进行的逻辑读的最大个数
F. IDLE_TIME,  session持续idle时间超过该参数指定的时间,则中断该session的连接。idel指
session既没有消耗CPU, 也没有等待I/O.
G. CONNECT_TIME, 持续connect时间超过该参数指定的时间,则中断该session的连接。
H. PRIVATE_SGA,  每个session 能够使用的pga的最大尺寸。
I. COMPOSITE_LIMIT,  该参数是基于以上的参数的权重而进行的控制。

在删除profile时,如果被删除的profile已经分配给用户了,那么该profile不能被删除,可以添加
cascade, 表示删除profile, 并将名为default的默认pfofile应用到那些受影响的用户上。
SQL> drop profile my_profile cascade ;

 

 


8.2  权限管理

系统权限和对象权限

1. 系统权限 - 是指用户能够做什么事情的权限,比如创建表等,10g中有100多个系统权限,其中很多
含有any的字样,比如 create table权限表示可以在自己的schema中建表,相应的,create any table
表示可以在其他schema中建表,所有系统权限存放在system_privilege_map的数据字典表中。

对于管理而言,有一些常用的系统权限:

A. sysdba, sysoper , 最重要也是最大的权限,能在库中做任何事情。
B. restricted session , 以restricted模式开启,通常在进行维护性工作时,不希望其他用户登入,
会采用这种方式。 默认只有sys具有该权限。
C. create 或 create any 开头的权限
D. drop 或 drop any 权限
E. create session , 用户要登陆数据库,至少要有该权限。

权限赋予 -
SQL> grant create session, create table to susan ; 
加入admin option 表示该用户也可以把以该admin option方式获得的权限赋给其他用户。
SQL> grant create session, create table to susan with admin option ;

SQL> connect susan/passwd
SQL> grant create session  to susan2 ;


权限回收 - 
SQL> revoke create session, create table from susan ; 
权限从susan回收后,不影响已经分配给susan2的权限。

 


空间配额quota -

SQL> alter user susan quota 100M on base_data ;
可以查询dba_ts_quotas 查看;

 

带有any的系统权限,能在其他schema下处理对象,不过不能操作sys所有的对象,这个
特性是由o7_dictionary_accessibility 所决定的,该参数默认为false,如果是true,
只要用户具有any权限,就能处理其他schema包括sys下的对象了。为了安全,一般建议,
我们应该确保此参数为false。

 

 


对象权限 -

alter , delete, update, select, insert, execute, index, references 

将某个对象的权限赋予某个用户时,必须以对象所有者身份登入,然后将当前用户所具有的
对象的某个对象权限赋给另外的用户。

SQL> connect hr/passwd
SQL> grant select on employees to susan  ;
SQL> grant index on employees to susan  ;

SQL> connect sys/passwd
SQL> grant execute on dbms_output to susan  ;


grant option -

SQL> connect  /   as sysdba
SQL> grant update on hr.employees to susan ;

SQL> grant select on hr.employees to susan with grant option ;
以上表示用户susan 可以将查询用户hr下的employees表的权限赋给其他用户。比如:

SQL> connect susan/passwd
SQL> grant select on hr.employees to susan2 ;
然而当我们从susan用户回收这个权限的时候,susan2上的此权限同样消失了。也就是说对象
权限的回收具有连带效应。

 

 

8.3   角色管理

角色可以理解为权限的集合,我们可以将某个角色赋给某个用户,那么这个用户就拥有了角色
所包含的所有权限; 也可以将角色赋给另外的角色。 为角色赋予角色时,不能形成闭环,比如
A赋予B,B赋予C, C又赋予A, 则报错。

可以从dba_roles中看到很多定义好的角色如 dba, resource  。

dba :  拥有大部分的管理权限,一般不建议通过sys或system管理数据库,而是建立一个新用户,
赋予dba权限就可以使用该用户对数据库进行日常管理了。

resource :  该角色拥有很多create开头的权限,比如 create table, create procedure等,在
oracle9i 中resource拥有unlimited tablespace的系统权限,但是到了10g不再具有。

 

创建角色 - 
SQL>  create role my_role ;
SQL>  grant create session to my_role;
将角色赋给其他用户
SQL>  grant my_role to susan ;
将角色从其他用户收回
SQL>  revoke my_role from susan ;


我们也可以对角色使用不同的认证方式,表示在启用角色时,是否对启用的权限进行认证,使用下面
的命令启用角色权限:

alter role role_name not identified  ;

alter role role_name identified { by |  using | externally | globally} ;


not identified :  不认证,默认选择。
identified by : 启动角色时采用密码认证。
identified externally : 启动角色时采用操作系统认证 。
identified globally :  启动角色时采用Oracle的高级安全选项。
identified using : 只能通过执行特定的包来启用角色。

 

某个用户可以有多个角色,这些角色中可分为两类:

1. 默认角色:  这些角色在用户登陆时自动启用,如果我们为默认角色指定认证方式,比如密码
认证,那么启用该角色时不用输入密码,也即认证方式对默认角色来说无意义。

2. 非默认角色: 这些角色在用户登陆时禁用,需要发出set role来进行启用,启用时需要认证。


在设定用的角色时,我们指定哪些角色为默认角色,那么该用户剩下的其他角色就是非默认角色。如:
SQL> create role app_role identified by oracle ;
SQL> grant create session , resource to app_role ;
SQL> create role conn_role ; 
SQL> grant create session to conn_role ;
SQL> grant app_role, conn_role to susan ;

将conn_role角色设置为susan的默认角色
SQL> alter user susan default role conn_role ;
也可以类似:
SQL> alter user susan default role all except app_role ;
表示除了app_role之外都是默认角色,如果想取消用户上的所有角色:
SQL> alter user susan default role none ;

可以启用susan上的另外一个角色:
SQL> set role app_role identified by oracle ;

 

请使用浏览器的分享功能分享到微信等