半夏微凉

半夏微凉

〔数据库〕— 用户、权限、角色及profile概要文件管理

1.数据库安全控制策略概述

安全性是评估一个数据库的重要指标,oracle数据库从3个层次上采取安全控制策略:

  • 系统安全性。在系统级别上控制数据库的存取和使用机制,包括有效的用户名与口令、是否可以连接数据库、用户可以进行哪些系统操作等;
  • 数据安全性。在数据库模式对象级别上控制数据库的存取和使用机制。用户要对某个模式对象进行操作,必须要有操作的权限;
  • 网络安全性。Oracle通过分发Wallet、数字证书、SSL安全套接字和数据密钥等办法来保证数据库的网络传输安全性。

    数据库的安全可以从以下几个方面进行管理:

  • 用户账户管理
  • 用户身份认证方式管理。Oracle提供多种级别的数据库用户身份认证方式,包括系统、数据库、网络3种类型的身份认证方式
  • 权限和角色管理。通过管理权限和角色,限制用户对数据库的访问和操作
  • 数据加密管理。通过数据加密来保证网络传输的安全性
  • 表空间设置和配额。通过设置用户的存储表空间、临时表空间以及用户在表空间上使用的配额,可以有效控制用户对数据库存储空间的使用
  • 用户资源限制。通过概要文件设置,可以限制用户对数据库资源的使用数据库审计。监视和记录数据库中的活动,包括审计所有的SQL语句、审计SQL权限、审计模式对象以及审计网络活动等。
接下来将对数据库安全管理方法进行一 一讨论。

2. 用户管理

2.1 预定义用户

在oracle创建时创建的用户,我们称为预定义用户,预定义用户根据作用不同分为3类:

  • 管理员用户:包括SYS,SYSTEM,SYSMAN,DBSNMP等。SYS是数据库中拥有最高权限的管理员,可以启动、关闭、修改数据库,拥有数据字典;SYSTEM是一个辅助的数据库管理员,不能启动和关闭数据库,但是可以进行一些管理工作,如创建和删除用户;SYSMAN是OEM的管理员,可以对OEM进行配置和管理;DBSNMP用户是OEM代理,用来监视数据库的。以上这些用户都不能删除。
  • 示例方案用户:在安装Oracle或使用odbc创建数据库时,如果选择了”示例方案”,会创建一些用户,在这些用户对应的schema中,有产生一些数据库应用案例。这些用户包括:BI、HR、OE、PM、IX、SH等。默认情况下,这些用户均为锁定状态,口令过期。
  • 内置用户:有一些Oracle特性或Oracle组件需要自己单独的模式,因此为他们创建了一些内置用户。如APEX_PUBLIC_USER、DIP等。默认情况下,这些用户均为锁定状态,口令过期。
此外还有2个特殊的用户SCOTT和PUBLIC,SCOTT是一个用于测试网络连接的用户,PUBLIC实际是一个用户组,数据库中任何用户都属于该用户组,如果要为数据库中的全部用户授予某种权限,只需要对PUBLIC授权即可。

2.2 用户属性

在创建用户时,必须使用安全属性对用户进行限制,用户的安全属性主要包括:

  • 用户名:在同一个数据库中,用户名是唯一的,并且不能与角色名相同;
  • 用户身份认证:Oracle采用多种方式进行身份认证,如数据库认证、操作系统认证、网络认证等;
  • 默认表空间:用户创建数据库对象时,如果没有显式指明存储在哪个表空间中,系统会自动将该数据库对象存储在当前用户的默认表空间,在Oracle 11g中,如果没有为用户指定默认表空间,则系统将数据库的默认表空间作为用户的默认表空间;
  • 临时表空间:临时表空间分配与默认表空间相似,如果不显式指定,系统会将数据库的临时表空间作为用户的临时表空间;
  • 表空间配额:表空间配额限制用户在永久表空间中可以使用的存储空间的大小,默认新建用户在表空间都没有配额,可以为每个用户在表空间上指定配额,也可授予用户UMLIMITED TABLESPACE系统权限,使用户在表空间的配额上不受限制。不需要分配临时表空间的配额;
  • 概要文件:每个用户必须具有一个概要文件,从会话级和调用级两个层次限制用户对数据库系统资源的使用,同时设置用户的口令管理策略。如果没有为用户指定概要文件,Oracle将自动为用户指定DEFAULT概要文件;
  • 设置用户的默认角色
  • 账户状态:创建用户时,可以设定用户的初始状态,包括口令是否过期和账户是否锁定等。

