特殊权限与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 SYSDBA
CONNECT / AS SYSOPER
拥有OS权限的用户登陆数据库时不再需要输入用户名和密码,因此使用下面的命令也是可以正常登陆的:
CONNECT ANY_USER_NAME/ANY_PASSWORD AS SYSDBA
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中指定或是在数据库打开状态下使用下面语句修改,然后重新启动数据库。
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
要检查当前REMOTE_LOGIN_PASSWORDFILE的设定值在登陆Oracle后输入下面的命令
SQL> show parameter remote
/** 这是输出结果,看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来创建或者重新初始化一个口令文件:
[oracle@RHEL4 dbs]$ 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
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
3、使用SYS登陆数据库,创建新的数据库用户
CREATE USER test IDENTIFIED BY test;
4、使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限
每次在Oracle系统里面使用GRANT SYSDBA/SYSOPER授予新用户特殊权限或是ALTER USER命令修改拥有SYSDBA/SYSOPER权限的用户密码的时候,Oracle都会自动的修改口令文件,增加或是修改相应的项目,这样保证在数据没有打开的情况拥有特殊权限的用户能正常的登陆数据库以进行管理操作。
实验
上面长篇大论的说了那么多,下面我们来做实验验证一下。实验都是基于Linux系统来做的,做实验之前先使用下面的命令创建一个口令文件:
[oracle@RHEL4 ~]$ orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y
1、验证OS认证
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (ALL)或是不设置,REMOTE_LOGIN_PASSWORDFILE = NONE,然后进行下面的操作。
本地使用下面两种方式登陆,都能成功
[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>
远程使用口令文件方式登陆,失败
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、两种认证都失效
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (NONE),REMOTE_LOGIN_PASSWORDFILE = NONE,然后进行下面的操作。
本地使用下面两种方式登陆,都失败
[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:
远程使用口令文件方式登陆,失败
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、验证口令文件认证
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (NONE)不设置,REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE或SHARED,然后进行下面的操作。
本地使用验证OS认证,失败
[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:
本地验证口令文件认证,成功
[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>
远程使用口令文件认证,成功
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、两种认证都成功
设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (ALL),REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE,然后进行下面的操作。
本地使用验证OS认证,成功
[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>
远程使用口令文件认证,成功
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权限授权给其它数据库帐户
先查看口令文件的修改时间
[oracle@RHEL4 dbs]$ ll orapworcl
-rw-r----- 1 oracle oinstall 2560 Jun 7 19:04 orapworcl
用SYS登陆数据库,创建新用户test,并赋予SYSDBA权限
[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
再看口令文件,已经修改了
[oracle@RHEL4 dbs]$ ll orapworcl
-rw-r----- 1 oracle oinstall 2560 Jun 7 21:42 orapworcl
再用新的test帐号登陆,能成功的登陆
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>
说明:如果要取消SYSDBA权限只需要运行下面的语句就可以了
SQL> revoke sysdba from test;
常见问题说明
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
来至: