Oracle Database 12c Security - 4. Foundational Elements for a Secure Database

Access Control, Authorization, and Privilege

Access Control

指允许和禁止用户访问资源。通常与ACL结合。

Authorization

用户的安全策略与实际权限间的关联/映射。

Privilege

允许执行的操作。

Oracle数据库提供对象,系统权限,这是最主要的,还有一个intra-object权限。

系统权限是针对数据库的权限,可进一步细分为ANY 和 ADMINISTRATIVE。

ANY系统权限和特定的schema无关,可分为以下几类:

  • SELECT
  • DML
  • DDL
  • 系统控制,如alter system, alter database
  • 会话控制,alter session,set role
  • 事务控制,如commit, rollback

19c中的ANY系统权限为:

SQL> set pages 0
SELECT name
FROM system_privilege_map
WHERE name LIKE '%ANY%'
ORDER BY name;

ADMINISTER ANY SQL TUNING SET
ALTER ANY ANALYTIC VIEW
ALTER ANY ASSEMBLY
ALTER ANY ATTRIBUTE DIMENSION
ALTER ANY CLUSTER
ALTER ANY CUBE
ALTER ANY CUBE BUILD PROCESS
ALTER ANY CUBE DIMENSION
ALTER ANY DIMENSION
ALTER ANY EDITION
ALTER ANY EVALUATION CONTEXT
ALTER ANY HIERARCHY
ALTER ANY INDEX
ALTER ANY INDEXTYPE
ALTER ANY LIBRARY
ALTER ANY MATERIALIZED VIEW
ALTER ANY MEASURE FOLDER
ALTER ANY MINING MODEL
ALTER ANY OPERATOR
ALTER ANY OUTLINE
ALTER ANY PROCEDURE
ALTER ANY ROLE
ALTER ANY RULE
ALTER ANY RULE SET
ALTER ANY SEQUENCE
ALTER ANY SQL PROFILE
ALTER ANY SQL TRANSLATION PROFILE
ALTER ANY TABLE
ALTER ANY TRIGGER
ALTER ANY TYPE
ANALYZE ANY
ANALYZE ANY DICTIONARY
AUDIT ANY
BACKUP ANY TABLE
COMMENT ANY MINING MODEL
COMMENT ANY TABLE
CREATE ANY ANALYTIC VIEW
CREATE ANY ASSEMBLY
CREATE ANY ATTRIBUTE DIMENSION
CREATE ANY CLUSTER
CREATE ANY CONTEXT
CREATE ANY CREDENTIAL
CREATE ANY CUBE
CREATE ANY CUBE BUILD PROCESS
CREATE ANY CUBE DIMENSION
CREATE ANY DIMENSION
CREATE ANY DIRECTORY
CREATE ANY EDITION
CREATE ANY EVALUATION CONTEXT
CREATE ANY HIERARCHY
CREATE ANY INDEX
CREATE ANY INDEXTYPE
CREATE ANY JOB
CREATE ANY LIBRARY
CREATE ANY MATERIALIZED VIEW
CREATE ANY MEASURE FOLDER
CREATE ANY MINING MODEL
CREATE ANY OPERATOR
CREATE ANY OUTLINE
CREATE ANY PROCEDURE
CREATE ANY RULE
CREATE ANY RULE SET
CREATE ANY SEQUENCE
CREATE ANY SQL PROFILE
CREATE ANY SQL TRANSLATION PROFILE
CREATE ANY SYNONYM
CREATE ANY TABLE
CREATE ANY TRIGGER
CREATE ANY TYPE
CREATE ANY VIEW
DEBUG ANY PROCEDURE
DEBUG CONNECT ANY
DELETE ANY CUBE DIMENSION
DELETE ANY MEASURE FOLDER
DELETE ANY TABLE
DEQUEUE ANY QUEUE
DROP ANY ANALYTIC VIEW
DROP ANY ASSEMBLY
DROP ANY ATTRIBUTE DIMENSION
DROP ANY CLUSTER
DROP ANY CONTEXT
DROP ANY CUBE
DROP ANY CUBE BUILD PROCESS
DROP ANY CUBE DIMENSION
DROP ANY DIMENSION
DROP ANY DIRECTORY
DROP ANY EDITION
DROP ANY EVALUATION CONTEXT
DROP ANY HIERARCHY
DROP ANY INDEX
DROP ANY INDEXTYPE
DROP ANY LIBRARY
DROP ANY MATERIALIZED VIEW
DROP ANY MEASURE FOLDER
DROP ANY MINING MODEL
DROP ANY OPERATOR
DROP ANY OUTLINE
DROP ANY PROCEDURE
DROP ANY ROLE
DROP ANY RULE
DROP ANY RULE SET
DROP ANY SEQUENCE
DROP ANY SQL PROFILE
DROP ANY SQL TRANSLATION PROFILE
DROP ANY SYNONYM
DROP ANY TABLE
DROP ANY TRIGGER
DROP ANY TYPE
DROP ANY VIEW
ENQUEUE ANY QUEUE
EXECUTE ANY ASSEMBLY
EXECUTE ANY CLASS
EXECUTE ANY EVALUATION CONTEXT
EXECUTE ANY INDEXTYPE
EXECUTE ANY LIBRARY
EXECUTE ANY OPERATOR
EXECUTE ANY PROCEDURE
EXECUTE ANY PROGRAM
EXECUTE ANY RULE
EXECUTE ANY RULE SET
EXECUTE ANY TYPE
FLASHBACK ANY TABLE
FORCE ANY TRANSACTION
GRANT ANY OBJECT PRIVILEGE
GRANT ANY PRIVILEGE
GRANT ANY ROLE
INHERIT ANY PRIVILEGES
INHERIT ANY REMOTE PRIVILEGES
INSERT ANY CUBE DIMENSION
INSERT ANY MEASURE FOLDER
INSERT ANY TABLE
LOCK ANY TABLE
MANAGE ANY FILE GROUP
MANAGE ANY QUEUE
MERGE ANY VIEW
READ ANY ANALYTIC VIEW CACHE
READ ANY FILE GROUP
READ ANY TABLE
REDEFINE ANY TABLE
SELECT ANY CUBE
SELECT ANY CUBE BUILD PROCESS
SELECT ANY CUBE DIMENSION
SELECT ANY DICTIONARY
SELECT ANY MEASURE FOLDER
SELECT ANY MINING MODEL
SELECT ANY SEQUENCE
SELECT ANY TABLE
SELECT ANY TRANSACTION
TRANSLATE ANY SQL
UNDER ANY TABLE
UNDER ANY TYPE
UNDER ANY VIEW
UPDATE ANY CUBE
UPDATE ANY CUBE BUILD PROCESS
UPDATE ANY CUBE DIMENSION
UPDATE ANY TABLE
USE ANY JOB RESOURCE
USE ANY SQL TRANSLATION PROFILE
WRITE ANY ANALYTIC VIEW CACHE