可以通过数据字典dba_users查询各个用户的属性(这里只截取了前面几列):

SQL> select * from dba_users;                                                                                                           

USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED
-———– ———- ———- —————– ———– ———– ——————- ———————- ———–
SCOTT 84 OPEN 2017/8/20 0 USERS TEMP 2009/8/15 0
LIJIAMAN 91 OPEN 2017/10/31 USERS TEMP 2017/2/25 1
ORACLE_OCM 21 EXPIRED & LOCKED 2009/8/15 0 2009/8/15 0 USERS TEMP 2009/8/15 0
XS$NULL 2147483638 EXPIRED & LOCKED 2009/8/15 0 2009/8/15 0 USERS TEMP 2009/8/15 0


2.3 创建用户

创建用户语法如下:

CREATE USER user_name IDENTIFIED
[BY password] |
[EXTERNALLY [AS ‘certificate_DN’ | ‘kerberos_principal_name’] ] |
[GLOBALLY [AS ‘directory_DN’] ]
[DEFAULT TABLESPACE tablespace_name]
[TEMPORARY TABLESPACE tablespace_name | tablespace_group_name]
[QUOTA n K | M | UNLIMITED ON tablespace_name ]
[PROFILE profile_name]
[PASSWORD EXPIRE]
[ACCOUNT LOCK | UNLOCK];\

-user_name:新创建的用户的名称;
-IDENTIFIED:指明用户认证方式;
-BY password:采用数据库身份认证,password为用户密码;
-EXTERNALLY:指定用户采用外部认证,其中:
   ①AS ‘certificate_DN’指定用户采用ssl外部身份认证;
   ②AS ‘kerberos_principal_name’指定用户采用kerberos外部身份认证;
-GLOBALLY AS ‘directory_DN’:指定用户采用全局身份认证;
-DEFAULT TABLESPACE tablespace_name:设置用户的默认表空间;
-TEMPORARY TABLESPACE tablespace_name | tablespace_group_name:设置用户临时表空间/表空间组;
-QUOTA n K|M|UNLIMITED ON tablespace_name:指定用户在特定表空间上的配额;
-PROFILE profile_name:为用户指定概要文件;
-PASSWORD EXPIRE:指定用户密码到期,用户首次登陆时系统会要求改密码;
-ACCOUNT LOCK|UNLOCK:指定用户为锁定/非锁定状态,默认不锁定。

create user lentim identified by 123456 default tablespace LENTIM quota 5M profile pro_test password expire;


2.4 修改用户

修改用户采用ALTER实现,语句与CREATE USER基本相同,唯一不同的是多了DEFAULT ROLE选项,用于指定用户的默认角色:

ALTER USER user_name

[DEFAULT ROLE [role_list] | [ALL [EXCEPT role_list]] | NONE ]

;

其中: 
-role_list:指定角色列表;
-ALL:指定全部角色;
-EXCEPT role_list:除了role_list指定的角色之外的角色;
-NONE:不指定角色 .
例1:修改用户密码

alter user username identified by newpassword;

例2:修改用户表空间

alter user lentim default tablespace LENTIM;


2.5 锁定与解锁用户

当用户被锁定后,就不能登录数据库了,但是用户的所有数据库对象仍然可以继续使用,当用户解锁后,用户就可以正常连接到数据库。在Oracle中,当账户不再使用时,就可以将其锁定。通常,对于不用的账户,可以进行锁定,而不是删除。

例1:锁定与解锁用户

alter user lentim account lock/unlock;

/*锁定与解锁 SCOTT用户操作过程:*/
/*使用 SYS锁定 SCOTT账户,锁定之后无法在登录*/
SQL> show user;
USER 为 "SYS"
SQL> ALTER USER SCOTT ACCOUNT LOCK;

用户已更改。

SQL> conn scott/tiger
ERROR:
ORA-28000: the account is locked


警告: 您不再连接到 ORACLE。


/*解锁SCOTT账户,解锁后登录到数据库*/
SQL> conn sys as sysdba
输入口令:
已连接。
SQL> ALTER USER SCOTT ACCOUNT UNLOCK;

用户已更改。

