首页 > 数据库 > 数据库开发技术 > 使用产品配置文件保护 SQL*Plus
使用产品配置文件保护 SQL*Plus
[@more@]背景使用 SQL*Plus 时,您可能注意到,您可以发出 host 命令转到 *nix 提示符,或发出 run 命令执行某个脚本。一个很少使用但却有可能造成致命破坏的攻击便源自此功能。 您可能编写了某个从 shell 中调用的 SQL*Plus 脚本,如下所示:
sqlplus someuser/somepass@remotedb @myscript.sql
此处的 myscript.sql 是一个先执行然后退出的 SQL*Plus 脚本文件。在该文件执行过程中,用户可以按 Control-C(或特定 OS 的 break 键序列)中断程序流。 这种情况下,用户将获得 SQL*Plus 提示符(以 someuser 的身份连接)。 在此阶段,用户几乎可以执行从 SQL*Plus 提示符中所能执行的所有操作,并因此而造成某种程度的破坏。
这是一个应立即修复的安全漏洞。
策略修复方法很简单: 您所要做的就是在运行命令之前,将这些命令限制到一个由 SQL*Plus 引用的“特殊位置”。 此特殊位置是 SYSTEM 模式中一个名为 SQLPLUS_PRODUCT_PROFILE 的表。 如果该表不存在,则您在每次启动 SQL*Plus 时将获得一个类似“Product User Profile Not Loaded”这样的警告。
SQL> select * from system.SQLPLUS_PRODUCT_PROFILE
2 /
no rows selected
SQL> insert into system.SQLPLUS_PRODUCT_PROFILE
2 values ('SQL*Plus','%','HOST',null,null,'DISABLED',null,null)
3 /
1 row created.
SQL> commit;
Commit complete.
现在,当您启动 SQL*Plus 并输入 host 命令(或它的等价形式“!”)时,您将收到以下错误:
SQL> host;
SP2-0544: Command "host" disabled in Product User Profile
如果要对某个用户禁用此功能,只需使用要限制的用户名替换上面的 insert 命令中的“%”(表示所有用户)。 例如,如果只希望对用户 SCOTT 禁用此功能,请使用以下语句:
SQL> insert into system.SQLPLUS_PRODUCT_PROFILE
2 values ('SQL*Plus','SCOTT','HOST',null,null,'DISABLED',null,null)
3 /
还可以在用户名中使用通配府 - 例如,使用 APP% 表示所有以 APP 开头的用户(APPUSER1、APPUSER2)。
该方法也适用于其他命令(及其缩写或简写形式):
accept edit repheader
append execute run
archive log exit save
attribute quit set
break get show
btitle help shutdown
change host spool
clear input start
column list startup
compute password store
connect pause timing
copy print ttitle
define prompt undefine
del recover variable
describe remark whenever oserror
disconnect repfooter whenever sqlerror
除了 SQL*Plus 以外,该方法还适用于 SQL 命令。 例如,如果要禁用 lock 命令,则需要插入:
insert into system.SQLPLUS_PRODUCT_PROFILE
values ('SQL*Plus','%','LOCK',null,null,'DISABLED',null,null)
/
注意,SQL 命令 lock 已被禁用,此外我们还在上面使用了“SQL*Plus”关键字。
可以禁用的 SQL 命令如下:
alter drop revoke
analyze explain rollback
associate flashback savepoint
audit grant select
call insert set constraints
comment lock set role
commit merge set transaction
create noaudit truncate
delete purge update
disassociate rename validate
可能的影响开始前,请注意一个重要问题: 该方法适用于在服务器本身中运行的 SQL*Plus, 而不会影响在其他位置运行(如在客户端中运行)的 SQL*Plus。
该操作需要仔细的规划。如果 shell 脚本依赖于 SQL*Plus 中的 host 命令,则禁用它们将会明显停止这些作业。 一个非常典型的例子就是旧式的 host backup 命令。 一个典型的 SQL 脚本可能如下所示:
alter tablespace xyz begin backup;
host cp /fs1/xyz.dbf /backup/xyz.dbf
alter tablespace xyz end backup;
等等(适用于所有表空间)。该脚本将注定失败 - 除非以 SYS 用户的身份运行它,这时命令禁用将不起作用。
操作计划当所有这些命令使用的可能性最小时,从 SQL*Plus 中禁用它们。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/178357/viewspace-910001/ ,如需转载,请注明出处,否则将追究法律责任。