【登陸認證】oracle的作業系統認證和口令檔案認證方式(轉載)

luckyfriends發表於2016-12-21

關於oracle的作業系統認證方式和口令檔案認證方式一直苦惱了很久,偶然在網上找到一篇文章,記錄一下,稍後再做幾個實驗驗證一下。

本文來源

oracle認證方式分為作業系統認證和口令檔案認證2種方式,作業系統認證有時候也叫本地認證。這2種認證我是這麼理解的:
--作業系統認證:
即oracle認為作業系統使用者是可靠的,即既然能登陸到作業系統那麼oracle資料庫你也能登陸
--口令檔案認證:
oracle認證認為作業系統使用者是不可信任的,如果要訪問資料庫,必須進行再次認證。

具體實現如下:
--作業系統認證:
配置sqlnet.ora檔案中的引數:SQLNET.AUTHENTICATION_SERVICES=(NTS)
       spfile(pfile)檔案引數: REMOTE_LOGIN_PASSWORDFILE=('NONE')

--口令檔案認證:
配置sqlnet.ora檔案中的引數:SQLNET.AUTHENTICATION_SERVICES=(NONE)
     spfile(pfile)檔案引數: REMOTE_LOGIN_PASSWORDFILE=('EXCLUSIVE')或('SHARED')
       這個時候需要配置口令檔案PWDorcl.ora。(orcl為資料庫SID)
     select * from v$pwfile_users;

一、sysdba的許可權

sysdba(sysoper和normal)是登入資料庫的身份,與角色(dba、resource)、物件許可權及系統許可權有所區別,登入身份表明了可對資料庫的整體進行哪些操作,sysdba有些類似unix下的root帳戶。

sysdba的許可權或可對資料庫進行的操作:

startup,shutdown

alter database open|mount

alter database backup controlfile

alter tablespace begin/end backup

recover database

alter database archivelog,restricted session

create database

recover database until

二、os認證和口令檔案認證

1、os認證和口令檔案認證其實質是對oracle資料庫採取何種管理方式,是本地管理還是透過一臺管理伺服器統一管理。

本地管理採用的就是os認證方式,統一管理採用的就是口令檔案認證方式

2、兩種認證的實現

oracle資料庫透過sqlnet.ora檔案中的引數 SQLNET.AUTHENTICATION_SERVICES,PFILE(或SPFILE)檔案中的引數 REMOTE_LOGIN_PASSWORDFILE和口令檔案PWDsid.ora三者協同作用實現身份認證。

SQLNET.AUTHENTICATION_SERVICES=(NTS)|(NONE)

SQLNET.AUTHENTICATION_SERVICES=(NTS): 作業系統認證方式,不使用口令檔案

SQLNET.AUTHENTICATION_SERVICES=(NONE):口令檔案認證方式

REMOTE_LOGIN_PASSWORDFILE=(NONE)|(EXCLUSIVE)|(SHARED)

REMOTE_LOGIN_PASSWORDFILE=(NONE):不使用口令檔案,作業系統認證

REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE):口令檔案認證方式,但只有一個資料庫例項可以使用此檔案,

系統允許將SYSOPER/SYSDBA授予除INTERNAL/SYS以外的其他使用者,且以具有這類身份的其他使用者登入是有效的

REMOTE_LOGIN_PASSWORDFILE=(SHARED):口令檔案認證方式,可有多個資料庫例項使用此檔案,但是此設定下

只有INTERNAL/SYS帳號能被識別,即使檔案中存有其他使用者的資訊,也不允許他們以SYSOPER/SYSDBA登入

1)SQLNET.AUTHENTICATION_SERVICES=(NTS)同時REMOTE_LOGIN_PASSWORDFILE=(NONE),此時為作業系統認證方式。

當以oracle_dba組下的使用者登入進入本地windows2000後進行下邊的操作:

sqlplus /nolog

sql>conn /as sysdba

