Oracle

Oracle 12c:密碼文件問題

  • December 2, 2017

對於我的一項任務,我一直在嘗試展示密碼文件功能。但是,我遇到了一些意想不到的行為。我試過四處尋找答案,但找不到任何相關的答案;此外,在某些情況下,行為與文件中指定的不同。

我正在使用 12c 並確保該remote_login_passwordfile參數設置為 EXCLUSIVE。

我確定我可能只是缺少一些基礎知識,因為行為是一致的;我遇到的問題如下:

  1. 刪除密碼文件本身(不替換它)然後進行後續查找v$pwfile_users會從 CBD 中刪除所有具有 sys 權限的使用者,但我的 PDB 中的使用者仍保留在查找中。PDB 密碼是否儲存在該文件以外的其他位置?如果文件不再存在,它們將如何顯示?
  2. 新文件的IGNORECASE選項似乎只影響普通使用者而不是 PDB 使用者;如果沒有正確的大小寫,新分配的 CDB 無法登錄,但 PDB 使用者可以,這再次讓我想知道一些單獨的密碼儲存。
  3. 在 CDB 和 PDB 中,該ENTRIES選項似乎沒有效果 - 儘管將其設置為 2,但我可以在兩個容器中不斷添加超過 2 個使用者。
  4. 我想通過使用我的一個新特權帳戶執行某種 sysoper 操作來證明密碼文件實際上是有效的,例如關閉數據庫。我可以在 PDB 中執行此操作,但它不允許我在 CDB 中執行此操作,儘管文件明確指出 sysoper 使用者具有該權限。我是否遺漏了其他一些允許這種情況發生的資訊?我得到的錯誤是insufficient privileges(是的,我確保使用 連接as sysoper)。

任何見解都非常感謝 - 謝謝!

  1. 刪除密碼文件本身(不替換它)然後對 v$pwfile_users 進行後續查找會從 CBD 中刪除所有 sys 特權使用者,但我的 PDB 中的使用者仍保留在查找中。PDB 密碼是否儲存在該文件以外的其他位置?如果文件不再存在,它們將如何顯示?

PDB使用者(本地使用者)以及具有管理權限的普通使用者的密碼以加密形式儲存在數據字典中。

SQL> select password from sys.user$ where name='JAY';

PASSWORD
--------------------------------------------------------------------------------
4FF80DF8D8DBE02E


SQL> select username, common from dba_users where username='JAY';

USERNAME      COM
---------     ---
JAY           NO

如果沒有密碼文件退出普通使用者是無法獲得sysdba權限的。

SQL> create user testuser identified by testuser container=all;

User created.

SQL> grant sysdba to testuser;
grant sysdba to testuser
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled

無法將普通使用者添加到密碼文件,因為我在創建此使用者之前已刪除密碼文件。

但是可以分配SYSDBA給本地使用者!

SQL> alter session set container=orapdb1;

Session altered.

SQL> create user newuser identified by newuser container=current;

User created.

SQL> grant sysdba to newuser;

Grant succeeded.

它確認 PDB 管理使用者的密碼儲存在數據字典而不是密碼文件中。

  1. 新文件的 IGNORECASE 選項似乎只對普通使用者而不是 PDB 使用者有影響;如果沒有正確的大小寫,新分配的 CDB 無法登錄,但 PDB 使用者可以,這再次讓我想知道一些單獨的密碼儲存。

這裡同樣適用。由於 PDB 管理特權使用者(本地使用者)未儲存在密碼文件中IGNORECASEENTRIES因此不適用於他們。

  1. 在 CDB 和 PDB 中,ENTRIES 選項似乎都沒有效果 - 儘管將其設置為 2,但我可以在兩個容器中不斷添加超過 2 個使用者。

根據 Oracle 文件,它允許我們儲存特權使用者的密碼,直到作業系統塊被填滿(通常每個塊最多 4 個密碼)。在摘自 Oracle 文件之後,我已經展示了這種行為。

參賽作品

此參數指定您要求密碼文件接受的條目數。此數字對應於允許以 SYSDBA 或 SYSOPER 連接到數據庫的不同使用者的數量。實際允許的條目數可能高於使用者數,因為 ORAPWD 實用程序會繼續分配密碼條目,直到作業系統塊被填滿。例如,如果您的作業系統塊大小為 512 字節,則它包含四個密碼條目。分配的密碼條目數始終是四的倍數。

我已將密碼創建為:

[oracle@ora12c dbs]$ orapwd file=orapworacdb entries=2

Enter password for SYS: 

然後我創建了四個測試使用者並嘗試授予SYSDBA權限,但授予第四個使用者失敗。因為已經有四個具有SYSDBA權限的使用者,包括SYS.

SQL> select * from v$pwfile_users;

USERNAME               SYSDB SYSOP SYSAS SYSBA SYSDG SYSKM     CON_ID
------------------------------ ----- ----- ----- ----- ----- ----- ----------
SYS                TRUE  TRUE  FALSE FALSE FALSE FALSE      0
C##_ABC                TRUE  FALSE FALSE FALSE FALSE FALSE      0
C##_ABC2               TRUE  FALSE FALSE FALSE FALSE FALSE      0
C##_ABC3               TRUE  FALSE FALSE FALSE FALSE FALSE      0

當我嘗試授予SYSDBA第四個使用者時C##_ABC4,出現以下錯誤。

SQL> grant sysdba to c##_abc4 container=all;
grant sysdba to c##_abc4 container=all
*
ERROR at line 1:
ORA-01996: GRANT failed: password file
'/u01/app/oracle/product/12.1.0/db_1/dbs/orapworacdb' is full
  1. 我想通過使用我的一個新特權帳戶執行某種 sysoper 操作來證明密碼文件實際上是有效的,例如關閉數據庫。我可以在 PDB 中執行此操作,但它不允許我在 CDB 中執行此操作,儘管文件明確指出 sysoper 使用者具有該權限。我是否遺漏了其他一些允許這種情況發生的資訊?我得到的錯誤是權限不足(是的,我確保使用作為 sysoper 進行連接)。

這取決於您如何授予該SYSOPER角色。要關閉數據庫實例,使用者應該擁有SYSOPER所有容器的權限。

下面展示該場景。

我有普通使用者通話C##_TEST

[oracle@ora12c dbs]$ sqlplus sys@oracdb as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 2 08:47:05 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Enter password: 

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options


SQL> select common from dba_users where username='C##_TEST';

COM
---
YES

我只授予SYSOPER使用者ORACDB(CDB)。

SQL> grant sysoper to c##_test container=current;

Grant succeeded.

然後我使用C##_TEST使用者 as連接到容器數據庫SYSOPER並嘗試關閉數據庫並收到ORA-01031錯誤。

[oracle@ora12c dbs]$ sqlplus c##_test/test@oracdb as sysoper

SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 2 08:49:05 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> shut immediate;
ORA-01031: insufficient privileges
SQL> 

現在我再次SYSOPER通過選項授予特權container=all。而這個時候使用者可以關閉數據庫。

[oracle@ora12c dbs]$ sqlplus sys@oracdb as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 2 08:49:36 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Enter password: 

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> grant sysoper to c##_test container=all;

Grant succeeded.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

[oracle@ora12c dbs]$ sqlplus c##_test/test@oracdb as sysoper

SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 2 08:50:06 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

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