密码文件(password file)是一个可选的文件,允许远程SYSDBA或管理员访问数据库。
启动Oracle时,还没有数据库可以用来验证密码。在本地系统上启动Oracle时,Oracle会利用操作系统来执行这种认证。安装Oracle时,会要求完成完成的人指定管理员“组”。在Unix/Linux上,这个组一般默认为dba,在Windows上默认为OSDBA,不过也可以是平台上任何合法的组名。这个组很特殊,因为这个组中的任何用户都可以作为SYSDBA连接Oracle,而无需指定用户名或密码。
[root@rhel6~]#idMysqL uid=496(MysqL)gid=495(MysqL)groups=495(MysqL),500(oinstall) [root@rhel6~]#su-MysqL -bash-4.1$exportORACLE_HOME=/u02/app/oracle/product/11.2.4/db1 -bash-4.1$exportORACLE_SID=orcl -bash-4.1$cd$ORACLE_HOME/bin -bash-4.1$./sqlplus/assysdba sql*Plus:Release11.2.0.4.0ProductiononThuDec1521:32:052016 copyright(c)1982,2013,Oracle.Allrightsreserved. ERROR: ORA-01017:invalidusername/password;logondenied Enteruser-name:^C -bash-4.1$su Password: [root@rhel6bin]#usermod-GdbaMysqL [root@rhel6bin]#idMysqL uid=496(MysqL)gid=495(MysqL)groups=495(MysqL),501(dba) [root@rhel6bin]#exit exit -bash-4.1$./sqlplus/assysdba sql*Plus:Release11.2.0.4.0ProductiononThuDec1521:32:362016 copyright(c)1982,Oracle.Allrightsreserved. Connectedto: OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions sys@ORCL>showuser USERis"SYS"
现在可以连接数据库做管理工作,或启动关闭数据库。如果要从另外一台机器通过网络完成这个操作会怎么样呢?下面我使用@连接串来连接:
C:\Users\victor>sqlplus/@orclassysdba sql*Plus:Release12.1.0.1.0Productionon星期四12月1521:42:042016 copyright(c)1982,Oracle.Allrightsreserved. ERROR: ORA-01017:invalidusername/password;logondenied
在网络上,对于SYSDBA的操作系统认证不再奏效,即使把很不安全的REMOTE_OS_AUTHENT参数设置为TRUE也不例外。所以操作系统认证不可行。因此密码文件应运而生了。
密码文件保存了一个用户名和密码列表,这些用户名和密码分别对应于通过网络远程认证为SYSDBA的用户。Oracle必须使用这个文件来认证用户,而不是数据库中存储的正常密码列表。
下面验证这种情况。首先,设置REMOTE_LOGIN_PASSWORDFILE,有三个值:NONE,意味着没有密码文件,不存在“远程SYSDBA登录”、SHARED,多个数据库可以使用同样的密码文件、EXCLUSIVE,只有一个数据库使用一个给定的密码文件。这里设置为EXCLUSIVE。
alter system set remote_login_passwordfile=exclusive scope=spfile;
使用orapwd创建和填写这个初始的密码文件,密码文件位于$ORACLE_HOME/dbs目录中。
[oracle@rhel6dbs]$whichorapwd /u02/app/oracle/product/11.2.4/db1/bin/orapwd [oracle@rhel6dbs]$orapwd Usage:orapwdfile=<fname>entries=<users>force=<y/n>ignorecase=<y/n>nosysdba=<y/n> where file-nameofpasswordfile(required),password-passwordforSYSwillbepromptedifnotspecifiedatcommandline,entries-maximumnumberofdistinctDBA(optional),force-whethertooverwriteexistingfile(optional),ignorecase-passwordsarecase-insensitive(optional),nosysdba-whethertoshutouttheSYSDBAlogon(optionalDatabaseVaultonly). Theremustbenospacesaroundtheequal-to(=)character. [oracle@rhel6dbs]$pwd /u02/app/oracle/product/11.2.4/db1/dbs [oracle@rhel6dbs]$orapwdfile=orapw$ORACLE_SIDpassword=oracleentries=20 [oracle@rhel6dbs]$ls-lorapw$ORACLE_SID -rw-r-----1oracleoinstall3584Dec1521:55orapworcl
目前该文件中只有一个用户,也就是用户SYS,尽管数据库上还有其他SYSDBA账户,但它们还不在密码文件中。不过基于以上设置我们可以作为SYSDBA通过网络连接Oracle,即使Oracle没有启动,并且可以远程启动Oracle。
C:\Users\victor>sqlplussys/oracle@orclassysdba sql*Plus:Release12.1.0.1.0Productionon星期四12月1522:00:242016 copyright(c)1982,Oracle.Allrightsreserved. 已连接到空闲例程。 sql>startup ORACLE例程已经启动。 TotalSystemGlobalArea784998400bytes FixedSize2257352bytes VariableSize754978360bytes DatabaseBuffers20971520bytes Redobuffers6791168bytes 数据库装载完毕。 数据库已经打开。
注意:如果上边这一步遇到ORA-12505 "TNS:listener does not currently kNow of SID given in connect descriptor"说明没有配置数据库实例的静态监听。
创建了密码文件,那我们能不能看看密码文件里到底记录了什么内容呢,会不会把我们的密码泄漏呢?
密码文件是一个二进制文件是不能直接查看的,Linux上可以使用strings命令查看
[oracle@rhel6dbs]$stringsorapworcl ]\[Z ORACLERemotePasswordfile INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2
从输出可以看出密码文件中没有使用明文记录我们的密码而是记录了一些串码。
其实这个密码文件还和数据库中的一个视图v$pwfile_users有一些关系
V$PWFILE_USERSlistsallusersinthepasswordfile,andindicateswhethertheuserhasbeengrantedtheSYSDBA,SYSOPER,andSYSASMprivileges. USERNAMEVARCHAR2(30)Nameoftheuserthatiscontainedinthepasswordfile SYSDBAVARCHAR2(5)IndicateswhethertheusercanconnectwithSYSDBAprivileges(TRUE)ornot(FALSE) SYSOPERVARCHAR2(5)IndicateswhethertheusercanconnectwithSYSOPERprivileges(TRUE)ornot(FALSE) SYSASMVARCHAR2(5)IndicateswhethertheusercanconnectwithSYSASMprivileges(TRUE)ornot(FALSE) sys@ORCL>select*fromv$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM --------------------------------------------------------------------------------------------------------------------------------------- SYS TRUE TRUE FALSE --给用户zx赋予SYSDBA权限可以看到v$pwfile_users多了一条记录,而密码文件orapworcl也多了一行串码。 sys@ORCL>grantsysdbatozx; Grantsucceeded. sys@ORCL>select*fromv$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 ORACLERemotePasswordfile INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2 7B06550956254585 --给用户zx赋予SYSOPER的权限,可以看到v$pwfile_users的zx行状态发生了变化,但是orapworcl没有变化 sys@ORCL>grantsysopertozx; Grantsucceeded. sys@ORCL>select*fromv$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 ORACLERemotePasswordfile INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2 7B06550956254585 --移除密码文件再移回来,移除密码文件后v$pwfile_users变为空,移回后v$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*fromv$pwfile_users; norowsselected 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*fromv$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM --------------------------------------------------------------------------------------------------------------------------------------- SYS TRUE TRUE FALSE ZX TRUE TRUE FALSE --测试zx用户远程以SYSDBA登录 C:\Users\victor>sqlpluszx/zx@orclassysdba sql*Plus:Release12.1.0.1.0Productionon星期四12月1522:34:092016 copyright(c)1982,Oracle.Allrightsreserved. 连接到: OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction WiththePartitioning,DataMiningandRealApplicationTestingoptions sql>showuser; USER为"SYS" --回收用户zx的SYSDBA和SYSOPER权限,v$pwfile_users中的zx记录行没有了,密码文件orapworcl没有变化 sys@ORCL>revokesysdba,sysoperfromzx; Revokesucceeded. sys@ORCL>select*fromv$pwfile_users; USERNAME SYSDBA SYSOPER SYSASM --------------------------------------------------------------------------------------------------------------------------------------- SYS TRUE TRUE FALSE sys@ORCL>!strings/u02/app/oracle/product/11.2.4/db1/dbs/orapworcl ]\[Z ORACLERemotePasswordfile INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A mHD2 7B06550956254585 --再次测试zx用户远程以SYSDBA登录,现在无法登录 C:\Users\victor>sqlpluszx/zx@orclassysdba sql*Plus:Release12.1.0.1.0Productionon星期四12月1522:35:172016 copyright(c)1982,Oracle.Allrightsreserved. ERROR: ORA-01017:invalidusername/password;logondenied
《9i10g11g编程艺术 深入数据库体系结构》