[Oracle19C 数据库管理] 用户与权限管理

用户管理

用户具有以下属性:

  • 用户名: 不能超过30位。不能包含特殊字符。必须用字符开头。用户名不区分大小写。
  • 认证方式: 最常见的是密码认证。
  • 默认永久表空间: 控制用户可以在哪个表空间里创建对象。
  • 默认临时表空间: 临时表空间没有配额限制。
  • 用户配置文件user profile: 一组密码限制策略。
  • 初始消费组: Oracle资源管理器所使用。
  • 账号状态: open, locked, expired。

Schema是用户所拥有的一组数据库对象的集合。Schema Object是schema中创建的任何对象(表、索引、同义词,视图,Database Link,序列、存储过程等)。

Oracle提供的管理员账号


SYS与SYSTEM是不能被删除的,在DBCA创建实例的时候为他们创建了密码。
可以为其他Oracle自带管理员账号解锁并重设密码。

SQL> alter user syskm identified by oracle account unlock;
User altered.

多租户下的公共账号与本地帐号

  • 公共账号COMMON USER
    公共账号将同步到所有的现有的和将来创建的PDB中。默认情况下,公共账号的名字必须使用C##开头,必须C##Admin。
    初始化参数COMMON_USER_PREFIX指定了公共账号、角色和配置文件Profile的前缀。
    创建公共账号,需要在CDB$ROOT或者APP$ROOT创建。使用CREATE USER,并且包含CONTAINER=ALL的子句。

公共账号可以使用同样的用户名和密码登录到所有的PDB。公共账号不能与任何存在于PDB的本地帐号重名。

  • 本地用户LOCAL USER
    本地用户只是在PDB中创建的用户。不能在CDB$ROOT或者APP$ROOT创建本地账号。
    登录到想要创建本地帐号的PDB中,使用CREATE USER创建本地帐号。
SQL> CREATE USER C##CDBADMIN IDENTIFIED BY oracle ACCOUNT UNLOCK CONTAINER=ALL;
User created.

SQL> GRANT CREATE SESSION, DBA TO C##CDBADMIN CONTAINER=ALL;
Grant succeeded.

SQL> CONN C##CDBADMIN/oracle@pdb1;
Connected.

查看用户创建的common user
SQL> SELECT USERNAME, CON_ID FROM CDB_USERS WHERE COMMON='YES' AND USERNAME LIKE 'C##%';

USERNAME                           CON_ID
------------------------------ ----------
C##FIDELIO                              3
C##CDBADMIN                             3

创建本地用户

SQL> CREATE USER pdb1_admin IDENTIFIED BY oracle
  2  DEFAULT TABLESPACE users
  3  TEMPORARY TABLESPACE temp
  4  ACCOUNT UNLOCK;

User created.

SQL> GRANT CREATE SESSION ,DBA TO pdb1_admin;
Grant succeeded.

SQL> conn pdb1_admin/oracle@pdb1
Connected.

SQL> select username ,con_id from cdb_users where common='NO';

USERNAME                           CON_ID
------------------------------ ----------
PDBADMIN                                3
HR                                      3
PDB1_ADMIN                              3
SMITH                                   3
OPS$LEO                                 3

Schema Only Account

Schema Only Account实现以下功能:

  • Schema Only Account用户无法登录到实例。
  • 强制使用应用程序访问数据。
  • 无法在database link中使用schema only account连接数据库。
  • 使用NO AUTHENTICATION子句创建schema only account。
  • 管理特权可以分配到Schema only user,也可以撤销。

应用开发者可能需要只包含SCHEMA数据,但不需要登陆的账号。强制数据只能通过应用进行访问,避免手工登录到实例进行操作。可以通过ALTER USER来启用用户登录实例的功能。

使用CREATE USER ... NO AUTHENTICATION子句创建SCHEMA ONLY ACCOUNT。

通过查询DBA_USERS,可以查看用户的身份验证方式。SCHEMA ONLY ACCOUNT的AUTHENTICATION TYPE=NONE, 密码认证的用户的AUTHENTICATION TYPE=PASSWORD。

许多Oracle自带的Schema都是SHCEMA ONLY ACCOUNT,避免了管理员需要定期为用户修改密码,同样减少了这些用户使用默认密码的安全威胁。

