說說密碼檔案Passwordfile(二)

realkid4發表於2011-01-24

首先,要說明的問題是,密碼檔案是駐留在資料庫伺服器上的一個檔案。如果資料庫是使用OUI安裝的,密碼檔案是預設生成的。其中維護的具有SYSDBA管理許可權的使用者資訊,也是隨著系統執行自動維護的。

 

一般來說,是不需要我們直接進行密碼檔案的管理工作。但是有時候,當發生密碼檔案被破壞的時候,常常需要手工的重建密碼檔案。

 

“使用管理員帳號不能登陸”

 

有時候我們會發生這樣的事情(在網上也經常看到這樣的詢問貼),需要啟動資料庫,但是輸入了正確的使用者名稱和密碼不能登陸。這種問題的解決也比較通用。

 

1、  確認密碼檔案起效情況。密碼檔案就是一個物理檔案,儲存著可以在例項關閉時登入使用者的帳號密碼資訊。但是是否使用密碼檔案就是需要系統引數來控制了。這個引數就是remote_login_passwordfile,其各種取值已經在前面講述過了,這裡就不累述。一般我們就確認為Exclusive或者NONE。如果不想使用密碼檔案,就是用NONE值。如果使用密碼檔案,就設定為Exclusive值。不使用密碼檔案,就只能使用作業系統層面驗證,一般認為這樣安全問題更大。所以,通常我們的設定都是exclusive

2、  判斷密碼檔案情況。可以透過檢視v$pwfile_users來檢查使用者列表。如果檢查不到或者資訊有問題,就需要手工重新建立密碼檔案了。

 

建立密碼檔案

 

使用orapwd命令建立密碼檔案,具體語法格式和引數為:

 

ORAPWD file=[filename] password=[password] [entries=numberuser] [force=y/n] [ignorecase=y/n]

 

其中:

ü         file表示生成檔案的路徑和名稱(本引數是必須錄入專案);

ü         password表示sys使用者的密碼(必須錄入專案),用來驗證生成操作是否合法;

ü         entries表示檔案中允許容納使用者的最大數量。密碼檔案是容納具有sysdbasysoper等管理的使用者資訊,預設情況下是由sys在其中。實際生產環境下,是不可能使用sys如此許可權的使用者進行日常管理的。必然有一些自定義的資料庫管理員和操作員,具有sysdbasysoper許可權。這些資訊都要存放在密碼檔案中。Entries引數專案就是定義這個檔案最大可以容納的使用者資訊數量。Oracle官方文件中,建議設定這個值為一個高於實際需要的值,供日後擴充時使用;

ü         force:是否覆蓋已存在的密碼檔案。如果設定為Y,表示如果現在存在有密碼檔案,就覆蓋掉。預設值為N