sqlplus /nolog

sql>conn 任意使用者名稱/密碼 as sysdba

均可以sysdba身份登入成功,進行資料庫方面的操作

當以遠端進行登入時,執行

sqlplus /nolog

sql>conn /as sysdba

sqlplus /nolog

sql>conn sys/密碼 as sysdba

均顯示

“ERROR:

ORA-01031: insufficient privileges

也就是不允許以sysdba身份遠端登入系統,這也是os認證之所以也稱為本地認證方式的原因

2)SQLNET.AUTHENTICATION_SERVICES=(NONE)同時REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)或(SHARED),配合口令檔案

PWDsid.ora,此時為口令檔案認證方式

當在本地以oracle_dba組下的使用者登入進入windows2000後進行下邊的操作:

sqlplus /nolog

sql>conn /as sysdba

顯示

“ERROR:

ORA-01031: insufficient privileges

實質上是要求提供擁有sysdba身份的使用者名稱和密碼

在本地或遠端進行下邊的操作

sqlplus "sys/密碼@服務名 as sysdba"

可進入系統

也就是說口令檔案認證方式允許使用者從本地或遠端以sysdba身份登入,但必須提供口令字

3)SQLNET.AUTHENTICATION_SERVICES=(NTS)同時REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)或(SHARED),配合口令檔案PWDsid.ora,此時作業系統認證和口令檔案認證同時起作用

當在本地以oracle_dba組下的使用者登入進入windows2000後進行下邊的操作:

sqlplus /nolog

sql>conn /as sysdba

可進入系統

當在遠端執行

sqlplus "sys/密碼@服務名 as sysdba"

同樣可正常登入到資料庫系統上

上邊的引數配置容易令人迷惑、混淆,造成假象。我推測網上有些朋友所以對身份認證產生費解可能就是因為這麼

配置引數的!

三、其他

從前邊的討論可以知道,我們能夠對sys以外的使用者賦予sysdba身份,具體方法就是

SQLNET.AUTHENTICATION_SERVICES=(NONE)

REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)

口令檔案PWDsid.ora

SQL>grant sysdba to 使用者名稱

這樣,其他具有sysdba身份的使用者就加入到PWDsid.ora中,並可以被PWDsid.ora識別,我們可以用這個被賦予sysdba身份的使用者登入並進行類似sys使用者下所能執行的操作 


NONE 

Oracle ignores any password file. Therefore, privileged users must be authenticated by the operating system.

SHARED 

More than one database can use a password file. However, the only user recognized by the password file is SYS.

EXCLUSIVE 

The password file can be used by only one database and the password file can contain names other than SYS

==============================================================================================
ORACLE資料庫透過sqlnet.ora檔案中的引數sqlnet.authentication_services,引數檔案中的remote_login_passwordfile和口令檔案pwdsid.ora三者協同作用實現身份認證.

Sqlnet.authentication_services=(NTS)|(NONE)
NTS:作業系統認證方式,不使用口令檔案;
NONE:口令檔案認證方式

Remote_login_passwordfile=(NONE)|(EXCLUSIVE)|(SHARED)
NONE:不使用口令檔案,作業系統認證;
EXCLUSIVE:口令檔案認證方式,但只有一個資料庫例項可以使用此檔案;
SHARED:口令檔案認證方式,可以有多個資料庫例項可以使用此檔案,但此設定下只有SYS帳號能被識別,即使檔案中存在其他使用者的資訊,也不允許他們以SYSOPER/SYSDBA登入.

(1).sqlnet.authentication_services=(NTS)
同時Remote_login_passwordfile=(NONE),此時為作業系統認證方式.

當以oracle_dba組下的使用者登入進入本地的作業系統後,進行以下操作:
sqlplus /nolog
SQL>conn /assysdba
可以以sysdba身份登入成功,進行資料庫方面的操作.