159 rows selected.

查看哪些用户和角色赋予了SELECT ANY TABLE权限:

SELECT grantee
FROM dba_sys_privs
WHERE privilege = 'SELECT ANY TABLE'
ORDER BY grantee;

GRANTEE
--------------------------------------------------------------------------------
DATAPUMP_IMP_FULL_DATABASE
DBA
DV_REALM_OWNER
EXP_FULL_DATABASE
GGSYS
GSMADMIN_INTERNAL
IMP_FULL_DATABASE
OLAP_DBA
SYS
SYSTEM
WMSYS

11 rows selected.

查看当前用户的权限和角色:

SQL> 
SELECT *
FROM session_privs
ORDER BY privilege;

PRIVILEGE
----------------------------------------
ALTER SESSION
CREATE CLUSTER
CREATE DATABASE LINK
CREATE INDEXTYPE
CREATE OPERATOR
CREATE PROCEDURE
CREATE SEQUENCE
CREATE SESSION
CREATE SYNONYM
CREATE TABLE
CREATE TRIGGER
CREATE TYPE
CREATE VIEW
UNLIMITED TABLESPACE

14 rows selected.

SQL>
SELECT *
FROM session_roles
ORDER BY role ;

ROLE
--------------------------------------------------------------------------------
RESOURCE
SODA_APP

