Oracle PUP(PRODUCT_USER_PROFILE)配置和使用

最近在翻Oracle SQLPLUS官方文档,在讲SQLPLUS Security章节介绍了PUP这个机制。借此,我来使用以下:
 
PUP(PRODUCT_USER_PROFILE)介绍
  PRODUCT_USER_PROFILE是SYSTEM账户下一个表,可提供用户级别的安全限制。
  PUP设置对DBA权限用户无效。
  PUP只针对本地数据库生效(Local Database)。
 
1、SYSTEM 用户创建PUP:
 SQLPLUS SYSTEM
 
@ D:\app\Administrator\product\11.2.0\dbhome_1\sqlplus\admin\pupbld.sql
 
脚本内容:

DROP SYNONYM PRODUCT_USER_PROFILE;

CREATE TABLE SQLPLUS_PRODUCT_PROFILE AS
  SELECT PRODUCT, USERID, ATTRIBUTE, SCOPE, NUMERIC_VALUE, CHAR_VALUE,
  DATE_VALUE FROM PRODUCT_USER_PROFILE;

DROP TABLE PRODUCT_USER_PROFILE;
ALTER TABLE SQLPLUS_PRODUCT_PROFILE ADD (LONG_VALUE LONG);

-- Create SQLPLUS_PRODUCT_PROFILE from scratch

CREATE TABLE SQLPLUS_PRODUCT_PROFILE
(
  PRODUCT        VARCHAR2 (30) NOT NULL,
  USERID        VARCHAR2 (30),
  ATTRIBUTE      VARCHAR2 (240),
  SCOPE          VARCHAR2 (240),
  NUMERIC_VALUE  DECIMAL (15,2),
  CHAR_VALUE    VARCHAR2 (240),
  DATE_VALUE    DATE,
  LONG_VALUE    LONG
);

-- Remove SQL*Plus V3 name for sqlplus_product_profile

DROP TABLE PRODUCT_PROFILE;

-- Create the view PRODUCT_PRIVS and grant access to that

DROP VIEW PRODUCT_PRIVS;
CREATE VIEW PRODUCT_PRIVS AS
  SELECT PRODUCT, USERID, ATTRIBUTE, SCOPE,
        NUMERIC_VALUE, CHAR_VALUE, DATE_VALUE, LONG_VALUE
  FROM SQLPLUS_PRODUCT_PROFILE
  WHERE USERID = 'PUBLIC' OR USER LIKE USERID;

GRANT SELECT ON PRODUCT_PRIVS TO PUBLIC;
DROP PUBLIC SYNONYM PRODUCT_PROFILE;
CREATE PUBLIC SYNONYM PRODUCT_PROFILE FOR SYSTEM.PRODUCT_PRIVS;
DROP SYNONYM PRODUCT_USER_PROFILE;
CREATE SYNONYM PRODUCT_USER_PROFILE FOR SYSTEM.SQLPLUS_PRODUCT_PROFILE;
DROP PUBLIC SYNONYM PRODUCT_USER_PROFILE;
CREATE PUBLIC SYNONYM PRODUCT_USER_PROFILE FOR SYSTEM.PRODUCT_PRIVS;

--禁用HR用户的DROP命令
 SYSTEM@orcl> insert into product_user_profile values('SQL*Plus', 'HR', 'DROP', NULL, NULL, 'DISABLED', NULL, NULL);
 

已创建 1 行。
 

SYSTEM@orcl> commit;
 

提交完成。
 

2、PUP表结构概览
 SYSTEM@orcl> desc product_user_profile
  名称                                    是否为空? 类型
  ---------------------------------------- -------- ---------------------------
  PRODUCT                                  NOT NULL VARCHAR2(30)
  USERID                                            VARCHAR2(30)
  ATTRIBUTE                                        VARCHAR2(240)
  SCOPE                                            VARCHAR2(240)
  NUMERIC_VALUE                                    NUMBER(15,2)
  CHAR_VALUE                                        VARCHAR2(240)
  DATE_VALUE                                        DATE
  LONG_VALUE                                        LONG
 

 --PRODUCT : 说明要限制的程序
  --USERID : 要限制的用户(大写)
  --ATTRIBUTE : 要限制的命令或角色
  --SCOPE : 不适用;放NULL
  --NUMERIC_VALUE : 不适用;放NULL
  --CHAR_VALUE :DISABLED
  --DATE_VALUE :不适用;放NULL
  --LONG_VALUE :不适用;放NULL
 
 

3、HR登录进行DROP操作证明设置生效:
 SYSTEM@orcl> conn hr/hr
 已连接。
 

HR@orcl> create table t(x int);
 

表已创建。
 

HR@orcl> drop table t;
 SP2-0544: 在产品用户概要文件中禁用命令 "drop"
 HR@orcl> conn system/oracle@orcl
 已连接。
 

SYSTEM@orcl> delete from product_user_profile;
 

已删除 1 行。
 

SYSTEM@orcl> commit;
 

提交完成。
 

SYSTEM@orcl> conn hr/hr@orcl
 已连接。
 

HR@orcl> drop table t;
 

表已删除。
 

 

4、禁用角色
 PRODUCT USERID ATTRIBUTE SCOPE NUMERIC_VALUE CHAR_VALUE DATE_VALUE LONG_VALUE
 ------- ------ --------- ----- -------- ------ ----- -----
 SQL*Plus HR    ROLES                          ROLE1
 SQL*Plus PUBLIC ROLES                          ROLE2
 

用户登录期间PUP行记录将翻译为以下命令
 During login, these table rows are translated into the command
 SET ROLE ALL EXCEPT ROLE1, ROLE2
 

例子:
 SYS@orcl> create role r_t;
 角色已创建。
 SYS@orcl> grant select on t to r_t;
 授权成功。
 SYS@orcl> grant r_t to hr;
 授权成功。
 SYS@orcl> conn hr/hr
 已连接。
 HR@orcl> select * from sys.t;
 

未选定行
 HR@orcl> conn system/oracle
 已连接。
 

会话已更改。
 

SYSTEM@orcl> insert into product_user_profile values('SQL*Plus', 'HR', 'ROLES', NULL, NULL, 'r_t', NULL, NULL);
 

已创建 1 行。
 

SYSTEM@orcl> commit;
 

提交完成。
 

SYSTEM@orcl> conn hr/hr
 已连接。
 HR@orcl> select * from sys.t;
 select * from sys.t
                  *
 第 1 行出现错误:
 ORA-00942: 表或视图不存在
 

HR@orcl> select username, granted_role
  2      from user_role_privs
  3    where granted_role='R_T';
 

USERNAME                      GRANTED_ROLE
 ------------------------------ ------------------------------
 HR                            R_T
 

HR@orcl> conn system/oracle
 已连接。
 

会话已更改。
 

SYSTEM@orcl> delete from product_user_profile;
 

已删除 1 行。
 SYSTEM@orcl> commit;
 

提交完成。
 SYSTEM@orcl> conn hr/hr
 已连接。
 

会话已更改。
 

HR@orcl> select * from sys.t;
 

未选定行

相关推荐