SQL> conn scott/tiger;
已连接==。==

2.6 删除用户

使用drop user删除用户,基本语法为:

DROP USER user_name [CASCADE];

如果用户拥有数据库对象,则必须使用CASCADE选项,Oracle 先删除用户的数据库对象,再删除该用户。
例1:锁定与解锁用户

drop user lentim cascade;


2.7 查询用户信息

在Oracle中,包含用户信息的数据字典如下:

视图名称 说明
DBA_USERS 包含数据库的所有用户的详细信息(15项)
ALL_USERS 包含数据库所有用户的用户名、用户ID和用户创建时间(3项)
USER_USERS 包含当前用户的详细信息(10项)
DBA_TS_QUOTAS 包含所有用户的表空间配额信息
USER_TS_QUOTAS 包含当前用户的表空间配额信息
V$SESSION 包含用户会话信息
V$SESSTAT 包含用户会话统计信息

3. 资源限制与口令管理

在数据库中,对用户的资源限制与用户口令管理是通过数据库概要文件(PROFILE)实现的,每个数据库用户必须具有一个概要文件,通常DBA将用户分为几种类型,为每种类型的用户单独创建一个概要文件。概要文件不是一个具体的文件,而是存储在SYS模式的几个表中的信息的集合。

3.1 资源限制

概要文件通过一系列资源管理参数,从会话级和调用级两个级别对用户使用资源进行限制。会话资源限制是对用户在一个会话过程中所能使用的资源进行限制,调用资源限制是对一条SQL语句在执行过程中所能使用的资源总量进行限制。资源限制的参数如下:

  • CPU使用时间:在一个会话或调用过程中使用CPU的总量;
  • 逻辑读:在一个会话或一个调用过程中读取物理磁盘和逻辑内存数据块的总量;
  • 每个用户的并发会话数;
  • 用户连接数据库的最长时间;
下面是lentim用户的资源限制信息:
[oracle@python-db1 ~]$ sqlplus lentim/123456@python-db1:1521/pdb

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 5 00:17:31 2019
Version 19.3.0.0.0

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

Last Successful login time: Sun Aug 04 2019 22:42:32 +08:00

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

SQL> select * from user_resource_limits;

RESOURCE_NAME LIMIT
-————————————————————— ———–
COMPOSITE_LIMIT UNLIMITED
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
IDLE_TIME UNLIMITED
CONNECT_TIME UNLIMITED
PRIVATE_SGA UNLIMITED

9 rows selected.


3.2 口令管理

oracle概要文件用于数据库口令管理的主要参数如下:

  • FAILED_LOGIN_ATTEMPTS:限制用户失败次数,一旦达到失败次数,账户锁定;
  • PASSWORD_LOCK_TIME:用户登录失败后,账户锁定的时间长度;
  • PASSWORD_LIFE_TIME:用户口令的有效天数,达到设定天数后,口令过期,需要重新设置新的口令;
下图是scott用户的口令管理参数设置信息:
SQL> col LIMIT for a20
SQL> select * from user_password_limits;

RESOURCE_NAME LIMIT
-————————————————————— ——————–
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME 180
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7
INACTIVE_ACCOUNT_TIME UNLIMITED

8 rows selected.


3.3 查询概要文件信息

在Oracle 11g中,包含概要信息的数据字典如下:

视图名称 说明
DBA_USERS 包含数据库中所有用户属性信息,包括使用的概要文件(profile)
DBA_PROFILES 包含数据库中所有的概要文件及其资源设置、口令管理设置等信息
USER_PASSWORD_LIMITS 包含当前用户的概要文件的口令限制参数设置信息
USER_RESOURCE_LIMITS 包含当前用户的概要文件的资源限制参数设置信息
RESOURCE_COST 每个会话使用资源的统计信息

3.4 概要文件新增

create profile profile_name
limit
{resource_parameters|password_parameters} ##资源参数|口令参数

resource_parameters 参数主要有
CPU_PER_SESSITION 允许一个会话占用的cpu总量
CPU_PER_CALL 允许一个调用占用cpu的最大值
CONNECT_TIME 允许一个持续的会话的时间最大值

password_parameters 常用的参数有
PASSWORD_LIFE_TIME 指多少天后口令失效
PASSWORD_REUSE_TIME 指密码保留的时间
PASSWORD_GRACE_TIME 指密码失效后锁定\

