************************************************************************************************************
Oracle OS認(rèn)證與口令文件認(rèn)證詳解
本文概述與實(shí)驗(yàn)環(huán)境
概述:本文只討論OS認(rèn)證和口令文件認(rèn)證方式的配置方法,如何配置以及使用OS認(rèn)證和口令文件認(rèn)證方式驗(yàn)證SYSDBA/SYSOPER權(quán)限。
實(shí)驗(yàn)環(huán)境:Oracle 10.1 + Windows 2003 和 Oracle 10.2 + RHEL 4
特殊權(quán)限與Oracle登陸認(rèn)證管理
在開(kāi)始學(xué)Oracle的時(shí)候有件事一直讓我感覺(jué)很奇怪,就是為什么在數(shù)據(jù)沒(méi)有起來(lái)的時(shí)候只要登錄到安裝Oracle的操作系統(tǒng)中直接用sqlplus / as sysdba就能登陸到數(shù)據(jù)庫(kù)中然后對(duì)數(shù)據(jù)庫(kù)進(jìn)行啟動(dòng)停止之類的操作。后來(lái)看到關(guān)于Oracle口令文件相關(guān)資料的時(shí)候才豁然開(kāi)朗:數(shù)據(jù)庫(kù)認(rèn)證信息并不一定存在數(shù)據(jù)庫(kù)中的,這點(diǎn)和SQL Server很是不一樣。
在Oracle中有兩類特殊的權(quán)限SYSDBA和SYSOPER,當(dāng)DBA需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行維護(hù)管理操作的時(shí)候必須具有這兩類特殊權(quán)限之中的一種。在數(shù)據(jù)庫(kù)沒(méi)有打開(kāi)的時(shí)候,使用數(shù)據(jù)庫(kù)內(nèi)建的賬號(hào)是無(wú)法登陸數(shù)據(jù)庫(kù)的,但是擁有SYSDBA或是SYSOPER權(quán)限的用戶是可以登陸的。認(rèn)證用戶是否擁有兩類特殊權(quán)限的方法有兩種:OS認(rèn)證和口令文件認(rèn)證。
OS認(rèn)證和口令文件認(rèn)證方法
Oracle特殊權(quán)限認(rèn)證方法
(來(lái)源:Oracle® Database Administrator’s Guide 10g Release 2)
Oracle數(shù)據(jù)庫(kù)究竟使用OS認(rèn)證還是口令文件認(rèn)證來(lái)進(jìn)行管理取決于下面三個(gè)因素:
- SQLNET.ORA參數(shù)文件中的參數(shù)SQLNET.AUTHENTICATION_SERVICES設(shè)置
- PFILE(SPFILE)參數(shù)文件中的參數(shù)REMOTE_LOGIN_PASSWORDFILE設(shè)置
- 口令文件orapw$SID(Linux) | PWD$SID.ora(Windows)
Oracle權(quán)限認(rèn)證的基本順序是這樣的,先由SQLNET.AUTHENTICATION_SERVICES的設(shè)置值來(lái)決定是使用OS認(rèn)證還是口令文件認(rèn)證,如果使用口令文件認(rèn)證的話就要看后面兩個(gè)條件了:如果REMOTE_LOGIN_PASSWORDFILE參數(shù)設(shè)置為非NONE而且口令文件存在的話就能正常使用口令文件認(rèn)證,否則將會(huì)失敗。
SQLNET.AUTHENTICATION_SERVICES參數(shù)
在SQLNET.ORA(位于$ORACLE_HOME/NETWORK/ADMIN目錄中)文件中,需要修改時(shí)直接用文本編輯器打開(kāi)修改就行了,對(duì)于不同的操作系統(tǒng)SQLNET.AUTHENTICATION_SERVICES的取值會(huì)有些不一樣,通常我們會(huì)用到下面的一些設(shè)置值:
- SQLNET.AUTHENTICATION_SERVICES = (ALL)
對(duì)Linux系統(tǒng),支持OS認(rèn)證和口令文件認(rèn)證。
對(duì)Windows系統(tǒng),實(shí)際實(shí)驗(yàn)是不支持此參數(shù),驗(yàn)證失敗。
- SQLNET.AUTHENTICATION_SERVICES = (NTS)
此設(shè)置值僅用于Windows NT系統(tǒng),此設(shè)置同時(shí)支持OS認(rèn)證和口令文件認(rèn)證,只有在設(shè)置了(NTS)值之后運(yùn)行在Windows系統(tǒng)上的Oracle才支持OS認(rèn)證。
- SQLNET.AUTHENTICATION_SERVICES = (NONE)
此設(shè)置值在Windows和Linux是作用一樣的,指定Oracle只使用口令文件認(rèn)證。
- 不設(shè)置此參數(shù)或SQLNET.AUTHENTICATION_SERVICES =
對(duì)Linux系統(tǒng),默認(rèn)支持OS認(rèn)證和口令文件認(rèn)證。
對(duì)Windows系統(tǒng),默認(rèn)只支持口令文件認(rèn)證,不支持OS認(rèn)證。
OS認(rèn)證實(shí)現(xiàn)
Oracle使用操作系統(tǒng)中的兩個(gè)用戶組來(lái)控制OS認(rèn)證,在不同的操作系統(tǒng)中這兩個(gè)用戶組的名稱是不一樣的,一般來(lái)說(shuō)他們是OSDBA 和 OSOPER,這兩個(gè)用戶組都是在Oracle安裝的時(shí)候創(chuàng)建的。下面列出不同系統(tǒng)中這兩個(gè)用戶組的名字:
Operating System Group
|
UNIX User Group
|
UNIX User Group
|
OSDBA
|
dba
|
ORA_DBA
|
OSOPER
|
oper
|
ORA_OPER
|
OSDBA用戶組的用戶可以使用SYSDBA權(quán)限登陸數(shù)據(jù)庫(kù),OSOPER用戶組的的用戶可以使用SYSOPER權(quán)限來(lái)登陸數(shù)據(jù)庫(kù)。使用sqlplus可以用下面方法登陸
CONNECT / AS SYSDBA
CONNECT / AS SYSOPER
擁有OS權(quán)限的用戶登陸數(shù)據(jù)庫(kù)時(shí)不再需要輸入用戶名和密碼,因此使用下面的命令也是可以正常登陸的:
CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSDBA
CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSOPER
因此要?jiǎng)?chuàng)建一個(gè)新的OS認(rèn)證賬號(hào)步驟是:
- 建立一個(gè)OS用戶
- 將用戶加入到OSDBA或是OSOPER用戶組
- 用新增加的用戶登陸系統(tǒng),然后輸入sqlplus / AS SYSDBA進(jìn)行登陸
REMOTE_LOGIN_PASSWORDFILE參數(shù)
REMOTE_LOGIN_PASSWORDFILE系統(tǒng)參數(shù)的設(shè)置制定了數(shù)據(jù)庫(kù)使用口令文件的方法,此參數(shù)可以設(shè)置的值有三個(gè):
- REMOTE_LOGIN_PASSWORDFILE = NONE
不使用口令文件
- REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE
使用口令文件,但只有一個(gè)數(shù)據(jù)庫(kù)實(shí)例可用使用
- REMOTE_LOGIN_PASSWORDFILE = SHARED
多個(gè)數(shù)據(jù)庫(kù)實(shí)例共用一個(gè)口令文件,這種設(shè)置下是不能增加其他數(shù)據(jù)庫(kù)用戶作為特殊權(quán)限用戶到口令文件中的。
REMOTE_LOGIN_PASSWORDFILE參數(shù)屬于初始化參數(shù),只能在init.ora/pfile中指定或是在數(shù)據(jù)庫(kù)打開(kāi)狀態(tài)下使用下面語(yǔ)句修改,然后重新啟動(dòng)數(shù)據(jù)庫(kù)。
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE ;
要檢查當(dāng)前REMOTE_LOGIN_PASSWORDFILE的設(shè)定值在登陸Oracle后輸入下面的命令
SQL > show parameter remote
/** 這是輸出結(jié)果,看remote_login_passwordfile一行
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_archive_enable string true
remote_dependencies_mode string TIMESTAMP
remote_listener string
remote_login_passwordfile string EXCLUSIVE
remote_os_authent boolean FALSE
remote_os_roles boolean FALSE
SQL>
*/
口令文件和口令文件認(rèn)證
口令文件存放著被授予SYSDBA或SYSOPER權(quán)限的用戶的用戶名和密碼。它是一個(gè)加密的文件,用戶不能修改這個(gè)文件,
在Linux系統(tǒng)中口令文件一般保存在$ORACLE_HOME/dbs目錄下,文件名為orapw$SID;在Windows系統(tǒng)中口令文件一般保存在$ORACLE_HOME/database目錄下,文件名為PWD$SID.ora。
使用口令文件認(rèn)證的基本步驟是:
- 使用orapwd工具生成口令文件
- 設(shè)置REMOTE_LOGIN_PASSWORDFILE為EXCLUSIVE或是SHARED
- 使用SYS登陸數(shù)據(jù)庫(kù),創(chuàng)建新的數(shù)據(jù)庫(kù)用戶
- 使用GRANT命令授予新創(chuàng)建的用戶SYSDBA/SYSOPER權(quán)限
1、使用orapwd工具生成口令文件
我們可以使用Oracle提供的工具orapwd來(lái)創(chuàng)建或者重新初始化一個(gè)口令文件:
[oracle@RHEL4 dbs]$ orapwd
Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n>
where
file - name of password file (mand),
password - password for SYS (mand),
entries - maximum number of distinct DBA and force - whether to overwrite existing file (opt),
OPERs (opt),
There are no spaces around the equal-to (=) character.
[oracle@RHEL4 ~]$ orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y
[oracle@RHEL4 ~]$
注意:使用orapwd重新生成口令文件之后以保存的授予的其他用戶的SYSDBA或是SYSOPER權(quán)限將會(huì)丟失,需要重新的GRANT。
設(shè)定的entries值是不能修改的,如果要修改entries的話需要重新生成口令文件,在生成口令文件之前可以先通過(guò)V$PWFILE_USERS視圖查詢出當(dāng)前被授予SYSDBA/SYSOPER權(quán)限的用戶,然后在重新生成口令文件以后重新對(duì)這些用戶授予SYSDBA/SYSOPER權(quán)限
2、設(shè)置REMOTE_LOGIN_PASSWORDFILE為EXCLUSIVE或是SHARED
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE ;
3、使用SYS登陸數(shù)據(jù)庫(kù),創(chuàng)建新的數(shù)據(jù)庫(kù)用戶
CREATE USER test IDENTIFIED BY test ;
4、使用GRANT命令授予新創(chuàng)建的用戶SYSDBA/SYSOPER權(quán)限
每次在Oracle系統(tǒng)里面使用GRANT SYSDBA/SYSOPER授予新用戶特殊權(quán)限或是ALTER USER命令修改擁有SYSDBA/SYSOPER權(quán)限的用戶密碼的時(shí)候,Oracle都會(huì)自動(dòng)的修改口令文件,增加或是修改相應(yīng)的項(xiàng)目,這樣保證在數(shù)據(jù)沒(méi)有打開(kāi)的情況擁有特殊權(quán)限的用戶能正常的登陸數(shù)據(jù)庫(kù)以進(jìn)行管理操作。
實(shí)驗(yàn)
上面長(zhǎng)篇大論的說(shuō)了那么多,下面我們來(lái)做實(shí)驗(yàn)驗(yàn)證一下。實(shí)驗(yàn)都是基于Linux系統(tǒng)來(lái)做的,做實(shí)驗(yàn)之前先使用下面的命令創(chuàng)建一個(gè)口令文件:
[oracle@RHEL4 ~]$ orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y
1、驗(yàn)證OS認(rèn)證
設(shè)置SQLNET.ORA中參數(shù)SQLNET.AUTHENTICATION_SERVICES = (ALL)或是不設(shè)置,REMOTE_LOGIN_PASSWORDFILE = NONE,然后進(jìn)行下面的操作。
本地使用下面兩種方式登陸,都能成功
[oracle@RHEL4 dbs]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 7 15:06:55 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
[oracle@RHEL4 dbs]$ sqlplus aaa/bbb as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 7 15:16:25 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
遠(yuǎn)程使用口令文件方式登陸,失敗
D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:06:55 2008
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
2、兩種認(rèn)證都失效
設(shè)置SQLNET.ORA中參數(shù)SQLNET.AUTHENTICATION_SERVICES = (NONE),REMOTE_LOGIN_PASSWORDFILE = NONE,然后進(jìn)行下面的操作。
本地使用下面兩種方式登陸,都失敗
[oracle@RHEL4 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:22:05 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
[oracle@RHEL4 ~]$ sqlplus sys/pwd as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:22:46 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
遠(yuǎn)程使用口令文件方式登陸,失敗
D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:06:55 2008
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
3、驗(yàn)證口令文件認(rèn)證
設(shè)置SQLNET.ORA中參數(shù)SQLNET.AUTHENTICATION_SERVICES = (NONE)不設(shè)置,REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE或SHARED,然后進(jìn)行下面的操作。
本地使用驗(yàn)證OS認(rèn)證,失敗
[oracle@RHEL4 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:16:56 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
本地驗(yàn)證口令文件認(rèn)證,成功
[oracle@RHEL4 ~]$ sqlplus sys/pwd as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:26:48 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
遠(yuǎn)程使用口令文件認(rèn)證,成功
D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:21:18 2008
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SYS@192.168.0.201/orcl>
4、兩種認(rèn)證都成功
設(shè)置SQLNET.ORA中參數(shù)SQLNET.AUTHENTICATION_SERVICES = (ALL),REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE,然后進(jìn)行下面的操作。
本地使用驗(yàn)證OS認(rèn)證,成功
[oracle@RHEL4 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:30:33 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
遠(yuǎn)程使用口令文件認(rèn)證,成功
D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:27:11 2008
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SYS@192.168.0.201/orcl>
5、將SYSDBA/SYSOPER權(quán)限授權(quán)給其它數(shù)據(jù)庫(kù)帳戶
先查看口令文件的修改時(shí)間
[oracle@RHEL4 dbs]$ ll orapworcl
-rw-r----- 1 oracle oinstall 2560 Jun 7 19:04 orapworcl
用SYS登陸數(shù)據(jù)庫(kù),創(chuàng)建新用戶test,并賦予SYSDBA權(quán)限
[oracle@RHEL4 dbs]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 21:41:36 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
SQL > create user test identified by test ;
User created .
SQL > grant sysdba to test ;
Grant succeeded .
SQL>exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
再看口令文件,已經(jīng)修改了
[oracle@RHEL4 dbs]$ ll orapworcl
-rw-r----- 1 oracle oinstall 2560 Jun 7 21:42 orapworcl
再用新的test賬號(hào)登陸,能成功的登陸
D:\Oracle\SQLPlus10.2>sqlplus test/test@192.168.0.201/orcl as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 21:32:37 2008
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SYS@192.168.0.201/orcl>
說(shuō)明:如果要取消SYSDBA權(quán)限只需要運(yùn)行下面的語(yǔ)句就可以了
SQL > revoke sysdba from test ;
常見(jiàn)問(wèn)題說(shuō)明
1、如何查找擁有SYSDBA或是SYSOPER權(quán)限的用戶
使用視圖V$PWFILE_USERS,結(jié)果集中的SYSDB和SYSOP分別代表是否有SYSDBA和SYSOPER權(quán)限。
SQL > select * from v $ pwfile_users ;
/**
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST TRUE FALSE
*/
2、授予權(quán)限時(shí)出現(xiàn)”ORA-01994: GRANT failed: password file missing or disabled”
出現(xiàn)這種情況是因?yàn)闆](méi)有創(chuàng)建口令文件,或者是口令文件放置的目錄不正確,Oracle找不到。只要重建或?qū)⒖诹钗募糜?ORACLE_HOME/dbs/目錄中就可以了。
3、忘記了SYS賬號(hào)的密碼怎么辦?
如果數(shù)據(jù)庫(kù)啟用的OS認(rèn)證登陸,則可以用OS認(rèn)證登陸數(shù)據(jù)庫(kù),然后使用下面的命令進(jìn)行修改
alter user SYS identified by pwd ;
如果沒(méi)有啟用OS認(rèn)證登陸,則需要用orapwd重建口令文件
orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y
其中的password項(xiàng)所指定的就是SYS的密碼