Oracle PUP(PRODUCT_USER_PROFILE)配置和使用

时间:2022-12-28 09:06:20

近期在翻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;





未选定行













------------------------‘

Dylan    Presents.