當以遠端進行登入時,執行:
sqlplus /nolog
SQL>conn /assysdba
則會顯示:
ERROR:ORA-01031:insufficient privileges
即不允許以sysdba身份遠端登入系統,這也是OS認證這所以稱為本地認證方式的原因.

(2).Sqlnet.authentication_services=(NONE),同時
Remote_login_passwordfile=(EXCLUSIVE)|(SHARED),配合口令檔案PWDsid.ora,此時為口令檔案認證方式:

當在本地以oracle_dba組下的使用者登入進入系統時,進行以下操作:
sqlplus /nolog
SQL>conn /assysdba
則會顯示:
ERROR:ORA-01031:insufficient privileges

在本地或遠端進行下邊的操作:
sqlplus /nolog
SQL>conn sys/密碼@服務名assysdba
可以進入系統,也就是說口令檔案認證方式允許使用者從本地或遠端以sysdba身份登入,但必須提供口令字.


(3).Sqlnet.authentication_services=(NTS),同時
Remote_login_passwordfile=(EXCLUSIVE)|(SHARED),配合口令檔案PWDsid.ora,此時為作業系統認證和口令檔案認證同時起作用:

當在本地以oracle_dba組下的使用者登入進入作業系統後,進行下邊的操作:
sqlplus /nolog
SQL>conn /assysdba
可以進入系統.即作業系統認證方式登入成功.

當在遠端執行:
sqlplus /nolog
SQL>conn sys/密碼@服務名assysdba
同時可正常登入到資料庫系統,即口令檔案認證方式登入成功.
 
 
附:
要知道以下幾種登陸方式不是一種概念
sqlplus /nolog
1: conn /assysdba                    本機登陸,使用作業系統認證,有無監聽都可以
2: conn sys/password assysdba   本機登陸,使用密碼檔案認證,有無監聽都可以
3: conn assysdba 可以本機可以遠端,使用密碼檔案認證,必須有監聽,必須有tnsnames.ora,remote_login_passwordfile必須是EXCLUSIVE
說明:

從oracle的解釋可以知道,SQLNET.AUTHENTICATION_SERVICES=(NTS)是WINDOWS系統專用的,對linux/UNIX是不適用的。

最後做一個簡單的總結:
1、在windows下,SQLNET.AUTHENTICATION_SERVICES必須設定為NTS或者ALL才能使用OS認證;不設定或者設定為其他任何值都不能使用OS認證。
2、在linux下,在SQLNET.AUTHENTICATION_SERVICES的值設定為ALL,或者不設定的情況下,OS驗證才能成功;設定為其他任何值都不能使用OS認證。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
************************************************************************
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
下面是Eygle老師的一篇文章,相關,一起記錄一下。

文章來源:

Oracle中password file的作用及說明

作者: Eygle

在資料庫沒有啟動之前,資料庫內建使用者是無法透過資料庫來驗證身份的

口令檔案中存放sysdba/sysoper使用者的使用者名稱及口令
允許使用者透過口令檔案驗證,在資料庫未啟動之前登陸
從而啟動資料庫

如果沒有口令檔案,在資料庫未啟動之前就只能透過作業系統認證.

使用Rman,很多時候需要在nomount,mount等狀態對資料庫進行處理
所以通常要求sysdba許可權如果屬於本地DBA組,可以透過作業系統認證登陸
如果是遠端sysdba登陸,需要透過passwordfile認證.

1.remote_login_passwordfile = NONE

此時停用口令檔案驗證,Oracle資料庫不允許遠端SYSDBA/SYSOPER身份登入
無法透過遠端進行資料庫起停等操作管理

local:

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.3.0 - Production on Thu Apr 15 09:58:45 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production

SQL> alter user sys identified by oracle;

User altered.

SQL> show parameter pass

NAME                      TYPE   VALUE
--------------------- ----------- ------------------------------
remote_login_passwordfile string NONE
     

remote:

E:\Oracle\ora92\bin>sqlplus /nolog

