【登陆认证】oracle的操作系统认证和口令文件认证方式(转载)

关于oracle的操作系统认证方式和口令文件认证方式一直苦恼了很久,偶然在网上找到一篇文章,记录一下,稍后再做几个实验验证一下。

本文来源 http://wenku.baidu.com/view/f2ea58c78bd63186bcebbc37.html

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 sys/password@dbanote 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老师的一篇文章,相关,一起记录一下。

文章来源:http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FDatabase%2FOther%2FM.1122654680.K0

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 sys/oracle@hsjf 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 sys/oracle@hsjf 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 sys/oracle@hsjf 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,怎么能够共享?

实际上是这样的: Oracle数据库在启动时,首先查找的是orapw的口令文件,如果该文件不存在,则开始查找,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= password= entries=

    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.

请使用浏览器的分享功能分享到微信等