密碼文件(password file)是一個可選的文件,允許遠程SYSDBA或管理員訪問數(shù)據(jù)庫。
專注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)靈石免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
啟動Oracle時,還沒有數(shù)據(jù)庫可以用來驗證密碼。在本地系統(tǒng)上啟動Oracle時,Oracle會利用操作系統(tǒng)來執(zhí)行這種認證。安裝Oracle時,會要求完成完成的人指定管理員“組”。在Unix/Linux上,這個組一般默認為dba,在Windows上默認為OSDBA,不過也可以是平臺上任何合法的組名。這個組很特殊,因為這個組中的任何用戶都可以作為SYSDBA連接Oracle,而無需指定用戶名或密碼。
[root@rhel6 ~]# id MySQL uid=496(mysql) gid=495(mysql) groups=495(mysql),500(oinstall) [root@rhel6 ~]# su - mysql -bash-4.1$ export ORACLE_HOME=/u02/app/oracle/product/11.2.4/db1 -bash-4.1$ export ORACLE_SID=orcl -bash-4.1$ cd $ORACLE_HOME/bin -bash-4.1$ ./sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Dec 15 21:32:05 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter user-name: ^C -bash-4.1$ su Password: [root@rhel6 bin]# usermod -G dba mysql [root@rhel6 bin]# id mysql uid=496(mysql) gid=495(mysql) groups=495(mysql),501(dba) [root@rhel6 bin]# exit exit -bash-4.1$ ./sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Dec 15 21:32:36 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options sys@ORCL>show user USER is "SYS"
現(xiàn)在可以連接數(shù)據(jù)庫做管理工作,或啟動關(guān)閉數(shù)據(jù)庫。如果要從另外一臺機器通過網(wǎng)絡(luò)完成這個操作會怎么樣呢?下面我使用@連接串來連接:
C:\Users\victor>sqlplus /@orcl as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12月 15 21:42:04 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied
在網(wǎng)絡(luò)上,對于SYSDBA的操作系統(tǒng)認證不再奏效,即使把很不安全的REMOTE_OS_AUTHENT參數(shù)設(shè)置為TRUE也不例外。所以操作系統(tǒng)認證不可行。因此密碼文件應(yīng)運而生了。
密碼文件保存了一個用戶名和密碼列表,這些用戶名和密碼分別對應(yīng)于通過網(wǎng)絡(luò)遠程認證為SYSDBA的用戶。Oracle必須使用這個文件來認證用戶,而不是數(shù)據(jù)庫中存儲的正常密碼列表。
下面驗證這種情況。首先,設(shè)置REMOTE_LOGIN_PASSWORDFILE,有三個值:NONE,意味著沒有密碼文件,不存在“遠程SYSDBA登錄”、SHARED,多個數(shù)據(jù)庫可以使用同樣的密碼文件、EXCLUSIVE,只有一個數(shù)據(jù)庫使用一個給定的密碼文件。這里設(shè)置為EXCLUSIVE。
alter system set remote_login_passwordfile=exclusive scope=spfile;
修改這個參數(shù)需要重啟數(shù)據(jù)庫。
使用orapwd創(chuàng)建和填寫這個初始的密碼文件,密碼文件位于$ORACLE_HOME/dbs目錄中。
[oracle@rhel6 dbs]$ which orapwd /u02/app/oracle/product/11.2.4/db1/bin/orapwd [oracle@rhel6 dbs]$ orapwd Usage: orapwd file=entries= force= ignorecase= nosysdba= 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. [oracle@rhel6 dbs]$ pwd /u02/app/oracle/product/11.2.4/db1/dbs [oracle@rhel6 dbs]$ orapwd file=orapw$ORACLE_SID password=oracle entries=20 [oracle@rhel6 dbs]$ ls -l orapw$ORACLE_SID -rw-r----- 1 oracle oinstall 3584 Dec 15 21:55 orapworcl
目前該文件中只有一個用戶,也就是用戶SYS,盡管數(shù)據(jù)庫上還有其他SYSDBA賬戶,但它們還不在密碼文件中。不過基于以上設(shè)置我們可以作為SYSDBA通過網(wǎng)絡(luò)連接Oracle,即使Oracle沒有啟動,并且可以遠程啟動Oracle。
C:\Users\victor>sqlplus sys/oracle@orcl as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12月 15 22:00:24 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. 已連接到空閑例程。 SQL> startup ORACLE 例程已經(jīng)啟動。 Total System Global Area 784998400 bytes Fixed Size 2257352 bytes Variable Size 754978360 bytes Database Buffers 20971520 bytes Redo Buffers 6791168 bytes 數(shù)據(jù)庫裝載完畢。 數(shù)據(jù)庫已經(jīng)打開。
注意:如果上邊這一步遇到ORA-12505 "TNS:listener does not currently know of SID given in connect descriptor"說明沒有配置數(shù)據(jù)庫實例的靜態(tài)監(jiān)聽。
創(chuàng)建了密碼文件,那我們能不能看看密碼文件里到底記錄了什么內(nèi)容呢,會不會把我們的密碼泄漏呢?
密碼文件是一個二進制文件是不能直接查看的,Linux上可以使用strings命令查看
[oracle@rhel6 dbs]$ strings orapworcl ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2
從輸出可以看出密碼文件中沒有使用明文記錄我們的密碼而是記錄了一些串碼。
其實這個密碼文件還和數(shù)據(jù)庫中的一個視圖v$pwfile_users有一些關(guān)系
V$PWFILE_USERS lists all users in the password file, and indicates whether the user has been granted the SYSDBA, SYSOPER, and SYSASM privileges. USERNAME VARCHAR2(30) Name of the user that is contained in the password file SYSDBA VARCHAR2(5) Indicates whether the user can connect with SYSDBA privileges (TRUE) or not (FALSE) SYSOPER VARCHAR2(5) Indicates whether the user can connect with SYSOPER privileges (TRUE) or not (FALSE) SYSASM VARCHAR2(5) Indicates whether the user can connect with SYSASM privileges (TRUE) or not (FALSE) sys@ORCL>select * from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM ------------------------------------------------------------------------------------------ --------------- --------------- --------------- SYS TRUE TRUE FALSE --給用戶zx賦予SYSDBA權(quán)限可以看到v$pwfile_users多了一條記錄,而密碼文件orapworcl也多了一行串碼。 sys@ORCL>grant sysdba to zx; Grant succeeded. sys@ORCL>select * from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM ------------------------------------------------------------------------------------------ --------------- --------------- --------------- SYS TRUE TRUE FALSE ZX TRUE FALSE FALSE sys@ORCL>!strings /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2 7B06550956254585 --給用戶zx賦予SYSOPER的權(quán)限,可以看到v$pwfile_users的zx行狀態(tài)發(fā)生了變化,但是orapworcl沒有變化 sys@ORCL>grant sysoper to zx; Grant succeeded. sys@ORCL>select * from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM ------------------------------------------------------------------------------------------ --------------- --------------- --------------- SYS TRUE TRUE FALSE ZX TRUE TRUE FALSE sys@ORCL>!strings /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2 7B06550956254585 --移除密碼文件再移回來,移除密碼文件后v$pwfile_users變?yōu)榭眨苹睾髒$pwfile_users又有記錄。 sys@ORCL>! mv /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl_orcl sys@ORCL>select * from v$pwfile_users; no rows selected sys@ORCL>! mv /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl_orcl /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl sys@ORCL>select * from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM ------------------------------------------------------------------------------------------ --------------- --------------- --------------- SYS TRUE TRUE FALSE ZX TRUE TRUE FALSE --測試zx用戶遠程以SYSDBA登錄 C:\Users\victor>sqlplus zx/zx@orcl as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12月 15 22:34:09 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. 連接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show user; USER 為 "SYS" --回收用戶zx的SYSDBA和SYSOPER權(quán)限,v$pwfile_users中的zx記錄行沒有了,密碼文件orapworcl沒有變化 sys@ORCL>revoke sysdba,sysoper from zx; Revoke succeeded. sys@ORCL>select * from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM ------------------------------------------------------------------------------------------ --------------- --------------- --------------- SYS TRUE TRUE FALSE sys@ORCL>!strings /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2 7B06550956254585 --再次測試zx用戶遠程以SYSDBA登錄,現(xiàn)在無法登錄 C:\Users\victor>sqlplus zx/zx@orcl as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12月 15 22:35:17 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied
參考:http://www.xifenfei.com/2011/12/vpwfile_users%E5%92%8C%E5%AF%86%E7%A0%81%E6%96%87%E4%BB%B6%E5%85%B3%E7%B3%BB.html
《9i10g11g編程藝術(shù) 深入數(shù)據(jù)庫體系結(jié)構(gòu)》