【DB筆試面試542】簡述Oracle中的密碼文件。
- 2019 年 10 月 10 日
- 筆記
♣
題目部分
簡述Oracle中的密碼文件。
♣
答案部分
(一)密碼文件簡介
Oracle密碼文件的作用主要是進行SYSDBA和SYSOPER許可權的身份認證。密碼文件存放著被授予SYSDBA或SYSOPER許可權的用戶的用戶名和密碼。它是一個加密的文件,用戶不能修改這個文件,但是可以使用strings命令看到密碼的HASH值,如下所示:
[oracle@edsir4p1-PROD1 dbs]$ strings orapwPROD1 ][Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 o5&W 8A8F025737A9097A [oracle@edsir4p1-PROD1 dbs]$ SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS'; PASSWORD ------------------------------ 8A8F025737A9097A
在Linux系統中,密碼文件一般保存在$ORACLE_HOME/dbs目錄下,文件名為orapw$SID;在Windows系統中,密碼文件一般保存在%ORACLE_HOME%database目錄下,文件名為PWD$SID.ora。
(二)Oracle的兩種認證方式
在Oracle中有兩類特殊的許可權SYSDBA和SYSOPER,當DBA需要對資料庫進行維護管理操作的時候必須具有這兩類特殊許可權之中的一種。在資料庫沒有打開的時候,使用資料庫內建的帳號是無法登陸資料庫的,但是擁有SYSDBA或是SYSOPER許可權的用戶是可以登陸的。認證用戶是否擁有這兩類特殊許可權的方法有兩種:OS認證和密碼文件認證。Oracle資料庫究竟使用OS認證還是密碼文件認證來進行管理取決於下面三個因素:
① $ORACLE_HOME/network/admin/sqlnet.ora參數文件中的參數SQLNET.AUTHENTICATION_SERVICES的設置
② PFILE(SPFILE)參數文件中的參數REMOTE_LOGIN_PASSWORDFILE設置
③ 密碼文件:$ORACLE_HOME/dbs/orapw$ORACLE_SID(在Linux中) | %ORACLE_HOME%databasePWD%ORACLE_SID%.ora(在Windows中)
Oracle許可權認證的基本順序是這樣的,先由SQLNET.AUTHENTICATION_SERVICES的設置值來決定是使用OS認證還是密碼文件認證,如果使用密碼文件認證的話就要看參數參數REMOTE_LOGIN_PASSWORDFILE的設置和密碼文件是否存在:如果REMOTE_LOGIN_PASSWORDFILE參數設置為非NONE而且密碼文件存在的話就能正常使用密碼文件認證,否則將會失敗。
使用與作業系統集成的身份驗證,例如:sqlplus / as sysdba、sqlplus "/ as sysdba" 、sqlplus sys/lhrsasa as sysdba、sqlplus xx/xx as sysdba、sqlplus xx/xx as sysoper、sqlplus / as sysoper等都屬於OS認證,只要是在本機上使用as sysdba或as sysoper身份且不含TNS的方式登錄,都是首先進行OS驗證,若不支援OS驗證,則進行密碼文件驗證登錄。需要注意的是,命令「sqlplus / as sysdba」永遠是以OS驗證方式進行登錄的。
使用Oracle資料庫的密碼文件進行身份認證,例如:sqlplus lhr/lhr@orcl,只要是使用TNS的方式以sysdba或sysoper身份登錄資料庫,都是密碼文件驗證方式。另外,只要是輸入了密碼,則都有可能是使用密碼文件方式進行登錄認證,例如:sqlplus sys/lhrsasa as sysdba。
(三)SQLNET.AUTHENTICATION_SERVICES參數
該參數指明了登錄資料庫的方式,需要在sqlnet.ora(位於$ORACLE_HOME/network/admin目錄中)文件中進行設置。在需要修改時,可以直接用文本編輯器打開該文件進行修改即可。對於不同的作業系統,SQLNET.AUTHENTICATION_SERVICES的取值會有些不一樣,通常會用到下面的一些設置值:
l SQLNET.AUTHENTICATION_SERVICES = (ALL)
對Linux系統而言,表示支援OS認證和遠程登錄密碼文件認證。但是,如果在本地資料庫伺服器上通過監聽(tns)連接到資料庫,那麼將不再支援密碼文件認證,而會報錯:ORA-12641: Authentication service failed to initialize。所以,在Linux系統中,建議將該參數注釋掉。
對Windows系統,實際實驗是不支援此參數,驗證失敗。報錯:ORA-12641: 驗證服務無法初始化(ORA-12641:Authentication service failed to initialize)
l SQLNET.AUTHENTICATION_SERVICES = (NTS)
此設置值僅用於Windows NT系統,此設置同時支援OS認證和密碼文件認證,只有在設置了(NTS)值之後運行在Windows系統上的Oracle才支援OS認證。若Linux系統上設置了此參數,則指定Oracle只使用密碼文件認證。
l SQLNET.AUTHENTICATION_SERVICES = (NONE)
此設置值在Windows和Linux是作用一樣的,指定Oracle只使用密碼文件認證。
l 不設置此參數或sqlnet.ora文件不存在或SQLNET.AUTHENTICATION_SERVICES =
對Linux系統,默認支援OS認證和密碼文件認證。所以,在Linux系統中,建議將該參數注釋掉。
對Windows系統,默認只支援密碼文件認證,不支援OS認證。
最後總結一句,在Linux作業系統中,建議將參數SQLNET.AUTHENTICATION_SERVICES注釋掉。在Windows作業系統中,建議設置參數SQLNET.AUTHENTICATION_SERVICES = (NTS)。
(四)REMOTE_LOGIN_PASSWORDFILE參數
REMOTE_LOGIN_PASSWORDFILE參數的設置指定了資料庫使用密碼文件的方法,此參數可以設置的值有三個:
l REMOTE_LOGIN_PASSWORDFILE = NONE #不使用密碼文件
l REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE #使用密碼文件,但只有一個資料庫實例可以使用
l REMOTE_LOGIN_PASSWORDFILE = SHARED #多個資料庫實例共用一個密碼文件,這種設置下是不能增加其他資料庫用戶作為特殊許可權用戶到密碼文件中的。
REMOTE_LOGIN_PASSWORDFILE參數屬於初始化參數,只能在init.ora/pfile中指定或是在資料庫打開狀態下使用下面語句修改,然後重新啟動資料庫。
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE ;
要檢查當前REMOTE_LOGIN_PASSWORDFILE的設定值在登陸Oracle後輸入下面的命令
SYS@PROD1> show parameter remote_login_passwordfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string EXCLUSIVE
(五)密碼文件的建立
可以使用orapwd命令來重建密碼文件:
[oracle@edsir4p1-PROD1 dbs]$ orapwd Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n> where file - name of password file (required), password - password for SYS will be prompted if not specified at command line, entries - maximum number of distinct DBA (optional), force - whether to overwrite existing file (optional), ignorecase - passwords are case-insensitive (optional), nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only). There must be no spaces around the equal-to (=) character.
需要注意以下幾點:
① 使用orapwd重新生成密碼文件之後,以前保存的授予的其他用戶的SYSDBA或是SYSOPER許可權將會丟失,需要重新的GRANT。在生成密碼文件之前可以先通過V$PWFILE_USERS視圖查詢出當前被授予SYSDBA/SYSOPER許可權的用戶,然後在重新生成密碼文件以後重新對這些用戶授予SYSDBA/SYSOPER許可權。
② entries表示可以有多少個SYSDBA或SYSOPER許可權用戶放到密碼文件中去,去掉重複記錄。這裡的entries中存放的個數但不是實際個數,這個是二進位數據。設定的entries值是不能修改的,若要修改entries的話則需要重新生成密碼文件。
(六)導緻密碼文件內容修改的幾種方式
以下幾種操作都會導緻密碼文件被修改:
① 使用orapwd建立,修改密碼文件
② 用alter user sys identified by <>
③ 使用grant sysdba to <>或grant sysoper to <>或revoke sysdba |sysoper from <>
需要注意的是,每次在Oracle系統裡面使用GRANT SYSDBA/SYSOPER授予新用戶特殊許可權或是ALTER USER命令修改擁有SYSDBA/SYSOPER許可權的用戶密碼的時候,Oracle都會自動的修改密碼文件,增加或是修改相應的項目,這樣保證在數據沒有打開的情況擁有特殊許可權的用戶能正常的登陸資料庫以進行管理操作。
在使用ALTER USER 修改SYS密碼時,會同時修改密碼文件中的密碼,保持一致;如果是手工創建的密碼文件,那麼密碼文件中的密碼可以與SYS密碼相同也可以不同,都不影響密碼文件驗證登錄。不過還是建議資料庫中SYS密碼與密碼文件中的密碼一致,以免需要急用遠程登錄時密碼反而不對,造成維護上的問題。查詢MOS上也有相關的文檔:Password or SYS Doesn't Match the Hash Value in USER$ (文檔 ID 2139304.1)。
& 說明:
有關Oracle密碼文件的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2147876/、http://blog.itpub.net/26736162/viewspace-2129595/、http://blog.itpub.net/26736162/viewspace-2135493/
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。