验证用户

连接到实例的用户必须通过验证。

可用的验证方式:

  1. 密码验证
  2. 操作系统验证。
  3. 密码文件验证。
  4. 强认证,例如Kerberos验证。

系统特权用户必须使用操作系统认证或者密码文件认证或者强认证方式,无论数据库状态如何,都可以通过认证。

密码验证

设置密码的时候,可以将密码设置为立即过期,用户下次登陆的时候会提示更改密码。
密码不能超过30位,可以是任何字符,大小写敏感。
通过网络进行密码验证,密码会自动使用AES加密,对用户来说这个加密是透明的。
可以对用户设置密码策略,这是通过用户配置实现的(user profile)。

使用密码文件验证

可以为Oracle数据库实例或者ASM实例配置密码文件认证。密码文件存储公共或者本地管理员的用户名和密码。

DBCA创建数据库的过程中会创建密码文件。
设置初始化参数REMOTE_LOGIN_PASSWORDFILE。
为用户分配系统特权(Grant sysdba to mydba)。

Unix和Linux中,密码文件名为orapwORACLE_SID,存储在$ORACLE_HOME/dbs中。
Windows,密码文件名为PWD<ORACLE_SID>,存储在$ORACLE_HOME\database目录中。

SQL> select username, sysdba, sysoper, sysbackup, account_status, common, con_id 
from v$pwfile_users;

USERNAME   SYSDB SYSOP SYSBA ACCOUNT_STATUS  COMMON       CON_ID
---------- ----- ----- ----- --------------- -------- ----------
SYS        TRUE  TRUE  FALSE OPEN            YES               0
SYSTEM     TRUE  TRUE  FALSE OPEN            YES               0
PDBADMIN   TRUE  FALSE FALSE OPEN            NO                3

操作系统认证

Oracle Universal Installer安装的过程中,会在Linux创建一系列的用户组。每个用户组对应到Oracle的权限组。比如系统dba组映射为Oracle的sysdba。
如果操作系统用户不属于以下组,则不能使用操作系统认证登录Oracle实例。

属于这些用户组的用户,可以直接登录Oracle实例,而不需要输入用户名或密码。

可以不输入用户名和密码,指定AS后面的权限即可。
sqlplus / as sysdba
sqlplus / as sysoper

输入错误的用户名和密码一样可以连接。
[oracle@ol7-19c ~]$ sqlplus any/any as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 30 20:31:38 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>

如果使用操作系统认证,需要设置OS_AUTHENT_PREFIX初始化参数,来指定操作系统认证用户名的前缀,这个前缀的默认值是OPS$, 当操作系统用户leo登录时,Oracle会检查是否有一个OPS$LEO的用户存在,如果存在,则允许用户登录。

SQL> show parameter os_authent_prefix;

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

可以查询SESSION_PRIVS字典视图查看用户拥有的系统特权。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY PRIVILEGE;

PRIVILEGE
----------------------------------------
ADMINISTER ANY SQL TUNING SET
ADMINISTER DATABASE TRIGGER
ADMINISTER RESOURCE MANAGER
ADMINISTER SQL MANAGEMENT OBJECT
ADMINISTER SQL TUNING SET
ADVISOR
ALTER ANY ANALYTIC VIEW
ALTER ANY ASSEMBLY
ALTER ANY ATTRIBUTE DIMENSION
ALTER ANY CLUSTER
...省略

表空间配额

配额是表空间允许用户使用的最大空间量。默认情况下,用户在所有的表空间都没有配额。
不能为用户在SYS, SYSAUX分配配额,也就是说只有SYS和SYSTEM才能操作这两个表空间。
也不需要为用户分配临时表空间和Undo表空间的配额,

分配表空间的三个选项

  • UNLIMITED 用户对某个表空间不受限制。
  • UNLIMITED TABLESPACE 用户在所有表空间不受限制。
  • VALUE 设置一个用户可用的值, K or M。
SQL> CONN leozhang/oracle@pdb1
Connected.
SQL> create table test (id number);
Table created.

SQL> insert into test values(1);
insert into test values(1)
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'

给予用户在users表空间1000M配额
SQL> ALTER USER leozhang QUOTA 1000M ON users;
User altered.

