Oracle如何授予“创建任何目录”权限,并限制所有目录必须在给定目录内创建?

Oracle如何授予“创建任何目录”权限,并限制所有目录必须在给定目录内创建?,oracle,oracle11g,oracle12c,Oracle,Oracle11g,Oracle12c,我想向用户授予创建任何目录权限,但有以下限制:此用户创建的所有目录都必须位于/foo/bar之内,任何尝试在此之外创建目录的操作都会失败,并出现权限错误。如何在Oracle 11G或12C上执行此操作?您可以在触发器中包含此限制。系统事件和属性列表 这取决于,如果要限制Oracle可以通过utl_文件命令访问哪些操作系统目录,可以设置utl_文件\u dir参数。不幸的是,此参数是系统范围的,因此您将无法使用此参数为特定用户授予/撤销权限。还请记住,如果对此参数进行更改,则在Oracle数据库重

我想向用户授予
创建任何目录
权限,但有以下限制:此用户创建的所有目录都必须位于
/foo/bar
之内,任何尝试在此之外创建目录的操作都会失败,并出现权限错误。如何在Oracle 11G或12C上执行此操作?

您可以在触发器中包含此限制。系统事件和属性列表


这取决于,如果要限制Oracle可以通过utl_文件命令访问哪些操作系统目录,可以设置
utl_文件\u dir
参数。不幸的是,此参数是系统范围的,因此您将无法使用此参数为特定用户授予/撤销权限。还请记住,如果对此参数进行更改,则在Oracle数据库重新启动之前,这些更改不会生效:

alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;
有关utl文件目录的更多信息,请参阅

这就是说,如果您真的想将能够创建Oracle目录的人限制在特定的OS目录中,那么一个过程将适合该任务,因为这将允许您拥有更细粒度的控制(并将拥有非常强大的
创建任何目录
权限的人限制在该过程的所有者手中):

sqlplus-kjohnston
创建或替换过程mydircreate(p_dir varchar2)
作为
海关特例;
PRAGMA EXCEPTION_INIT(ex_custom,-20001);
开始
如果较低(p_dir)不象“/foo/bar/%”,那么
引发应用程序错误(-20001,“未授权”);
如果结束;
立即执行“创建或替换目录mydir为“””| | p| u dir | |“”;
结束mydircreate;
创建用户testuser,用户标识为;
将创建会话授予testuser;
将kjohnston.mydircreate上的execute授予testuser;
出口
sqlplus测试用户
SQL>execkjohnston.mydircreate('mydir','/randomdir');
ORA-20001:未授权
SQL>execkjohnston.mydircreate('mydir','/foo/bar/baz');
PL/SQL过程已成功完成。

需要通过安装Oracle的操作系统来实施此限制。目录对象是一个逻辑结构。用户可以在创建对象时提供一个绝对任意的字符串文本作为目录路径-没有验证。如果您坚持通过Oracle强制执行此限制,那么系统级触发器是您唯一的选择。但是,您不需要忘记它的存在,并在每次目录更改时重新编译它,或者在不再需要它时删除/禁用它。@NicholasKrasnov当具有
创建任何目录
权限的架构执行
创建目录
时,哪个操作系统用户获得目录的所有权?我目前正在Windows上开发,没有linux可供测试,但我假设操作系统用户就是Oracle实例运行的用户。如果这是真的,那么将此权限授予架构不是一个安全问题,因为它们能够读取/写入Oracle用户有权访问的任何目录?创建目录创建Oracle目录,而不是OS目录。澄清:从dba_目录中选择*;您可以创建所需的任何oracle目录。。。它可能会也可能不会实际引用OS目录(因为在创建oracle目录对象时不会检查OS目录是否存在,而是在实际使用目录对象时检查OS目录是否存在:例如,从utl_文件命令)。是的,oracle实例运行的是OS用户。是的,这是一个潜在的风险。这就是为什么不应授予
创建任何目录
读/写/执行
权限的原因。只有
SYSDBA
DBA
用户在完成任务所需的一段时间内才应该拥有它们。在12c中有一个名为
PDB_OS_CREDENTIAL
(我个人还没有测试过)的参数,它允许为PDB使用不同的操作系统用户。唯一的选择是创建一个执行此操作的过程(包括路径检查),然后授予用户执行此过程的权限。
alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;
sqlplus kjohnston

create or replace procedure mydircreate (p_dir varchar2)
as
  ex_custom EXCEPTION;
  PRAGMA EXCEPTION_INIT( ex_custom, -20001 );
begin
  if lower(p_dir) not like '/foo/bar/%' then
    raise_application_error( -20001, 'Not authorized' );
  end if;

  execute immediate 'create or replace directory mydir as ''' || p_dir || '''';
end mydircreate;

create user testuser identified by <password>;
grant create session to testuser;
grant execute on kjohnston.mydircreate to testuser;

exit;

sqlplus testuser

SQL> exec kjohnston.mydircreate('mydir', '/randomdir');
ORA-20001: Not authorized

SQL> exec kjohnston.mydircreate('mydir', '/foo/bar/baz');
PL/SQL procedure successfully completed.