【密码文件】Oracle OS认证与密码文件(口令文件)认证
1.1 密码文件
1.1.1 密码文件简介
作用:主要进行SYSDBA和SYSOPER权限的身份认证。密码文件存放着被授予SYSDBA或SYSOPER权限的用户的用户名和密码。它是一个加密的文件,用户不能修改这个文件,但是可以使用strings命令看到密码的HASH值。
在Linux系统中,密码文件一般保存在$ORACLE_HOME/dbs目录下,文件名为orapw$SID;在Windows系统中,密码文件一般保存在%ORACLE_HOME%\database目录下,文件名为PWD$SID.ora。
[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
使用密码文件认证的基本步骤是:
使用orapwd工具生成密码文件
设置REMOTE_LOGIN_PASSWORDFILE为EXCLUSIVE或是SHARED
使用SYS登陆数据库,创建新的数据库用户
使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限
1.1.2 密码文件的位置
Linux下的存放位置:$ORACLE_HOME/dbs/orapw$ORACLE_SID
即:ORACLE_HOME/dbs/orapw<sid>
Windows下的存放位置:$ORACLE_HOME/database/PWD%ORACLE_SID%.ora
密码文件查找的顺序
--->orapw<sid>--->orapw--->Failure
1.1.3 Oracle的两种认证方式
在Oracle中有两类特殊的权限SYSDBA和SYSOPER,当DBA需要对数据库进行维护管理操作的时候必须具有这两类特殊权限之中的一种。在数据库没有打开的时候,使用数据库内建的账号是无法登陆数据库的,但是拥有SYSDBA或是SYSOPER权限的用户是可以登陆的。认证用户是否拥有这两类特殊权限的方法有两种:OS认证和密码文件认证。
1.使用与操作系统集成的身份验证,例如:sqlplus / as sysdba、sqlplus "/ as sysdba" 、sqlplus sys/lhrsasa as sysdba、sqlplus xx/xx as sysdba、sqlplus xx/xx as sysoper、sqlplus / as sysoper等,只要是在本机上使用as sysdba或as sysoper身份且不含TNS的方式登录,都是首先进行OS验证,若不支持OS验证,则进行密码文件验证登录。需要注意的是,命令“sqlplus / as sysdba”永远是以OS验证方式进行登录的。
2.使用Oracle数据库的密码文件进行身份认证,例如:sqlplus lhr/lhr@orcl,只要是使用TNS的方式以sysdba或sysoper身份登录数据库,都是密码文件验证方式。另外,只要是输入了密码,则都有可能是使用密码文件方式进行登录认证,例如:sqlplus sys/lhrsasa as sysdba。
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%\database\PWD%ORACLE_SID%.ora(在Windows中)
Oracle权限认证的基本顺序是这样的,先由SQLNET.AUTHENTICATION_SERVICES的设置值来决定是使用OS认证还是密码文件认证,如果使用密码文件认证的话就要看后面两个条件了:如果REMOTE_LOGIN_PASSWORDFILE参数设置为非NONE而且密码文件存在的话就能正常使用密码文件认证,否则将会失败。
两种认证方式类似于SQL server中的windows认证和SQL server认证
1.1.3.1 SQLNET.AUTHENTICATION_SERVICES参数
在SQLNET.ORA(位于$ORACLE_HOME/NETWORK/ADMIN目录中)文件中,需要修改时直接用文本编辑器打开修改就行了,对于不同的操作系统SQLNET.AUTHENTICATION_SERVICES的取值会有些不一样,通常我们会用到下面的一些设置值:
(1) SQLNET.AUTHENTICATION_SERVICES = (ALL)
对Linux系统,支持OS认证和密码文件认证。
对Windows系统,实际实验是不支持此参数,验证失败。报错:ORA-12641: 验证服务无法初始化(Authentication service failed to initialize)
(2) SQLNET.AUTHENTICATION_SERVICES = (NTS)
此设置值仅用于Windows NT系统,此设置同时支持OS认证和密码文件认证,只有在设置了(NTS)值之后运行在Windows系统上的Oracle才支持OS认证。若Linux系统上设置了此参数,则指定Oracle只使用密码文件认证。
(3) SQLNET.AUTHENTICATION_SERVICES = (NONE)
此设置值在Windows和Linux是作用一样的,指定Oracle只使用密码文件认证。
(4) 不设置此参数或sqlnet.ora文件不存在或SQLNET.AUTHENTICATION_SERVICES =
对Linux系统,默认支持OS认证和密码文件认证。
对Windows系统,默认只支持密码文件认证,不支持OS认证。
一、 SQLNET.AUTHENTICATION_SERVICES参数 实验
一、官方文档说明
作用
Use the parameter SQLNET.AUTHENTICATION_SERVICES to enable one or more authentication services.
If authentication has been installed,
it is recommended that this parameter be set to either none or to one of the authentication methods.
默认值
None
一般可选值
NONE for no authentication methods. A valid username and password can be used to access the database.
ALL for all authentication methods
NTS for Windows NT native authentication(An authentication method that enables
a client single login access to a Windows NT server and a database running on the server)
为了加深对这几个参数的理解,通过实验证明,这几个参数在不同的系统中的作用
二、win系统
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Windows\system32>e:
E:\>cd E:\oracle\11_2_0\NETWORK\ADMIN
#sqlnet.ora文件不存在情况
E:\oracle\11_2_0\NETWORK\ADMIN>dir sqlnet.ora
驱动器 E 中的卷没有标签。
卷的序列号是 38D0-2A35
E:\oracle\11_2_0\NETWORK\ADMIN 的目录
找不到文件
E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:13:57 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.
ERROR:
ORA-01031: 权限不足
请输入用户名:
#NTS情况
E:\oracle\11_2_0\NETWORK\ADMIN>more sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES=(NTS)
E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:16:20 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
#NONE情况
E:\oracle\11_2_0\NETWORK\ADMIN>more sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES=(NONE)
E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:17:18 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.
ERROR:
ORA-01031: 权限不足
请输入用户名:
#ALL情况
E:\oracle\11_2_0\NETWORK\ADMIN>more sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES=(ALL)
E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:18:02 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.
ERROR:
ORA-12641: 验证服务无法初始化
请输入用户名:
三、linux系统
[oracle@report ~]$cd/opt/oracle/product/10.2.0/db_1/network/admin/
#NTS情况
[oracle@report admin]$more sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (NTS)
[oracle@report admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:03:51 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
#NONE情况
[oracle@report admin]$more sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (NONE)
[oracle@report admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:04:31 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
#ALL情况
[oracle@report admin]$more sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (ALL)
[oracle@report admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:05:07 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
#不存在sqlnet.ora文件情况
[oracle@report admin]$ ll sqlnet.ora
ls: sqlnet.ora: No suchfileor directory
[oracle@report admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:05:41 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
四、补充说明
1、在win系统中使用all,提示ORA-12641,不是很清楚原因
2、在nts只有在win系统中有用,linux中无用
3、当不存在sqlnet.ora文件时,linux中可以正常登录,win中不能
1.1.3.2 OS认证实现
Oracle使用操作系统中的两个用户组来控制OS认证,在不同的操作系统中这两个用户组的名称是不一样的,一般来说他们是OSDBA 和 OSOPER,这两个用户组都是在Oracle安装的时候创建的。下面列出不同系统中这两个用户组的名字:
Operating System Group |
UNIX User Group |
UNIX User Group |
OSDBA |
dba |
ORA_DBA |
OSOPER |
oper |
ORA_OPER |
OSDBA用户组的用户可以使用SYSDBA权限登陆数据库,OSOPER用户组的的用户可以使用SYSOPER权限来登陆数据库。使用sqlplus可以用下面方法登陆
CONNECT / AS SYSDBA
CONNECT / AS SYSOPER
拥有OS权限的用户登陆数据库时不再需要输入用户名和密码,因此使用下面的命令也是可以正常登陆的:
CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSDBA
CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSOPER
因此要创建一个新的OS认证帐号步骤是:
1. 建立一个OS用户
2. 将用户加入到OSDBA或是OSOPER用户组
3. 用新增加的用户登陆系统,然后输入sqlplus / AS SYSDBA进行登陆
一、 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
二、设置初始化参数REMOTE_LOGIN_PASSWORDFILE:
在Oracle数据库实例的初始化参数文件中,此参数控制着密码文件的使用及其状态。它可以有以下几个选项:
NONE:指示Oracle系统不使用密码文件,特权用户的登录通过操作系统进行身份验证;
EXCLUSIVE:指示只有一个数据库实例可以使用此密码文件。只有在此设置下的密码文件可以包含有除INTERNAL/SYS以外的用户信息,即答应将系统权限SYSOPER/SYSDBA授予除INTERNAL/SYS以外的其他用户。
SHARED:指示可有多个数据库实例可以使用此密码文件。在此设置下只有INTERNAL/SYS帐号能被密码文件识别,即使文件中存有其他用户的信息,也不答应他们以SYSOPER/SYSDBA的权限登录。此设置为缺省值。
在REMOTE_LOGIN_PASSWORDFILE参数设置为EXCLUSIVE、SHARED情况下,Oracle系统搜索密码文件的次序为:在系统注册库中查找ORA_SID_PWFILE参数值(它为密码文件的全路径名);若未找到,则查找ORA_PWFILE参数值;若仍未找到,则使用缺省值ORACLE_HOME\DATABASE\PWDSID.ORA;其中的SID代表相应的Oracle数据库系统标识符。
1.1.3.3 验证方式演示
1.在sqlnet.ora中追加SQLNET.AUTHENTICATION_SERVICES = none */
[oracle@robinson ~]$ sqlplus / as sysdba /*登陆失败*/
SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:41:28 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
--------------------------------------------------------------------------------
[oracle@robinson ~]$ sqlplus sys/redhat as sysdba /*使用密码文件认证,登陆成功*/
SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:42:35 2010
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, OLAPand Data Mining options
SQL>
--=================================================================================
2.将SQLNET.AUTHENTICATION_SERVICES的值改为all
[oracle@robinson admin]$ sqlplus / as sysdba /*采用本机认证可以登陆*/
SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:46:55 2010
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, OLAPand Data Mining options
SQL>
--------------------------------------------------------------------------------------
[oracle@robinson admin]$ sqlplus sys/redhat@orcl as sysdba /*使用密码文件登陆认证失败*/
SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:48:35 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-12641: Authenticationservice failed to initialize
Enter user-name:
--注:此时可以使用远程登陆。
--使用#符号将新增的SQLNET.AUTHENTICATION_SERVICES行注释掉恢复到缺省值
1.1.4 密码文件的建立
[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.
[oracle@robinson ~]$ orapwd
Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n>
where
file - name of password file (mand), /*密码文件的名字orapw<sid>*/
password - password for SYS (mand), /*sys用户的密码*/
entries - maximum number of distinct DBA and /*可以有多少个sysdba,sysoper权限用户放到密码文件中去,去掉重复记录,注意entries中存放的个数但不是实际个数,这个是二进制数据*/
force - whether to overwrite existingfile (opt),/*10g新增的参数,默认值为n ,y表示允许覆盖*/
OPERs (opt),
There are no spaces around the equal-to(=) character.
注意:使用orapwd重新生成密码文件之后以前保存的授予的其他用户的SYSDBA或是SYSOPER权限将会丢失,需要重新的GRANT。
设定的entries值是不能修改的,如果要修改entries的话需要重新生成密码文件,在生成密码文件之前可以先通过V$PWFILE_USERS视图查询出当前被授予SYSDBA/SYSOPER权限的用户,然后在重新生成密码文件以后重新对这些用户授予SYSDBA/SYSOPER权限
--修改密码:
[oracle@robinson ~]$ cd $ORACLE_HOME/dbs
[oracle@robinson dbs]$ ll orapworcl
-rw-r----- 1 oracle oinstall 1536 Apr 7 15:50 orapworcl
[oracle@robinson dbs]$ orapwd file=orapworcl password=oracle force=y
[oracle@robinson dbs]$ sqlplus sys/oracle@orclas sysdba
SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 11:34:09 2010
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, OLAPand Data Mining options
SQL>
--将密码改回原来的密码
[oracle@robinson dbs]$ orapwd file=orapworcl password=redhat
OPW-00005:File with same name exists - pleasedelete or rename
[oracle@robinson dbs]$ orapwd file=orapworcl password=redhat force=y
[oracle@robinson dbs]$ rm orapworcl /*删除密码文件*/
[oracle@robinson dbs]$ orapwd file=orapworcl password=redhat/*重建密码文件*/
--演示将entries改为,然后将多个用户设置为sysdba或sysoper
[oracle@robinson dbs]$ orapwd file=orapworcl password=redhat entries=1
[oracle@robinson dbs]$ strings orapworcl
]/[Z
ORACLE Remote Password file
INTERNAL
F7AC0C5E9C3C37AB
E100B964899CDDDF
--创建PL/SQL增加个新用户
SQL> begin
2 for iin 1..20 loop
3 execute immediate'create user u'||i||' identified by u'||i||'';
4 end loop;
5 end;
6 /
--将新用户赋予sysdba角色
PL/SQL procedure successfully completed.
SQL> begin
2 for iin 1..20 loop
3 execute immediate'grant sysdba to u'||i||'';
4 end loop;
5 end;
6 /
begin /*得到和密码文件相关的错误提示*/
*
ERROR at line 1:
ORA-01996:GRANT failed: passwordfile '' is full
ORA-06512: at line 3
--再次查看orapworcl发现多出了行,即当设置为的时候多出了个用户。原因是该密码文件是二进制文件,按矩阵计算可存放多少
[oracle@robinson dbs]$ strings orapworcl
]/[Z
ORACLE Remote Password file
INTERNAL
F7AC0C5E9C3C37AB
E100B964899CDDDF
3E81B724A296E296
668509DF9DD36B43
9CE6AF1E3F609FFC
7E19965085C9ED47
--注意不要轻易删掉密码文件,这样会将其他账户的信息也删除
创建Oracle密码文件的命令
orapwd file=<> password=<> entries=最大数目
这里的file命名规则在unix/linux下orapw<ORACLE_SID>,在windows下为 pwd<SID>.ora
具体资料看下面的描述
1. unix 环境:
Administrator's Reference 10g Release 2 (10.2) for UNIX-Based Operating Systems.
1. Log in as the Oracle software owner. (以Oracle管理员身份登入)
2. Use the orapwd utility to create the password file as follows(使用orapwd功能创建密码文件):
$ $ORACLE_HOME/bin/orapwd file=filename password=password entries=max_users
filename The name of the file in which password information is written(filename指密码信息保存文件的文件名)
The name of the file must be orapwsid, and you must supply the full path name. Its contents are encrypted. Typically,the password file is created in the $ORACLE_HOME/dbs directory.(文件名必须为orapwsid,并需要提供完整路径,内容是加密的,通常情况下,密码文件被创建在$ORACLE_HOME/dbs路径下。)
请注意,unix环境中,password file一定是要用 orapw<SID>,没有例外。
2. windows 环境:
Platform. Guide 10g Release 2 (10.2) for Microsoft Windows (32-Bit)
To create and populate a password file:
(1). Create a password file with the Password Utility:
C:> orapwd FILE=pwdsid.ora PASSWORD=password ENTRIES=max_users
where
| FILE specifies the password filename.
| SID identifies the database instance.
| PASSWORD sets the password for account SYS.
| ENTRIES sets maximum number of entries in password file. This corresponds to maximum number of distinct users allowed to connect to the database simultaneously with either the SYSDBA or the SYSOPER DBA privilege.
(2). Set initialization parameter file parameter REMOTE_LOGIN_PASSWORDFILE to exclusive,shared,or none.
In search of the password file,Oracle Database looks in the registry for the value of parameter
ORA_SID_PWFILE. If no value is specified, then it looks in the registry for the
value of parameter ORA_PWFILE, which points to a file containing usernames,
passwords, and privileges. If that is not set, then it uses the default:
ORACLE_BASEORACLE_HOMEDATABASEPWDsid.ORA.
The default value is shared.
请注意,windows环境中,很大的部分是基于registry中变量ora_sid_pwfile 或者 ora_pwfile的设置, 缺省的值是 pwd<SID>.ora (unix中是没有这个.ora后缀的)。
在windows下对于connect /as sysdba及其它用户可以不用密码就能登录的问题
1.这是因为oracle采用了OS认证的方式,具体的可以查看 sqlnet.ora具体同容如下
SQLNET.AUTHENTICATION_SERVICES=(NTS)
将其改成SQLNET.AUTHENTICATION_SERVICES=(NONE)
这样就是oracle认证方式了
2.因为用的OS认证方式,可以在操作系统->控制面版->计算机管理->用户将当前用户的属性组 ORA_DBA去掉,这时如果没有用户名及密码则不可以。
如下:
SQL> connect /as sysdba ERROR:ORA-01031: insufficient privileges
SQL> connect sys/oracle as sysdba
已连接。
利用alter user identified by来修改密码alter user sys identified by abc一下,就连数据库中的密码和密码文件中的密码一起改成abc了;
如果Oracle密码文件丢失了如何办?
利用 orapwd重新创建一个就可以
在Oracle数据库系统中,用户假如要以特权用户身份(INTERNAL/SYSDBA/SYSOPER)登录Oracle数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用Oracle数据库的密码文件进行身份验证。因此,治理好密码文件,对于控制授权用户从远端或本机登录Oracle数据库系统,执行数据库治理工作,具有重要的意义。
Oracle数据库的密码文件存放有超级用户INTERNAL/SYS的密码及其他特权用户的用户名/密码,它一般存放在ORACLE_HOME\DATABASE目录下。
一、密码文件的创建:
在使用Oracle Instance Manager创建一数据库实例的时侯,在ORACLE_HOME\DATABASE目录下还自动创建了一个与之对应的密码文件,文件名为PWDSID.ORA,其中SID代表相应的Oracle数据库系统标识符。此密码文件是进行初始数据库治理工作的基础。在此之后,治理员也可以根据需要,使用工具ORAPWD.EXE手工创建密码文件,命令格式如下:
C:\ >ORAPWD FILE=< FILENAME > PASSWord
=< PASSWORD > ENTRIES=< MAX_USERS >
各命令参数的含义为:
FILENAME:密码文件名;
PASSWORD:设置INTERNAL/SYS帐号的密码;
MAX_USERS:密码文件中可以存放的最大用户数,对应于答应以SYSDBA/SYSOPER权限登录数据库的最大用户数。由于在以后的维护中,若用户数超出了此限制,则需要重建密码文件,所以此参数可以根据需要设置得大一些。
有了密码文件之后,需要设置初始化参数REMOTE_LOGIN_PASSWORDFILE来控制密码文件的使用状态。
1.1.5 导致密码文件内容修改的几种方式
1.使用orapwd建立,修改密码文件,不建议使用
2.使用alter user sys identified by <>
3.使用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@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
SYS@PROD1> ! ls -l /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1
-rw-r----- 1 oracle oinstall 1536 Nov 29 05:36 /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1
SYS@PROD1> alter user sys identified by lhr;
User altered.
SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS';
PASSWORD
------------------------------
B1BDB30F0899B88F
SYS@PROD1> ! ls -l /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1
-rw-r----- 1 oracle oinstall 1536 Nov 29 05:54 /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1
SYS@PROD1> ! strings /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1
]\[Z
ORACLE Remote Password file
INTERNAL
0575A0C032EB97DC
B1BDB30F0899B88F
SYS@PROD1> ! orapwd file=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 password=oracle force=y
SYS@PROD1> ! strings /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1
]\[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
#O!c3
I~&)
8A8F025737A9097A
SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS';
PASSWORD
------------------------------
B1BDB30F0899B88F
可以看到,重建密码文件后,数据库中存储的密码没有改变。
1.1.6 查看密码文件内容
[oracle@robinson dbs]$ strings orapworcl
]/[Z
ORACLE Remote Password file
INTERNAL
F7AC0C5E9C3C37AB
E100B964899CDDDF
--当sys密码不记得可以使用OS系统身份认证登陆到sqlplus,再使用alter user修改密码
SQL> alteruser sys identified by oracle;
User altered
--再次查看密码文件与上一次对比,已经发生变化
SQL> ho strings orapworcl
]/[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
8A8F025737A9097A
--通过授予权限来修改密码,密码文件中多出了scott的信息
SQL> grant sysdbato scott;
Grant succeeded.
SQL> ho strings orapworcl
]/[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
8A8F025737A9097A
SCOTT
F894844C34402B67
--注意此处中登陆后,显示的账户信息还是sys,而不是scott,但此时的scott已经具备了sys权限
[oracle@robinson dbs]$ sqlplus scott/tiger@orclas sysdba
SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 11:56:09 2010
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, OLAPand Data Mining options
SQL> show user
USER is "SYS"
1.1.7 sysdba与sysoper的区别
& 说明:
有关DBA、SYSDBA和SYSOPER三者的区别的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2147919/
SQL> select* from system_privilege_map where name like '%SYS%';
PRIVILEGE NAME PROPERTY
---------- ---------------------------------------- ----------
-3 ALTER SYSTEM 0
-4 AUDIT SYSTEM 0
-83 SYSDBA 0
-84 SYSOPER 0
--下面的链接是两者不同的权限说明
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dba.htm#sthref137
The manner in which you are authorized to use these privileges depends upon the methodof authentication that you use.
When you connect with SYSDBA or SYSOPER privileges, you connectwith a default schema, not with the schema that is generally associatedwith your username.
For SYSDBA this schemais SYS; for SYSOPER the schema is PUBLIC.
--两者的schema不同
SQL> show user
USER is "SYS"
SQL> conn /as sysoper
Connected.
SQL> show user
USER is "PUBLIC"
--查看密码文件视图,可以得到哪些用户为sysdba,哪些用户为sysoper
SQL> select* from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
SCOTT TRUE FALSE
USER1 FALSE TRUE
--下面演示了使用不同的角色来登陆
SQL> conn scott/tiger@orclas sysdba
Connected.
SQL> conn scott/tiger@orclas sysoper /*scott的sysop列为false*/
ERROR:
ORA-01031: insufficient privileges
Warning: You are no longer connected to ORACLE.
SQL> conn user1/user1@orclas sysdba
ERROR:
ORA-01031: insufficient privileges
SQL> conn user1/user1as sysoper
Connected.
1.1.8 其它
常见问题说明
1、如何查找拥有SYSDBA或是SYSOPER权限的用户
使用视图V$PWFILE_USERS,结果集中的SYSDB和SYSOP分别代表是否有SYSDBA和SYSOPER权限。
SQL > select * from v $ pwfile_users ;
/**
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST TRUE FALSE
*/
2、授予权限时出现”ORA-01994: GRANT failed: password file missing or disabled”
出现这种情况是因为没有创建密码文件,或者是密码文件放置的目录不正确,Oracle找不到。只要重建或将密码文件置于$ORACLE_HOME/dbs/目录中就可以了。
3、忘记了SYS帐号的密码怎么办?
如果数据库启用的OS认证登陆,则可以用OS认证登陆数据库,然后使用下面的命令进行修改
alter user SYS identified by pwd ;
如果没有启用OS认证登陆,则需要用orapwd重建密码文件
orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y
其中的password项所指定的就是SYS的密码
1.1.9 OPW-00001: 无法打开密码文件
C:\Documents and Settings\testuser>orapwd file='D:\oracle\ora92\DATABASE\PW
Dtestdb.ORA' password='testdb'
OPW-00001: 无法打开密码文件
去掉单引号,或者修改单引号为双引号:
orapwd file="E:\oracle\ora8i\DATABASE\PWDortest.ORA" password=lhr
本文概述与实验环境
概述:本文只讨论OS认证和口令文件认证方式的配置方法,如何配置以及使用OS认证和口令文件认证方式验证SYSDBA/SYSOPER权限。
实验环境:Oracle 10.1 + Windows 2003 和 Oracle 10.2 + RHEL 4
特殊权限与Oracle登陆认证管理
在开始学Oracle的时候有件事一直让我感觉很奇怪,就是为什么在数据没有起来的时候只要登录到安装Oracle的操作系统中直接用sqlplus / as sysdba就能登陆到数据库中然后对数据库进行启动停止之类的操作。后来看到关于Oracle口令文件相关资料的时候才豁然开朗:数据库认证信息并不一定存在数据库中的,这点和SQL Server很是不一样。
在Oracle中有两类特殊的权限SYSDBA和SYSOPER,当DBA需要对数据库进行维护管理操作的时候必须具有这两类特殊权限之中的一种。在数据库没有打开的时候,使用数据库内建的账号是无法登陆数据库的,但是拥有SYSDBA或是SYSOPER权限的用户是可以登陆的。认证用户是否拥有两类特殊权限的方法有两种:OS认证和口令文件认证。
OS认证和口令文件认证方法
Oracle特殊权限认证方法
(来源:Oracle? Database Administrator’s Guide 10g Release 2)
Oracle数据库究竟使用OS认证还是口令文件认证来进行管理取决于下面三个因素:
- SQLNET.ORA参数文件中的参数SQLNET.AUTHENTICATION_SERVICES设置
- PFILE(SPFILE)参数文件中的参数REMOTE_LOGIN_PASSWORDFILE设置
- 口令文件orapw$SID(Linux) | PWD$SID.ora(Windows)
Oracle权限认证的基本顺序是这样的,先由SQLNET.AUTHENTICATION_SERVICES的设置值来决定是使用OS认证还是口令文件认证,如果使用口令文件认证的话就要看后面两个条件了:如果REMOTE_LOGIN_PASSWORDFILE参数设置为非NONE而且口令文件存在的话就能正常使用口令文件认证,否则将会失败。
SQLNET.AUTHENTICATION_SERVICES参数
在SQLNET.ORA(位于$ORACLE_HOME/NETWORK/ADMIN目录中)文件中,需要修改时直接用文本编辑器打开修改就行了,对于不同的操作系统SQLNET.AUTHENTICATION_SERVICES的取值会有些不一样,通常我们会用到下面的一些设置值:
- SQLNET.AUTHENTICATION_SERVICES = (ALL)
对Linux系统,支持OS认证和口令文件认证。
对Windows系统,实际实验是不支持此参数,验证失败。
- SQLNET.AUTHENTICATION_SERVICES = (NTS)
此设置值仅用于Windows NT系统,此设置同时支持OS认证和口令文件认证,只有在设置了(NTS)值之后运行在Windows系统上的Oracle才支持OS认证。
- SQLNET.AUTHENTICATION_SERVICES = (NONE)
此设置值在Windows和Linux是作用一样的,指定Oracle只使用口令文件认证。
- 不设置此参数或SQLNET.AUTHENTICATION_SERVICES =
对Linux系统,默认支持OS认证和口令文件认证。
对Windows系统,默认只支持口令文件认证,不支持OS认证。
OS认证实现
Oracle使用操作系统中的两个用户组来控制OS认证,在不同的操作系统中这两个用户组的名称是不一样的,一般来说他们是OSDBA 和 OSOPER,这两个用户组都是在Oracle安装的时候创建的。下面列出不同系统中这两个用户组的名字:
Operating System Group |
UNIX User Group |
UNIX User Group |
---|---|---|
OSDBA |
dba |
ORA_DBA |
OSOPER |
oper |
ORA_OPER |
OSDBA用户组的用户可以使用SYSDBA权限登陆数据库,OSOPER用户组的的用户可以使用SYSOPER权限来登陆数据库。使用sqlplus可以用下面方法登陆
CONNECT / AS SYSOPER
拥有OS权限的用户登陆数据库时不再需要输入用户名和密码,因此使用下面的命令也是可以正常登陆的:
CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSOPER
因此要创建一个新的OS认证帐号步骤是:
- 建立一个OS用户
- 将用户加入到OSDBA或是OSOPER用户组
- 用新增加的用户登陆系统,然后输入sqlplus / AS SYSDBA进行登陆
REMOTE_LOGIN_PASSWORDFILE参数
REMOTE_LOGIN_PASSWORDFILE系统参数的设置制定了数据库使用口令文件的方法,此参数可以设置的值有三个:
- REMOTE_LOGIN_PASSWORDFILE = NONE
不使用口令文件
- REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE
使用口令文件,但只有一个数据库实例可用使用
- REMOTE_LOGIN_PASSWORDFILE = SHARED
多个数据库实例共用一个口令文件,这种设置下是不能增加其他数据库用户作为特殊权限用户到口令文件中的。
REMOTE_LOGIN_PASSWORDFILE参数属于初始化参数,只能在init.ora/pfile中指定或是在数据库打开状态下使用下面语句修改,然后重新启动数据库。
要检查当前REMOTE_LOGIN_PASSWORDFILE的设定值在登陆Oracle后输入下面的命令
/** 这是输出结果,看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>
*/
口令文件和口令文件认证
口令文件存放着被授予SYSDBA或SYSOPER权限的用户的用户名和密码。它是一个加密的文件,用户不能修改这个文件,
在Linux系统中口令文件一般保存在$ORACLE_HOME/dbs目录下,文件名为orapw$SID;在Windows系统中口令文件一般保存在$ORACLE_HOME/database目录下,文件名为PWD$SID.ora。
使用口令文件认证的基本步骤是:
- 使用orapwd工具生成口令文件
- 设置REMOTE_LOGIN_PASSWORDFILE为EXCLUSIVE或是SHARED
- 使用SYS登陆数据库,创建新的数据库用户
- 使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限
1、使用orapwd工具生成口令文件
我们可以使用Oracle提供的工具orapwd来创建或者重新初始化一个口令文件:
Usage: orapwd file= password= entries= force=
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权限将会丢失,需要重新的GRANT。
设定的entries值是不能修改的,如果要修改entries的话需要重新生成口令文件,在生成口令文件之前可以先通过V$PWFILE_USERS视图查询出当前被授予SYSDBA/SYSOPER权限的用户,然后在重新生成口令文件以后重新对这些用户授予SYSDBA/SYSOPER权限
2、设置REMOTE_LOGIN_PASSWORDFILE为EXCLUSIVE或是SHARED
3、使用SYS登陆数据库,创建新的数据库用户
4、使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限
每次在Oracle系统里面使用GRANT SYSDBA/SYSOPER授予新用户特殊权限或是ALTER USER命令修改拥有SYSDBA/SYSOPER权限的用户密码的时候,Oracle都会自动的修改口令文件,增加或是修改相应的项目,这样保证在数据没有打开的情况拥有特殊权限的用户能正常的登陆数据库以进行管理操作。
实验
上面长篇大论的说了那么多,下面我们来做实验验证一下。实验都是基于Linux系统来做的,做实验之前先使用下面的命令创建一个口令文件:
1、验证OS认证
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (ALL)或是不设置,REMOTE_LOGIN_PASSWORDFILE = NONE,然后进行下面的操作。
本地使用下面两种方式登陆,都能成功
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>
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>
远程使用口令文件方式登陆,失败
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、两种认证都失效
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (NONE),REMOTE_LOGIN_PASSWORDFILE = NONE,然后进行下面的操作。
本地使用下面两种方式登陆,都失败
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:
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:
远程使用口令文件方式登陆,失败
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、验证口令文件认证
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (NONE)不设置,REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE或SHARED,然后进行下面的操作。
本地使用验证OS认证,失败
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:
本地验证口令文件认证,成功
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>
远程使用口令文件认证,成功
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、两种认证都成功
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (ALL),REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE,然后进行下面的操作。
本地使用验证OS认证,成功
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>
远程使用口令文件认证,成功
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权限授权给其它数据库帐户
先查看口令文件的修改时间
-rw-r----- 1 oracle oinstall 2560 Jun 7 19:04 orapworcl
用SYS登陆数据库,创建新用户test,并赋予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>
User created .
SQL > grant sysdba to test ;
Grant succeeded .
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
再看口令文件,已经修改了
-rw-r----- 1 oracle oinstall 2560 Jun 7 21:42 orapworcl
再用新的test帐号登陆,能成功的登陆
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>
说明:如果要取消SYSDBA权限只需要运行下面的语句就可以了
常见问题说明
1、如何查找拥有SYSDBA或是SYSOPER权限的用户
使用视图V$PWFILE_USERS,结果集中的SYSDB和SYSOP分别代表是否有SYSDBA和SYSOPER权限。
/**
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST TRUE FALSE
*/
2、授予权限时出现”ORA-01994: GRANT failed: password file missing or disabled”
出现这种情况是因为没有创建口令文件,或者是口令文件放置的目录不正确,Oracle找不到。只要重建或将口令文件置于$ORACLE_HOME/dbs/目录中就可以了。
3、忘记了SYS帐号的密码怎么办?
如果数据库启用的OS认证登陆,则可以用OS认证登陆数据库,然后使用下面的命令进行修改
如果没有启用OS认证登陆,则需要用orapwd重建口令文件
其中的password项所指定的就是SYS的密码
参考文档
- Oracle? Database Administrator’s Guide 10g Release 2 (10.2)
- 小议SQLNET.AUTHENTICATION_SERVICES by space6212
- Oracle中password file的作用及说明 by eygle
谢谢作者: ITPUB warehouse
http://www.itpub.net/viewthread.php?tid=906008&extra=&page=1
1、os认证
oracle安装之后默认情况下是启用了os认证的,这里提到的os认证是指服务器端os认证。os认证的意思把登录数据库的用户和口令校验放在了操作系统一级。如果以安装oracle时的用户登录os,那么此时在登录oracle数据库时不需要任何验证,如:
SQL> connect /as sysdba
已连接。
SQL> connect sys/aaa@dmt as sysdba
已连接。
SQL> connect sys/bbb as sysdba
已连接。
SQL> connect aaa/bbb as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL>
不论输入什么用户(哪怕这个用户如aaa在数据库中根本不存在),只要以sysdba权限连接数据库,都可以连接上,并且连接用户是sys,这样很方便, 有时候,如果忘记了数据库的密码,而又想登录数据库,可以通过这种方式,前提是在数据库服务器上;但是方便的同时也带来了一些安全隐患,于是很多人想屏蔽 os认证,在win下只要把oracle_home/NETWORK/admin/sqlnet.ora中的 SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者注释掉这句话(在前面加上#),就可以屏蔽os功能,要想以sys用户连上数据库必须输入正确的sys口令,如:
SQL> connect /as sysdba
ERROR:
ORA-01031: 权限不足
SQL> connect sys/aaa as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
SQL> connect aaa/bbb as sysdba
ERROR:
ORA-01031: 权限不足
SQL> connect sys/system as sysdba
已连接。
SQL>
或者可以把oracle的安装用户从组ora_dba中删除掉,当然也可以直接把ora_dba这个组也删除,都可以屏蔽os功能。在 unix/linux下也可以在文件sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及删除 dba(groupdel dba)组或者把oracle用户从dba组中删除都可以屏蔽os认证。利用这两种方法屏蔽os功能似乎总有些让人不放心,或者说不能让人完全信服,因为 毕竟系统管理员还是可以创建ora_dba or dba组以及修改sqlnet.ora文件,如何彻底屏蔽os功能?让它"永世不得翻身"呢?我没有这方面的经验, 大家可以补充!
2、口令文件
oracle的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使 用口令文件,否则不能连上,由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件,因此我认为在数据库中存放sys用户的口令其实没有任何意义!使用口令文件的好 处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。开始安装完oracle,没有给普通用户授予sysdba权限,口令文件中只 存放了sys的口令,如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,当然这时必须要求数据库 处于open状态。如:
SQL> grant sysdba to test;
授权成功。
SQL> connect test/aaa@orcl as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
警告: 您不再连接到 ORACLE。
SQL> connect test/test@orcl as sysdba
已连接。
SQL> alter database close;
数据库已更改。
SQL> grant sysdba, sysoper to test;
grant sysdba, sysoper to test
*
第 1 行出现错误:
ORA-01109: 数据库未打开
到底有几个用户被授予了sysdba或者sysoper权限,可以通过查询如下v$pwfile_users获得,v$pwfile_users的信息就 是源于口令文件的(This view lists users who have been granted SYSDBA and SYSOPER privileges as derived from the password file.)
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST TRUE FALSE
到底可以有几个用户被授予sysdba或者sysoper权限,是由创建口令文件时指定的entries数决定的,准确的说还不完全是,最终还和os block的大小有关,如果entries指定了5,一个os block可以存放8个用户的口令,那么可以由8个用户被授予sysdba或者sysoper。
下面看一个简单的测试:
SQL> declare
2 v_string varchar2(100);
3 begin
4 for i in 1..100 loop
5 v_string := 'create user test'||i||' identified by test'||i;
6 execute immediate v_string ;
7 end loop;
8 end;
9 /
PL/SQL 过程已成功完成。
SQL> select count(*) from dba_users where username like '%TEST%';
COUNT(*)
----------
101
这里之所以是101,是因为之前已经创建过test用户
SQL> declare
2 v_string varchar2(100);
3 begin
4 for i in 1..100 loop
5 v_string := 'grant sysdba to test'||i;
6 execute immediate v_string ;
7 end loop ;
8 end ;
9 /
declare
*
第 1 行出现错误:
ORA-01996: GRANT 失败: 口令文件 '' 已满
ORA-06512: 在 line 6
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST1 TRUE FALSE
TEST2 TRUE FALSE
TEST3 TRUE FALSE
TEST4 TRUE FALSE
TEST5 TRUE FALSE
TEST6 TRUE FALSE
TEST7 TRUE FALSE
TEST8 TRUE FALSE
已选择9行。
SQL>
可以清楚的看到v$pwfile_users里面并不是创建口令文件时指定的entries=5而是9条记录,意味着9个用户的口令占用了一个os block,其实也可能是多个os block,总之这些block都是满的,但是观察口令文件,还是占了2k,这是我解释不清的地方。通过os命令发现;每个簇字节数4096;这里其实就 是os block 大小实际上是4k,但是口令文件占用了2k,根本没有用满一个os block,不知道何故,也是我的疑惑 (
This parameter specifies the number of entries that you require the password file to accept. This number corresponds to the number of distinct users allowed to connect to the database as SYSDBA or SYSOPER. The actual number of allowable entries can be higher than the number of users, because the ORAPWD utility continues to assign password entries until an operating system block is filled. For example, if your operating system block size is 512 bytes, it holds four password entries. The number of password entries allocated is always a multiple of four.
)
win下查看os block大小
C:\WINDOWS\system32>fsutil fsinfo ntfsinfo e:
NTFS 卷序列号 : 0x12afb454f6e54b31
版本 : 3.1
区数量 : 0x00000000040270d0
簇总数 : 0x0000000000804e1a
可用簇 : 0x00000000000b8d41
保留总数 : 0x0000000000000000
每个扇区字节数 : 512
每个簇字节数 : 4096
每个 FileRecord 段的字节数 : 1024
每个 FileRecord 段的簇数 : 0
Mft 有效数据长度 : 0x00000000058d0000
Mft 起始 Lcn : 0x0000000000000004
Mft2 起始 Lcn : 0x0000000000080000
Mft 区域起始 : 0x0000000000483740
Mft 区域结尾 : 0x000000000049c760
C:WINDOWS\system32>
还有一个问题修改了口令,口令长度增加了,按说占用的空间多了,但是查询v$pwfile_users发现还是9条记录?不过这个问题突然想到了答案,那 就是不论我们的口令多长,加密之后的长度几乎都是相同的,也就是说口令文件占用的大小和口令指定的长度几乎关系不大!
SQL> edit
已写入 file afiedt.buf
1 declare
2 v_string varchar2(100);
3 begin
4 for i in 1..100 loop
5 v_string := 'alter user test'||i||' identified by aaaaaaaaaaaaaaaaaaaaaa'||i;
6 execute immediate v_string ;
7 end loop ;
8* end ;
SQL> /
PL/SQL 过程已成功完成。
SQL> declare
2 v_string varchar2(100);
3 begin
4 for i in 1..100 loop
5 v_string := 'grant sysdba to test'||i;
6 execute immediate v_string ;
7 end loop ;
8 end ;
9 /
declare
*
第 1 行出现错误:
ORA-01996: GRANT 失败: 口令文件 '' 已满
ORA-06512: 在 line 6
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST1 TRUE FALSE
TEST2 TRUE FALSE
TEST3 TRUE FALSE
TEST4 TRUE FALSE
TEST5 TRUE FALSE
TEST6 TRUE FALSE
TEST7 TRUE FALSE
TEST8 TRUE FALSE
已选择9行。
SQL>
E:\oracle\product\10.2.0\db_1\data\base>orapwd file=E:\oracle\product\10.2.0\db_1
databasepwd.ora password=system entries=5
OPW-00005: 存在相同名称的文件 - 请删除或重命名
E:\oracle\product\10.2.0\db_1\data\base>orapwd file=E:oracleproduct10.2.0db_1
databasepwd.ora password=system entries=5 force=y
创建口令文件需要注意的是=前后没有空格!另外值得一提的是10g增加了一个新的参数force default值n,它的作用类似于创建表空间时的reuse功能,当同名文件存在时是否覆盖。
是否使用口令文件,是通过oracle提供的一个参数remote_login_passwordfile来控制的, remote_login_passwordfile有none,shared,exclusive3个值,none表示不使用口令文件, exclusive表示实例独占使用口令文件,也就是各自实例使用单独的口令文件,shared表示多个实例共享一个口令文件,缺省情况下,win下口令 文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感),unix下寻找口令文件的顺序是oracle_home\dbs \orapwSID,如果找不到,会在dbs目录想寻找orapw文件,如果找不到9i下会报错,数据库可以启动到mount状态,当然再次alter database open之后还是可以打开数据库。10g下open数据库时不在检查口令文件。win下如果在oracle_home/database/下找不到 pwdsid.ora文件,不会寻找任何文件。这里所说的win下如果找不到PWDsid.ora文件之后不会寻找任何文件其实是相对unix下如果找不 到orapwSID文件之后会寻找orapw文件而言的。其实win下寻找口令文件也是有顺序的。寻找顺序是这样的:首先寻找注册表中 ora_sid_pwfile环境变量所指向的口令文件,其次寻找ora_pwfile执行的口令文件,最后才寻找$ ORACLE_HOME/database/PWDsid.ora,下面做一个简单的测试:
开始存在一个口令文件PWDtsid.ora,之后又创建了两个口令文件pwd.ora和orapwd.ora
C:>orapwd file=E:\oracle\product\10.2.0\db_1\databasepwd.ora password=manager entries=5 force=y
C:>orapwd file=E:\oracle\product\10.2.0\db_1\databaseorapwd.ora password=manager_system entries=5
C:>e:
E:>cd E:\oracle\product\10.2.0\db_1\database
E:\oracle\product\10.2.0\db_1\database>dir *pwd*
驱动器 E 中的卷没有标签。
卷的序列号是 F6E5-4B31
E:\oracle\product\10.2.0\db_1\database 的目录
2007-12-07 21:30 2,048 orapwd.ora
2007-12-07 21:29 2,048 pwd.ora
2007-12-06 21:44 2,048 PWDtsid.ora
3个口令文件的口令分别是system, manager, system_manager没有什么特别的意义,都是随意指定的,其中在注册表中ora_tsid_pwfile指向了文件E:\oracle\ product\10.2.0\db_1\databasepwd.ora,ora_pwfile指向了E:\oracle\product \10.2.0\db_1\databaseorapwd.ora,然后通过远程client端进行测试:
SQL> connect sys/system@testdb as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
警告: 您不再连接到 ORACLE。
SQL> connect sys/manager@testdb as sysdba
已连接。
SQL> connect sys/manager_system@testdb as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
警告: 您不再连接到 ORACLE。
SQL>
测试结果显示要求输入的口令是manager,而manager对应的口令文件是环境变量ora_tsid_pwfile所指向的pwd.ora,之后删除环境变量ora_tsid_pwfile再次连接:
SQL> connect sys/system@testdb as sysdba
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
警告: 您不再连接到 ORACLE。
SQL> connect sys/manager_system@testdb as sysdba
已连接。
SQL>
这次要求输入的口令是manager_system,而manager_system对应的口令文件是环境变量ora_pwfile所指向的orapwd.ora,之后删除环境变量ora_pwfile进行连接测试:
SQL> connect sys/system@testdb as sysdba
已连接。
SQL>
连接成功,system对应的口令文件正是$ORACLE_HOME/database/PWDtsid.ora
接着上面介绍共享口令文件,由于在unix下会寻找orapw文件(该文件不含sid的信息),因此各个实例可以shared口令文件,前提是需要把参数 remote_login_passwordfile设置为shared,该参数是静态参数,修改之后需要重启实例,当然也可以通过连接的方式(unix 下ls)实现口令文件共享,不过没感觉到共享口令文件有什么好处;win下可以通过在注册表中指定环境变量ora_sid_pwfile或者 ora_pwfile来改变口令文件的位置和名称,从而也可以实现口令文件共享。
共享口令文件会有很多问题:
首先要求所有的sys口令相同,其次orcl库上的用户xys被授予了sysdba,结果在test1库上通过v$pwfile_users也可以看到xys用户。
SQL> connect sys/system as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> connect sys/manager as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 62915940 bytes
Database Buffers 100663296 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter user sys identified by system;
用户已更改。
SQL> show user
USER 为 SYS;
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string test1
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
XYS TRUE FALSE
SQL> select username from dba_users;
USERNAME
------------------------------
OUTLN
SYS
SYSTEM
TEST
DBSNMP
TSMSYS
DIP
已选择7行。
从上面查询结果看到数据库orcl和test1,准确的说是实例共享了口令文件之后,test1中根本不存在用户xys,但是通过v$pwfile_users还是查询出来了
还有一个问题是如果remote_login_passwordfile=shared则sys的口令通过
alter user...不能修改!
SQL> show parameter remote_log
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string SHARED
SQL> alter user sys identified by manager;
alter user sys identified by manager
*
第 1 行出现错误:
ORA-28046: 不允许更改 SYS 口令
提到alter user...这个系统权限,我觉得oracle做的不是很安全,只要有了alter user权限,sys用户的口令可以随意修改
,另外凡是修改具有sysdba or sysoper权限的用户,如果通过alter user来修改口令,那么同时修改了口令文件和数据库中的口令。
简单的测试如下:
SQL> create user test11 identified by test11;
用户已创建。
SQL> grant connect , alter user to test11;
授权成功。
SQL> connect test11/test11
已连接。
SQL> CONNECT / as sysdba
已连接。
SQL> grant select on dba_users to test11;
授权成功。
SQL> connect test11/test11
已连接。
SQL> col username format a10
SQL> col password format a30
SQL> select password , username from dba_users where username ='SYS';
PASSWORD USERNAME
------------------------------ ----------
75800913E1B66343 SYS
SQL> show user
USER 为 TEST11;
SQL> alter user sys identified by manager;
用户已更改。
SQL> select password , username from dba_users where username ='SYS';
PASSWORD USERNAME
------------------------------ ----------
5638228DAF52805F SYS
SQL>
remote_login_passwordfile=shared时,也不能把sysdba or sysoper授予普通用户!
SQL> grant sysdba to test;
grant sysdba to test
*
第 1 行出现错误:
ORA-01999: 口令文件不能在 SHARED 模式下更新
SQL> grant sysoper to test;
grant sysoper to test
*
第 1 行出现错误:
ORA-01999: 口令文件不能在 SHARED 模式下更新
通过上面两部分内容的解释,了解了os认证和口令文件之后,如果为了安全不想让用户以sysdba or sysoper权限连接数据库,可以通过上面的方法屏蔽os认证的同时静止使用口令文件。
3、sysdba 和 sysoper
很多人可能不了解sysdba and sysoper到底是什么,其实他们是oracle的system privilege,通过查询系统权限表system_privilege_map可以清楚的知道:
SQL> select name from system_privilege_map where name like 'SYS%';
NAME
----------------------------------------------------------------------------
SYSOPER
SYSDBA
只不过这两个权限就是以这种方式发挥作用的!
两种权限的比较在oracle doc上给出了明确的交代:
The following operations are authorized by the SYSDBA and SYSOPER system privileges:
System Privilege Operations Authorized
SYSDBA Perform. STARTUP and SHUTDOWN operations
ALTER DATABASE: open, mount, back up, or change character set
CREATE DATABASE
DROP DATABASE
CREATE SPFILE
ALTER DATABASE ARCHIVELOG
ALTER DATABASE RECOVER
Includes the RESTRICTED SESSION privilege
Effectively, this system privilege allows a user to connect as user SYS.
SYSOPER Perform. STARTUP and SHUTDOWN operations
CREATE SPFILE
ALTER DATABASE OPEN/MOUNT/BACKUP
ALTER DATABASE ARCHIVELOG
ALTER DATABASE RECOVER (Complete recovery only. Any form. of incomplete recovery, such as UNTIL TIME|CHANGE|CANCEL|CONTROLFILE requires connecting as SYSDBA.)
Includes the RESTRICTED SESSION privilege
This privilege allows a user to perform. basic operational tasks, but without the ability to look at user data.
值的一提的是win下尤其是home版的xp控制面板中没有组的可操作界面,而oracle默认安装之后也没有为我们创建ora_oper 这个组,因此在以sysoper权限连接数据库时提示没有权限:
SQL> connect / as sysoper
ERROR:
ORA-01031: 权限不足
为了能够以sysoper方式连接数据库,于是可以通过dos命令方式创建ora_oper组,同时把os用户加入到这个组中:
E:>net localgroup ora_oper /add
命令成功完成。
E:>net localgroup ora_oper wch /add
命令成功完成。
有关localgroup的详细说明可以通过命令net help localgroup获得更多的帮助,注意和group的区别,group用在domain中
再次尝试接连,连接成功:
SQL> connect / as sysoper
已连接。
SQL> show user
USER 为 PUBLIC;
SQL>
但是需要注意的是以sysoper权限连接数据库时显示的schema是public,而以sysdba连接时显示的schema是我们众所周知的sys,这也是sysdba和sysoper的区别之一。
同时需要注意的是在linux下默认是可以以sysoper 连接数据库的:
[oracle@xys oracle]$ sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on Fri Dec 7 23:52:49 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> connect / as sysoper
Connected to an idle instance.
SQL> create user wch identified externally;
用户已创建。
SQL> grant create session to wch;
授权成功。
SQL> show parameter auth
NAME TYPE VALUE
------------------------------------ ----------- -------------------------
os_authent_prefix string OPS$
remote_os_authent boolean FALSE
SQL> col username format a10
SQL> col password format a30
SQL> select username , password from dba_users where username='WCH';
USERNAME PASSWORD
---------- ------------------------------
WCH EXTERNAL
SQL> connect /
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
警告: 您不再连接到 ORACLE。
SQL>
使用普通用户os认证的好处是可以在执行一些批处理脚本时屏蔽数据库连接用户的口令,如exp ,expdp . sqlldr等