Object Privileges

对象权限针对schema中的对象,对象属主拥有对象的所有权限。

SQL> 
SELECT grantee ROLE, privilege,
table_schema||'.'||table_name OBJECT_NAME, type
FROM all_tab_privs
WHERE grantee IN (SELECT * FROM session_roles)
UNION
SELECT DECODE(grantee, UPPER(USER), 'DIRECT', grantee) ROLE, privilege,
table_schema||'.'||table_name OBJECT_NAME, TYPE
FROM all_tab_privs
WHERE grantee = UPPER(USER)
ORDER by role, privilege, object_name;

ROLE                 PRIVILEGE            OBJECT_NAME                                   TYPE
-------------------- -------------------- --------------------------------------------- --------------------
DIRECT               EXECUTE              SYS.DBMS_STATS                                PACKAGE
SODA_APP             EXECUTE              XDB.DBMS_SODA_ADMIN                           PACKAGE
SODA_APP             EXECUTE              XDB.DBMS_SODA_USER_ADMIN                      PACKAGE
SODA_APP             READ                 XDB.JSON$USER_COLLECTION_METADATA             VIEW

Column Privileges

可控制单独的列。例如:

grant update(salary) on employees to user01;

grant insert(col1, col2) on table02 to user02;

Synonyms

public synonym表示用户可以访问此synonym,但最终的对象仍需要赋权。

CREATE or replace PUBLIC SYNONYM sales_regions FOR sregions;

赋权给synonym等同于赋权给基础对象。删除同义词并不取消对基础对象的权限。

System and Object Privileges Together

收回对基础对象的授权并不影响系统权限,系统权限仍有效。

Privilege Conveyance and Retraction

如果赋权给用户时,指定了WITH GRANT OPTION选项,则此用户可以将此权限赋予其他人。

Roles

类似于OS中的group,用于批量赋权。

修改role的权限时,所以属于此role的用户自动得到新权限。

SQL> show parameter roles

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
os_roles                             boolean     FALSE
remote_os_roles                      boolean     FALSE

Role and Privilege Immediacy

Privilege是立即生效的,而role是连接时引入。换句话说,当赋予用户新role时,在下次登录时才生效。

Roles and Container Databases

和user一样,role也分为common和local两类。

Public and Default Database Roles

PUBLIC是role,但并不显示在SESSION_ROLES中。

Role Hierarchies

role可以嵌套,也即可以将role赋予role。当尽量少用,因带来复杂性,很难确定赋予了哪些权限。

Object Privileges Through Roles and PL/SQL

PL/SQL程序中不能使用通过role获取的权限,必须直接赋权。

Selective Privilege Enablement

role和Privilege的区别在于,role可以选择性的启用。

grant app_role to user01;
ALTER USER user01 DEFAULT ROLE ALL EXCEPT app_role; 
connect user01@service
select * from session_roles;
set role app_role;
select * from session_roles;

Selective Privilege Use Cases

  1. 仅通过应用访问时具有权限
  2. 根据应用和用户赋权,如web应用和报表应用
  3. 根据应用,用户,时间和地点

所有以上,都不是仅根据用户身份确定权限,都是根据上下文。这种需求可以用Selective Privilege实现,即有条件的启用或关闭权限(role)。

因此,role需要保护,而技术则是口令保护和Secure Application Role。

Password-Protected Roles

create role app_role identified by password;


set role app_role identified by password;

-- or 

dbms_session.set_role

口令保护的role不能 用于proxy authentication。不常用。

Secure Application Roles

实现了口令保护role的功能,但更强大。只能由PL/SQL程序激活:

create role ... identified using proc

