SQL*Plus Security
限制哪些用户在SQL*Plus里能够执行哪些命令以及不能执行哪些命令
oracle是用system用户下的PRODUCT_USER_PROFILE (PUP)表来进行的限制。提供了产品级别的安全,用户级安全(SQL GRANT和REVOKE命令和用户角色)相互补充。
select * from product_user_profile;
如果这张表不存在可以使用 @?/sqlplus/admin/pupbld
表结构如下:
SQL> desc product_user_profile
Name Type
——————— —————
PRODUCT VARCHAR2(30) –必须包含产品的名称(SQL * Plus)。不能输入通配符或NULL
USERID VARCHAR2(30) –必须包含用户的用户名(大写)来说,你想禁用命令。为多个用户禁用命令,使用SQL通配符(%)或多个条目 HR,HR1 HR% %
ATTRIBUTE VARCHAR2(240) –必须包含的名称(大写)SQL、SQL * Plus或者PL / SQL命令禁用(例如,RUN) 如果你禁用一个角色,他可以是这个角色的字符串
SCOPE VARCHAR2(240) –空就好了
NUMERIC_VALUE NUMBER(15,2) –空就好了
CHAR_VALUE VARCHAR2(240) –禁用一个SQL、SQL * Plus,或PL / SQL命令是”DISABLED” 如果你禁用一个角色,它必须包含角色的名字 不可以使用通配符(%)
DATE_VALUE DATE –空就好了
LONG_VALUE LONG –空就好了
SQL*Plus HR HOST DISABLED
SQL*Plus % INSERT DISABLED
SQL*Plus % UPDATE DISABLED
SQL*Plus % DELETE DISABLED
insert into product_user_profile(PRODUCT,USERID,ATTRIBUTE,CHAR_VALUE )values(‘SQL*Plus’,’HR’,’HOST’,’DISABLED’);
insert into product_user_profile(PRODUCT,USERID,ATTRIBUTE,CHAR_VALUE )values(‘SQL*Plus’,’%’,’INSERT’,’DISABLED’);
insert into product_user_profile(PRODUCT,USERID,ATTRIBUTE,CHAR_VALUE )values(‘SQL*Plus’,’%’,’UPDATE’,’DISABLED’);
insert into product_user_profile(PRODUCT,USERID,ATTRIBUTE,CHAR_VALUE )values(‘SQL*Plus’,’%’,’DELETE’,’DISABLED’);
COMMIT;
–Disabling HOST disables the operating system alias for HOST, such as $ on Windows, and ! on UNIX
–不推荐禁用退出/退出。如果禁用,终止命令行会话通过发送一个EOF字符如Ctrl + D在UNIX或Ctrl + Z在Windows。终止一个Windows的GUI和文件>退出会话。否则,终止会话终止的SQL * Plus流程。
–如果禁用,使用退出/退出终止当前运行的脚本iSQL *加上也禁用。如果禁用,退出操作只要OSERROR每当SQLERROR也禁用。
–当禁用了help的时候同时也禁用了?
–禁用SQL * Plus set 命令也禁用SET CONSTRAINTS, SET ROLE and SET TRANSACTION
–禁用SQL * Plus start也禁用@ / @@
–禁用BEGIN 和 DECLARE 并不妨碍使用SQL * Plus EXECUTE 去 运行PL / SQL。EXECUTE必须单独禁用
SQL*PLUS 可以限制的命令有:
ACCEPT ,DEFINE ,PASSWORD ,SHUTDOWN ,APPEND
DEL ,PAUSE ,SPOOL ,ARCHIVE LOG ,DESCRIBE
PRINT ,START (@, @@)
ATTRIBUTE ,DISCONNECT ,PROMPT ,STARTUP
BREAK ,EDIT ,RECOVER ,STORE
BTITLE ,EXECUTE ,REMARK ,TIMING
CHANGE ,EXIT/QUIT ,REPFOOTER ,TTITLE
CLEAR ,GET ,REPHEADER ,UNDEFINE
COLUM ,NHELP (?) ,RUN ,VARIABLE
COMPUTE ,HOST
SAVE ,WHENEVER OSERROR
CONNECT ,INPUT ,SET ,WHENEVER SQLERROR
COPY ,LIST (;) ,SHOW ,XQUERY
SQL命令可以限制的有:
ALTER ,DELETE , MERGE , SET CONSTRAINTS
ANALYZE ,DISASSOCIATE, NOAUDIT , SET ROLE
ASSOCIATE,DROP , PURGE , SET TRANSACTION
AUDIT ,EXPLAIN , RENAME , TRUNCATE
CALL ,FLASHBACK , REVOKE , UPDATE
COMMENT ,GRANT , ROLLBACK, VALIDATE
COMMIT ,INSERT , SAVEPOINT, CREATE,LOCK, SELECT
pl/sql可以限制的有
BEGIN DECLARE
我们做个例子:
1.登录到system
conn system/oracle
2.添加禁用
INSERT INTO PRODUCT_USER_PROFILE
VALUES (‘SQL*Plus’, ‘HR’, ‘SELECT’, NULL, NULL, ‘DISABLED’, NULL, NULL);
3.登录到hr并查询
SQL> conn hr/hr
Connected.
SQL> select * from dual;
SP2-0544: Command “select” disabled in Product User Profile
SQL> ho ls
SP2-0544: Command “host” disabled in Product User Profile
4.在SYSTEM里去掉刚刚的限制
DELETE FROM PRODUCT_USER_PROFILE WHERE USERID = ‘HR’;
但是在3的时候我们如果用PL/SQL DEVELOPER或者其它的IDE工具是没有任何问题的
当然 PUP也可以在角色上进行限制:
可以使用SQL命令来创建和控制角色为你提供安全访问数据库表。通过创建一个角色,然后控制谁有权访问它,确保只有特定的用户可以访问特定的数据库特权
创建两个role
–一个不带密码
create role ROLE1;
–一个带密码
create role role2 identified by oracle;
grant create session,create table,create view to ROLE1;
grant create session,create table,create view,create procedure to role2;
create user ucjmh identified by ucjmh;
grant ROLE1,ROLE2 to ucjmh;
–修改ucjmh用户的缺省角色,只让role1在登陆的时候生效
alter user ucjmh default role role1;
select * from product_user_profile
然后insert
insert into product_user_profile(PRODUCT,USERID,ATTRIBUTE,CHAR_VALUE )values(‘SQL*Plus’,’%’,’ROLES’,’ROLE1′);
这个时候登录:
SP2-0557: Error in disabling roles in product user profile.
Connected.
这个时候 我们再insert role2
insert into product_user_profile(PRODUCT,USERID,ATTRIBUTE,CHAR_VALUE )values(‘SQL*Plus’,’UCJMH’,’ROLES’,’ROLE2′);
SQL> conn ucjmh/ucjmh
Connected.
SQL> select * from session_roles;
no rows selected
然后可以看出来其实在登录的时候oracle内部做了:
SET ROLE ALL EXCEPT ROLE1, ROLE2;