SQL*Plus: Release 9.2.0.4.0 -
Production on 星期四 4月 15 09:39:22 2004

Copyright (c) 1982, 2002, Oracle
Corporation. All rights reserved.

SQL> connect as
sysdba
ERROR:
ORA-01017: invalid username/password; logon denied

此處實際上是無法透過口令檔案驗證

2.remote_login_passwordfile = exclusive

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

System altered.

SQL> startup force;
ORACLE instance started.

Total System Global Area 131142648 bytes
Fixed Size 451576 bytes
Variable Size 104857600 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SQL> show parameter pass

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
SQL> alter user sys identified by oracle;

User altered.


remote:


E:\Oracle\ora92\bin>sqlplus /nolog

SQL*Plus: Release 9.2.0.4.0 -
Production on 星期四 4月 15 09:47:11 2004

Copyright (c) 1982, 2002, Oracle
Corporation. All rights reserved.

SQL> connect as
sysdba
已連線。
SQL> show user
USER 為"SYS"
SQL>

 

這實際上就是透過口令檔案驗證登入的

3.進一步測試

如果此時我們刪除passwdfile,sysdba/sysoper將無法認證,也就無法登陸資料庫

Server:

 

    SQL> !
    [oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
    [oracle@jumper dbs]$ ls orapwhsjf
    orapwhsjf
    [oracle@jumper dbs]$ mv orapwhsjf orapwhsjf.bak
    [oracle@jumper dbs]$

 

Remote:

 

    E:\Oracle\ora92\bin>sqlplus /nolog

    SQL*Plus: Release 9.2.0.4.0 - Production on 星期四 4月 15 09:50:14 2004

    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

    SQL> connect as sysdba
    ERROR:
    ORA-01031: insufficient privileges


    SQL>

 

這實際上就是無法透過口令檔案驗證身份

 

4.如果丟失了passwdfile

如果使用passwdfile卻意外丟失,此時將不能啟動資料庫

 

 

    SQL> startup force;
    ORACLE instance started.

    Total System Global Area 131142648 bytes
    Fixed Size 451576 bytes
    Variable Size 104857600 bytes
    Database Buffers 25165824 bytes
    Redo Buffers 667648 bytes
    ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'
    ORA-27037: unable to obtain file status
    Linux Error: 2: No such file or directory
    Additional information: 3

 


此時可以透過orapwd重建口令檔案來解決
此處我們恢復口令檔案既可

 

    SQL> !
    [oracle@jumper oracle]$ mv $ORACLE_HOME/dbs/orapwhsjf.bak orapwhsjf
    [oracle@jumper oracle]$ exit
    exit

    SQL> alter database open;

    Database altered.

    SQL>

 

 

大致就是如此.

 

5. remote_login_passwordfile = shared

我們看一下Oracle9i文件中的說明:

SHARED

More than one database can use a password file. However, the only user recognized by the password file is SYS.

意思是說多個資料庫可以共享一個口令檔案,但是隻可以識別一個使用者:SYS

 

    SQL> select * from v$pwfile_users;

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

    SQL> grant sysdba to eygle;
    grant sysdba to eygle
    *
    ERROR at line 1:
    ORA-01994: GRANT failed: cannot add users to public password file

    SQL> show parameter password

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    remote_login_passwordfile string SHARED


我們看到,此時的口令檔案中是不能新增使用者的.

很多人的疑問在於:口令檔案的預設名稱是orapw<sid>,怎麼能夠共享?

實際上是這樣的: Oracle資料庫在啟動時,首先查詢的是orapw<sid>的口令檔案,如果該檔案不存在,則開始查詢,orapw的口令檔案
如果口令檔案命名為orapw,多個資料庫就可以共享.

我們看一下測試:

 

[oracle@jumper dbs]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.3.0 - Production on Tue Jul 6 09:40:34 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
[oracle@jumper dbs]$ ls
hsjf  initdw.ora  inithsjf.ora  init.ora  lkHSJF  orapwhsjf  spfilehsjf.ora
[oracle@jumper dbs]$ mv orapwhsjf orapwhsjf.bak
[oracle@jumper dbs]$ exit
exit

SQL> startup
ORACLE instance started.

Total System Global Area  235999908 bytes
Fixed Size                   451236 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'--這是最後查詢的檔案
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

         


我們建立orapw口令檔案,這時候可以開啟資料庫.

SQL> !
[oracle@jumper dbs]$ ls
hsjf  initdw.ora  inithsjf.ora  init.ora  lkHSJF  orapwhsjf.bak  spfilehsjf.ora
[oracle@jumper dbs]$ cp orapwhsjf.bak orapw
[oracle@jumper dbs]$ exit
exit

SQL> alter database open;

Database altered.

SQL> show parameter passw

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile            string      SHARED
SQL>   

    

那麼你可能會有這樣的疑問,多個Exclusive的資料庫是否可以共享一個口令檔案(orapw)呢?

我們繼續這個實驗:

SQL> show parameter password

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    remote_login_passwordfile string SHARED

    [oracle@jumper dbs]$ strings orapw
    ]\[Z
    ORACLE Remote Password file
    INTERNAL
    AB27B53EDC5FEF41
    8A8F025737A9097A

注意這裡僅記錄著INTERNAL/SYS的口令

REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE 時

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

    System altered.

    SQL> startup force;
    ORACLE instance started.

    Total System Global Area 235999908 bytes
    Fixed Size 451236 bytes
    Variable Size 201326592 bytes
    Database Buffers 33554432 bytes
    Redo Buffers 667648 bytes
    Database mounted.
    Database opened.
    SQL> !

    [oracle@jumper bin]$ cd $ORACLE_HOME/dbs
    [oracle@jumper dbs]$ strings orapw
    ]\[Z
    ORACLE Remote Password file
    HSJF
    INTERNAL
    AB27B53EDC5FEF41
    8A8F025737A9097A
    [oracle@jumper dbs]$ exit
    exit

注意這裡,以EXCLUSIVE 方式啟動以後,例項名稱資訊被寫入口令檔案.

此時如果有其他例項以Exclusive模式啟動仍然可以使用這個口令檔案,口令檔案中的例項名稱同時被改寫.

也就是說,資料庫只在啟動過程中才讀取口令檔案,資料庫執行過程中並不鎖定該檔案,類似於pfile/spfile檔案.

SQL> select * from v$pwfile_users;

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

    SQL> grant sysdba to eygle;

    Grant succeeded.

    SQL> select * from v$pwfile_users;

    USERNAME SYSDB SYSOP
    ------------------------------ ----- -----
    SYS TRUE TRUE
    EYGLE TRUE FALSE

    SQL> !
    [oracle@jumper bin]$ cd $ORACLE_HOME/dbs
    [oracle@jumper dbs]$ strings orapw
    ]\[Z
    ORACLE Remote Password file
    HSJF
    INTERNAL
    AB27B53EDC5FEF41
    8A8F025737A9097A
    >EYGLE
    B726E09FE21F8E83


注意此時可以增加SYSDBA使用者,並且這些資訊可以被寫入到口令檔案.

一旦口令檔案中增加了其他SYSDBA使用者,此檔案不再能夠被其他Exclusive的例項共享.

實際上,口令檔案對於其他使用者來說就是啟到了一個 sudo 的作用.

6.重建口令檔案

如果口令檔案丟失,可以使用orapwd可以重建口令檔案,語法如下:

[oracle@jumper oracle]$ orapwd
Usage: orapwd file=<fname> password=<password> entries=<users>

    where
    file - name of password file (mand),
    password - password for SYS (mand),
    entries - maximum number of distinct DBA and OPERs (opt),
    There are no spaces around the equal-to (=) character.

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

相關文章