这里的PL/SQL程序必须以invoker rights创建,另一个是definer rights。
所谓invoker rights,是指以调用者的权限执行过程中代码,而非过程定义者的权限。

Secure Application Role Example

创建scott用户,赋予app_role,可以查询表hr.region,但默认不开启此角色。

connect sys/Welcome1@orclpdb1 as sysdba
create role app_role identified using priv_mgr_proc;
grant create session to scott identified by Welcome1;
grant app_role to scott;
grant select on hr.regions to app_role;
grant connect, resource to scott;
ALTER USER scott DEFAULT ROLE CONNECT, RESOURCE;

SYS用户创建过程:

CREATE OR REPLACE PROCEDURE PRIV_MGR_PROC
    AUTHID CURRENT_USER
    AS
    BEGIN
      IF (SYS_CONTEXT ('CONNECTION', 'LOCAL_OR_REMOTE') = 'LOCAL') THEN
        DBMS_SESSION.SET_ROLE ('app_role');
      END IF;
    END;
/

GRANT EXECUTE ON priv_mgr_proc TO scott;

这里的CONNECTION namespace是应用自己设置的,你可以改为USERENV namespace中的其它属性。

SYS_CONTEXT的设置和读取参考这里

scott用户连接后,无法直接启用role,而必须通过过程启用,而过程又会检查其是否具备条件。简而言之,PL/SQL就是你的安全策略:

SQL> connect scott/Welcome1@orclpdb1
Connected.
SQL> select role from session_roles;

ROLE
--------------------------------------------------------------------------------
CONNECT
RESOURCE
SODA_APP

SQL> set role app_role;
set role app_role
*
ERROR at line 1:
ORA-28201: invalid command to enable secure application role 'APP_ROLE'

SQL> exec sys.priv_mgr_proc;

PL/SQL procedure successfully completed.

SQL> select role from session_roles;

ROLE
--------------------------------------------------------------------------------
CONNECT
RESOURCE
SODA_APP

这句说得好:

security model is only as good as the code that is written.

显然,过程是可以带参数的,但参数是可以伪造的,因此可考虑多用非参数,如时间,认证模式,环境变量等。

Global Roles and Enterprise Roles

Global Role和LDAP中的enterprise role对应。LDAP(Oracle EUS)可实现集中式的认证和授权。

Creating and Assigning Global and Enterprise Roles

global role在数据库中创建,但不能直接赋予用户和角色,而需要OEMCC和命令行实现:

SQL> CREATE ROLE app_a_global IDENTIFIED GLOBALLY;

Role created.

SQL> GRANT SELECT ON hr.regions TO app_a_global;

Grant succeeded.

SQL> GRANT app_a_global TO scott;
GRANT app_a_global TO scott
*
ERROR at line 1:
ORA-28021: cannot grant global roles


SQL> GRANT app_a_global TO DBA;
GRANT app_a_global TO DBA
*
ERROR at line 1:
ORA-28021: cannot grant global roles

Combining Standard and Global Roles

LDAP不知道数据库中授予global role的权限信息;数据库不知道end user的用户名。

需要几个步骤将这些信息关联起来:

  1. 确定哪些权限被赋予global role
  2. 确定LDAP中的enterprise role与global role的对应关系
  3. 确定哪些enterprise user关联到enterprise role

Oracle数据库提供ldapsearch可实现以上步骤。

Using Roles Wisely

Too Many Roles

不要将role赋予role,否则很难跟踪。

role是消耗内存的。

Naming

role的名称是全局的,因此也不能和用户名重。

role的名称要有意义,顺便也可以保持全局唯一性,如APP_X_DEVELOPER 和 APP_Y_ADMINISTRATOR。

Dependencies

role是SYS用户拥有的schema对象,因此删除用户,并不会删除role; role是存放在数据字典中的,而非用户的schema。

删除role只能通过drop role。

Summary

本章主要介绍role,Oracle中的role分为standard role, password enabled role, secure application role, global role。

role的好处在于简单,节省管理开销;以及可实现选择性权限启用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值