例:

create profile pro_test limit password_life_time 30;


3.5 修改profile

alter profile profile_name limit {resource_parameters|password_parameters};

例:

alter profile pro_test limit password_life_time 90;


3.6 删除profile

drop profile profile_name [cascade];


4. 权限管理

在Oracle数据库中,用户权限主要分为系统权限与对象权限两类。系统权限是指在数据库基本执行某些操作的权限,或针对某一类对象进行操作的权限,对象权限主要是针对数据库对象执行某些操作的权限,如对表的增删(删除数据)查改等。

4.1 系统权限

1. 系统权限概述

在Oracle 19中,一共有200多项系统权限,可通过数据字典system_privilege_map获得所有的系统权限。

SQL> select * from system_privilege_map; 

PRIVILEGE NAME PROPERTY
-——— —————— ———-
-3 ALTER SYSTEM 0
-4 AUDIT SYSTEM 0
-5 CREATE SESSION 0
-6 ALTER SESSION 0
… … …
257 rows selected.

2. 系统权限的授予

授予用户系统权限的SQL语法为:

GRANT system_privilege_list | [ALL PRIVILEGES]

TO user_name_list | role_list | PUBLIC [WITH ADMIN OPTION]\

[with the grant any object];

其中:
-system_privilege_list:系统权限列表,以逗号分隔;
-ALL PRIVILEGES:所有系统权限;
-user_name_list:用户列表,以逗号分隔;
-role_list:角色列表,以逗号分隔;
-PUBLIC:给数据库中所有用户授权;
-WITH ADMIN OPTION:允许系统权限接收者再将权限授予其它用户
-with the grant any object: 表示当前用户可以给其他用户赋予对象权限

在授予用户系统权限时,需要注意:

  • 只有DBA用户才有alter database;
  • 应用开发者一般需要拥有create table、create view、create index等系统权限;
  • 普通用户一般只需具有create session权限
  • 在授权用户时带有with admin option子句时,用户可以将获得的权限再授予其它用户
例:赋予系统权限

grant create session to lentim with admin option;

3. 系统权限的回收

回收用户系统权限的SQL语法如下:

REVOKE system_privilege_list | [ALL PRIVILEGES]

FROM user_name_list | role_list | PUBLIC

回收用户系统权限需要注意以下3点:

  • 多个管理员授予同一个用户相同的权限,其中一个管理员回收其授予用户的系统权限,该用户将不再具有该系统权限;
  • 为了回收用户系统权限的传递性(授权时使用了with admin option),须先回收该系统权限,在重新授予用户该权限;
  • 如果一个用户的权限具有传递性,并且给其它用户授权,那么该用户系统权限被收回后,其它用户的系统权限并不会受影响;
例:撤消系统权限

revoke system_privilege from user|role;


4.2 对象权限

对象权限是指对某个特定模式对象的操作权限。数据库模式对象所有者拥有该对象的所有对象权限,对象权限的管理实际上是对象所有者对其他用户操作该对象的权限管理。在Oracle数据库中,不同类型的对象具有不同的对象权限,而有的对象并没有对象权限,只能通过系统权限进行管理,如簇、索引、触发器、数据库链接等。

1.对象权限的授予

在Oracle数据库中,用户可以直接访问同名Schema下的数据库对象,如果需要访问其它Schema下的数据库对象,就需要具有相应的对象权限。对象权限授予的SQL语法为:

GRANT object_privilege_list | ALL [PRIVILEGES] [ (column,…) ]

ON [schema.]object

TO user_name_list | role_list | PUBLIC [WITH GRANT OPTION];

其中:
-object_privilege_list:对象权限列表,以逗号分隔;
-ALL PRIVILEGES:全部权限;
-[schema.]object:待授权的对象;
-user_name_list:用户列表,以逗号分隔;
-role_list:角色列表,以逗号分隔;
-PUBLIC:所有用户

例:赋予对象权限

grant delete on t_test to lentim with the grant any object;

2.对象权限的回收

回收对象权限的SQL语法为:

REVOKE object_privilege_list | ALL [PRIVILEGES]

ON [schema.]object

FROM user_name_list | role_list | PUBLIC [CASCADE CONSTRAINTS] | [FORCE];