ü         ignorecase:忽視大小寫。是儲存密碼的一種策略。如果設定為Y,表示忽視大小寫。注意:在早期的Oracle版本中(包括10g,使用者密碼是不區分大小寫的,輸入之後,Oracle在內部全部按照大寫處理。而這個不合時宜的特性在Oracle11g中進行了修正,預設情況下,已經支援大小寫使用者密碼。

 

下面是一個例項:

//下面是在windows cmd命令視窗中

D:\oracle\database>orapwd file=PWDorcl.ora password=syspassword entries=5 force=y

 

D:\oracle\database>

 

 

透過上面的分析,我們已經瞭解密碼檔案就是管理員sysdba和操作員sysoper使用者資訊在資料庫外的一個備份。這樣,一個新的問題出現了,賬戶資訊在密碼檔案上的更新和同步是一個什麼過程呢?

 

這裡面,sys賬戶和非sys帳號有所區別。

 

首先,我們賦給scott許可權sysdba

 

SQL> select * from v$pwfile_users;

 

USERNAME                       SYSDB SYSOP

------------------------------ ----- -----

SYS                            TRUE  TRUE

//授權

SQL> grant sysdba to scott;

 

授權成功。

 

SQL> select * from v$pwfile_users;

 

USERNAME                       SYSDB SYSOP

------------------------------ ----- -----

SYS                            TRUE  TRUE

SCOTT                          TRUE  FALSE

 

Scott也可以使用密碼檔案進行登入了。下面,我嘗試修改兩個使用者的密碼。

 

SQL> -- Modify the user

SQL> alter user SCOTT

  2    identified by tiger1;

 

User altered

 

SQL>

SQL> -- Modify the user

SQL> alter user SYS

  2    identified by sys;

 

User altered

 

停止例項執行,再次空例項登入。注意:為驗證效果,已關閉作業系統驗證機制!

 

 

SQL> shutdown

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> quit

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options 斷開

 

D:\oracle\database>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 1 24 00:07:00 2011

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

 

SQL> conn / as sysdba

ERROR:

ORA-01031: insufficient privileges  //OS層面驗證已經終止

 

SQL> conn sys/sys as sysdba

已連線到空閒例程。

SQL> conn scott/tiger1 as sysdba

已連線到空閒例程。

 

 

發現,在修改了密碼的情況下。密碼檔案是會隨著alter user命令而進行修改同步的。

 

那麼,如果我重建了密碼檔案,或者修改了引數remote_login_passwordfile的情況下,又是如何?

 

先看重建密碼檔案。

 

D:\oracle\database>orapwd file=PWDorcl.ora password=sys entries=5 force=y //重建密碼檔案

 

此時,密碼檔案中的使用者資訊:

//重建密碼檔案之前!

SQL> select * from v$pwfile_users;

 

USERNAME                       SYSDB SYSOP

------------------------------ ----- -----

SYS                            TRUE  TRUE

SCOTT                          TRUE  FALSE

//重建密碼檔案之後

SQL> select * from v$pwfile_users;

 

USERNAME                       SYSDB SYSOP

------------------------------ ----- -----

SYS                            TRUE  TRUE

 

 

差異顯而易見,當重新建立密碼檔案之後,系統對sys使用者和非sys使用者的處理方法是不同的。如果是sys使用者,新密碼檔案是存在的。但是對於非sys使用者的具有管理員許可權的使用者,密碼檔案中的資訊被去除掉。

 

如果這時候我們登入,則:

//實驗需要,關閉資料庫

SQL> shutdown

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> quit

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options 斷開

 

D:\oracle\database>sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 1 24 00:22:41 2011

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

 

SQL> conn / as sysdba

ERROR:

ORA-01031: insufficient privileges  //OS層面禁用

 

SQL> conn sys/sys as sysdba; //sys還在密碼檔案中,登入無問題

已連線到空閒例程。

SQL> conn scott/tiger1 as sysdba;

ERROR:

ORA-01031: insufficient privileges  //登入失敗!!!

 

 

警告: 您不再連線到 ORACLE

SQL>

 

 

那麼,這種時候,scott還具有sysdba許可權,如何處理呢?需要手工的重新對scott(非sys)使用者授權。

 

SQL> revoke sysdba from scott;

撤銷成功。

 

SQL> grant sysdba to scott;

授權成功。

 

SQL> select * from v$pwfile_users;

 

USERNAME                       SYSDB SYSOP

------------------------------ ----- -----

SYS                            TRUE  TRUE

SCOTT                          TRUE  FALSE

 

 

發現這樣處理下之後,scott又重新出現在密碼檔案中了。

 

那麼,如果變化引數remote_login_passwordfile呢?

 

 

SQL> alter system set remote_login_passwordfile=NONE scope=spfile;

 

系統已更改。

 

--當重新啟動之後

SQL> select * from v$pwfile_users;

 

未選定行 –NONE選項,表示不需要使用密碼檔案;

 

--再次修改回原有結構

SQL> alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;

 

系統已更改。

此時,重新啟動資料庫伺服器。

 

SQL> conn sys/sys as sysdba; //sys密碼檔案起效

已連線到空閒例程。

SQL> conn scott/tiger1 as sysdba; //scott密碼檔案起效

已連線到空閒例程。

SQL> startup

ORACLE 例程已經啟動。

 

Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             205523844 bytes

Database Buffers          398458880 bytes

Redo Buffers                7135232 bytes

資料庫裝載完畢。

資料庫已經開啟。

 

//判斷密碼檔案使用者

SQL> select * from v$pwfile_users;

 

USERNAME                       SYSDB SYSOP

------------------------------ ----- -----

SYS                            TRUE  TRUE

SCOTT                          TRUE  FALSE

 

結論:當引數模式從Exclusive轉化到NONE的時候,密碼檔案徹底失效,密碼檔案檢視結果為空。當從NONE轉回到Exclusive的時候,密碼檔案會重新建立。這個過程中,sys與非sys使用者效用相同。

 

下面,我們來進行一些實驗,進一步瞭解密碼檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-684510/,如需轉載,請註明出處,否則將追究法律責任。

相關文章