给予用户在users表空间无限配额
SQL> ALTER USER leozhang QUOTA UNLIMITED ON users;
User altered.

给予用户在所有表空间的无限配额
SQL> GRANT UNLIMITED TABLESPACE TO leozhang;
Grant succeeded.

----未整理----

配置权限与角色

DBA_SYS_PRIVS查看用户和角色所拥有的系统权限。

SQL> create user itleo identified by oracle account unlock;
User created.

SQL> grant manager to itleo;
Grant succeeded.

SQL> grant drop any table to itleo;
Grant succeeded.


SQL> select grantee, granted_role, admin_option from dba_role_privs where grantee='ITLEO';

GRANTEE              GRANTED_ROLE         ADM
-------------------- -------------------- ---
ITLEO                MANAGER              NO

SQL> select grantee, privilege, admin_option from dba_sys_privs where grantee='ITLEO';

GRANTEE              PRIVILEGE                                ADM
-------------------- ---------------------------------------- ---
ITLEO                DROP ANY TABLE                           NO

DBA_ROLE_PRIVS查看赋给用户的角色, ADM代表用户有权将角色赋给其他用户。

SQL> select granted_role, admin_option from cdb_role_privs where grantee='PDBADMIN';

GRANTED_ROLE         ADM
-------------------- ---
PDB_DBA              YES
DBA                  NO

ROLE_SYS_PRIVS查看付给角色的系统权限。

SQL> create role manager;
Role created.

SQL> grant create session, create table, select any table to manager;
Grant succeeded.

SQL> select role, privilege from role_sys_privs where role='MANAGER';

ROLE                 PRIVILEGE
-------------------- ----------------------------------------
MANAGER              CREATE TABLE
MANAGER              CREATE SESSION
MANAGER              SELECT ANY TABLE

设置DEFAULT ROLE给用户

分配给用户的角色都是默认角色,默认是启用的。

SQL> select grantee, granted_role,default_role from dba_role_privs
  2  where grantee='WHARTON';

GRANTEE              GRANTED_ROLE         DEF
-------------------- -------------------- ---
WHARTON              SELECT_USER          YES
WHARTON              CONNECT              YES

可以通过ALTER USER ... DEFAULT ROLE ...设置默认角色。

SQL> alter user wharton default role connect;
User altered.

SQL> select grantee, granted_role,default_role from dba_role_privs
  2  where grantee='WHARTON';

GRANTEE              GRANTED_ROLE         DEF
-------------------- -------------------- ---
WHARTON              SELECT_USER          NO
WHARTON              CONNECT              YES

SQL> alter user wharton default role connect, select_user;
User altered.

SQL> select grantee, granted_role,default_role from dba_role_privs
  2  where grantee='WHARTON';

GRANTEE              GRANTED_ROLE         DEF
-------------------- -------------------- ---
WHARTON              SELECT_USER          YES
WHARTON              CONNECT              YES

用户可以使用set role来激活属于自己的角色。
SET ROLE 角色1, 角色2,角色3 这里没有列出的角色将会是禁用状态。

SQL> conn wharton/oracle@pdb1;
Connected.
SQL> show user;
USER is "WHARTON"

SQL> set role connect;
Role set.

SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT

SQL> set role connect, select_user;
Role set.

SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT
SELECT_USER

配置用户资源限制

Oracle通过PROFILE来控制用户资源消耗以及管理账户状态和密码过期设置。
RESOURCE_LIMIT初始化参数是TRUE的时候,profile才能进行资源限制。

SQL> show parameter resource_limit;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit                       boolean     TRUE

profile可以在common或者local级别创建。用户需要CREATE PROFILE的权限才能创建profile。

/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/admin/utlpwdmg.sql 文件中关于密码的模板

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180 #密码有效期180天
PASSWORD_GRACE_TIME 7 #超过有限期后有7天宽限期
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10 #10次不成功的登陆锁定密码
PASSWORD_LOCK_TIME 1 #密码锁定1天
INACTIVE_ACCOUNT_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

将上面的语句提取出来后,修改:
CREATE PROFILE PDB1_PROFILE LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

使用system链接到PDB1,将上面的语句贴入。

[oracle@ol7-19c ~]$ sqlplus system/oracle@pdb1