其中:
-CASCADE CONSTRAINTS:当回收REFERENCE对象权限或回收ALL PRIVILEGES,删除利用REFERENCES对象权限创建的外键约束;
-FORCE:当回收在表中被使用的用户自定义对象类型的EXECUTE权限时,必须指定FORCE关键字。

回收对象权限需要注意以下3点:

  • 多个管理员授予同一个用户相同的对象权限,一个管理员将该对象权限回收后,该用户不再具有该对象权限;
  • 为了回收用户对象权限的传递性,须先回收该对象权限,再重新赋予给用户该对象权限;
  • 如果一个用户的对象权限具有传递性,并且已经给其它用户授权,那么该用户的对象权限被回收后,其它用户的对象权限也将被收回。(值得注意的是,这一条与系统权限传递性的回收不相同)。
例:撤消对象权限

revoke object_privilege|all on schema_object from user|role[cascade contraints];


4.3 查询权限信息

视图名称 说明
DBA_SYS_PRIVS 包含所有用户角色获得的系统权限信息
ALL_SYS_PRIVS 包含当前用户可见的全部用户角色获得的系统权限信息
USER_SYS_PRIVS 当前用户获得的系统权限信息
DBA_TAB_PRIVS 包含所有用户角色获得的对象权限信息
ALL_TAB_PRIVS 包含当前用户可见的全部用户角色获得的对象权限信息
USER_TAB_PRIVS 当前用户获得的对象权限信息
DBA_COL_PRIVS 包含数据库中所有列对象的权限信息
ALL_COL_PRIVS 包含当前用户可见的所有列对象的权限信息
USER_COL_PRIVS 当前用户拥有的或授予其它用户的所有列对象的权限信息
SESSION_PRIVS 当前会话可以使用的所有权限信息
例:

select * from dba_sys_privs where grantee='LENTIM';

select * from dba_tab_privs where grantee='LENTIM';


5.角色管理

假如我们直接给每一个用户赋予权限,这将是一个巨大又麻烦的工作,同时也不方便DBA进行管理。通过采用角色,使得:

  • 权限管理更方便。将角色赋予多个用户,实现不同用户相同的授权。如果要修改这些用户的权限,只需修改角色即可;
  • 角色的权限可以激活和关闭。使得DBA可以方便的选择是否赋予用户某个角色;
  • 提高性能,使用角色减少了数据字典中授权记录的数量,通过关闭角色使得在语句执行过程中减少了权限的确认。

〔数据库〕— 用户、权限、角色及profile概要文件管理 数据库

5.1 创建角色

create role role_name
[not identified|identified by [password] ##无需验证|密码验证
identified by exeternally ##外部验证
identified by globally] ##全局验证

例:

create role test_role not identified;

5.2 赋予角色权限

grant system_privilege | all privilege
to role
[with admin option]

例:

grant create session to test_role;

5.3 赋予用户角色

grant role_name to user;

5.4 控制角色是否有效

set role role_name;
set role all;
set role all except role;
set role none;

5.5 修改角色

alter role role_name ….

例:

alter role manager identified by manager;

5.6 删除角色

drop role rolename;

在Oracle中,包含角色的数据字典如下:
视图名称 说明
DBA_ROLE_PRIVS 包含数据库中所有用户拥有的角色信息
USER_ROLE_PRIVS 包含当前用户拥有的角色信息
ROLE_ROLE_PRIVS 角色拥有的角色信息
ROLE_SYS_PRIVS 角色拥有的系统权限信息
ROLE_TAB_PRIVS 角色拥有的对象权限信息
DBA_ROLES 当前数据库中所有角色及其描述信息
SESSION_ROLES 当前会话所具有的角色信息

ORACLE 19 连接pdb的两种方法

连接可插拔数据库的两种方法
<roidb01:cdb:/home/oracle>$sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Sat Jan 20 17:59:56 2018

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

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         4 PDB2                           READ WRITE NO
         5 PDB3                           READ WRITE NO
         6 PDB4                           READ WRITE NO
                 --方法1
SQL> alter session set container=pdb1;

Session altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB1                           READ WRITE NO
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
--方法二
<roidb01:cdb:/home/oracle>$sqlplus sys/oracle@roidb01:1521/pdb1 as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Sat Jan 20 18:02:02 2018

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

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB1                           READ WRITE NO

SQL> show user;
USER is "SYS"
SQL> 
2019-08-08 0 /
数据库
/
标签: 

评论回复


·