SQL> CREATE PROFILE PDB1_PROFILE LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX  UNLIMITED
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
  9  PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

Profile created.

应用Profile到用户。

SQL> ALTER USER itleo PROFILE pdb1_profile;
User altered.

创建common profile
CREATE PROFILE C##CDB_PROFILE LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION ora12c_verify_function container=all;

SQL> alter session set container=cdb$root;
Session altered.

SQL>
CREATE PROFILE C##CDB_PROFILE LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX  UNLIMITED
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
  9  PASSWORD_VERIFY_FUNCTION ora12c_verify_function container=all;

Profile created.

应用c##cdb_profile到pdb1的Frank用户。
SQL> alter user frank  profile c##cdb_profile;
User altered.

SQLDeveloper管理profile

  1. 查看pdb1的pdbadmin的profile是default。

  2. 创建一个HR_Profile

  3. 查看初始化参数 Resource_Limit,默认是True。

  4. 在SQLPLUS中,通过DBA_PROFILES查看Profile的设置。

SQL> SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES
  2  WHERE PROFILE='HR_PROFILE';

PROFILE              RESOURCE_NAME              LIMIT
-------------------- -------------------------- ---------------
HR_PROFILE           COMPOSITE_LIMIT            DEFAULT
HR_PROFILE           SESSIONS_PER_USER          DEFAULT
HR_PROFILE           CPU_PER_SESSION            DEFAULT
HR_PROFILE           CPU_PER_CALL               DEFAULT
HR_PROFILE           LOGICAL_READS_PER_SESSION  DEFAULT
HR_PROFILE           LOGICAL_READS_PER_CALL     DEFAULT
HR_PROFILE           IDLE_TIME                  15
HR_PROFILE           CONNECT_TIME               DEFAULT
HR_PROFILE           PRIVATE_SGA                DEFAULT
HR_PROFILE           FAILED_LOGIN_ATTEMPTS      DEFAULT
HR_PROFILE           PASSWORD_LIFE_TIME         DEFAULT

PROFILE              RESOURCE_NAME              LIMIT
-------------------- -------------------------- ---------------
HR_PROFILE           PASSWORD_REUSE_TIME        DEFAULT
HR_PROFILE           PASSWORD_REUSE_MAX         DEFAULT
HR_PROFILE           PASSWORD_VERIFY_FUNCTION   DEFAULT
HR_PROFILE           PASSWORD_LOCK_TIME         DEFAULT
HR_PROFILE           PASSWORD_GRACE_TIME        DEFAULT
HR_PROFILE           INACTIVE_ACCOUNT_TIME      DEFAULT

17 rows selected.

将HR用户应用到HR_PROFILE
ALTER USER HR PROFILE HR_PROFILE

HR用户空闲15分钟后自动断开

[oracle@ol7-19c ~]$ sqlplus hr/hr@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 4 19:55:36 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Fri Jan 27 2023 11:30:31 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


SQL>
SQL> desc dba_users;
ERROR:
ORA-02396: exceeded maximum idle time, please connect again
  1. 修改profile的INACTIVE_ACCOUNT_TIME为10天, 能看到ora-02377报错,通过oerr ora 2377查看报错的信息并修改为15天。
SQL> ALTER PROFILE HR_PROFILE LIMIT INACTIVE_ACCOUNT_TIME 10;
ALTER PROFILE HR_PROFILE LIMIT INACTIVE_ACCOUNT_TIME 10
*
ERROR at line 1:
ORA-02377: invalid profile limit INACTIVE_ACCOUNT_TIME


SQL> ! oerr ora 2377
02377, 00000, "invalid profile limit %s"
//  *Cause:  A value of 0 or lower was specified for the limit.
//  *Action: Specify a limit greater than 0. For password profile parameters,
//           some additional restrictions apply:
//             * For the INACTIVE_ACCOUNT_TIME profile parameter, the specified
//               limit cannot be less than 15 days.
//             * For the PASSWORD_GRACE_TIME profile parameter, 0 is allowed
//               as a permissible value.

SQL> ALTER PROFILE HR_PROFILE LIMIT INACTIVE_ACCOUNT_TIME 15;

Profile altered.

posted on 2023-01-29 15:21  LeoZhangJing  阅读(1824)  评论(0编辑  收藏  举报

导航