OS认证
所谓操作系统,就是当用户以dba组的身份登录数据库主机时,直接connect / as sysdba即可以sys用户登录数据库,而不需要密码,曾经有朋友觉得这样操作很危险,因为不需要密码即可以最大权限登录到数据库。其实不然,Oracle认为,数据库仅仅是操作系统的应用程序,都已经能成功登录到操作系统了,那自然该用户是安全的。
SQLNET.AUTHENTICATION_SERVICES
影响操作系统认证的参数为$ORACLE_HOME/network/admin/sqlnet.ora文件中的SQLNET.AUTHENTICATION_SERVICES该参数有三个值如下:
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
由于测试过程比较简单,这边不再演示,提供如下地址供读者参考,有兴趣的读者可以自行进行测试
http://hi.baidu.com/%EE%D1%D7%D300544/blog/item/a546e0ee1c4eb4ecb3fb9569.html
关于SQLNET.AUTHENTICATION_SERVICES的结论如下
1、在windows下,SQLNET.AUTHENTICATION_SERVICES必须设置为NTS或者ALL才能使用OS认证;不设置或者设置为其他任何值都不能使用OS认证。
2、在linux下,在SQLNET.AUTHENTICATION_SERVICES的值设置为ALL或者BEQ,或者不设置的情况下,OS验证才能成功;设置为其他任何值都不能使用OS认证。
关于linux和windows下os验证方式的不同oracle有如下解释
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.
An authentication method that enables a client single login access to a Windows NT server and a database running on the server.
从oracle的解释可以知道,SQLNET.AUTHENTICATION_SERVICES=(NTS)是WINDOWS系统专用的,对linux/UNIX是不适用的。个人猜测NTS应该指NT Server.
sqlnet.ora的其他相关参数
NAMES.DEFAULT_DOMAIN参数
在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/[email protected] ,然后再到tnsnames.ora文件中找test.server.com网络服务名,这当然找不到了,因为该文件中只有test网络服务名,所以报错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找 test网络服务名,然后取出其中的host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。
在windows平台上安装数据库时,常常会根据登陆的域名自动将sqlnet.ora文件中的names.default_domain参数设置为域名。
name.directory_path参数
客户端的sqlnet.ora 有一个功能,说明连接的字符串是基于主机命名还是本地命名方法,就是使用这个参数。
设置IP保护
如果要在网络上做一些IP地址的限制,一般情况下我们首先想到的是用网络层的防火墙软件。要找网管来设置。但是如果网管不在,或者仅仅想在数据库层来实现IP地址的限制,DBA们只要修改Server端的一个网络配置文件sqlnet.ora文件就可以了。
tcp.validnode_checking=yes
#允许访问的ip
tcp.invited_nodes =(ip1,ip2,……)
#不允许访问的ip
tcp.excluded_nodes=(ip1,ip2,……)
修改sqlnet.ora后,重新启动listener服务,改动就可以生效了。
如果我们从未允许的IP客户端连接过来,会出现以下错误:
ERROR: ORA-12537: TNS: 连接已关闭
这种在Oracle网络层实现客户端IP访问限制的方法在防火墙后面的公司内部网或者托管机房的内部网里可以采用。
SQLNET.INBOUND_CONNECT_TIMEOUT 参数
SQLNET.INBOUND_CONNECT_TIMEOUT is set to a value in seconds and
determines how long a client has to provide the necessary authentication information to a database.
即表示客户端向数据库提交提供必要的认证信息的超时时间限制,这个参数常常和ORA-3136错误有关。
WARNING: inbound connection timed out (ORA-3136)
密码文件认证
密码文件是指,如果我们在远程的客户机上,通过Oracle的网络服务,试图登录数据库实例。那么对于Oracle数据库来说,试图登录的用户只是知道数据库服务器的地市,并不知道数据库所在服务器上操作系统的用户名和密码,因此需提供sys密码。我们知道普通用户的密码存在数据字典中,而sys用户由于需要进行启动数据库的操作,不能将密码仅仅存放在数据字典中,Oracle需要其他认证方式使得sys用户在数据库未打开情况下连接到数据库。因此,当采用密码文件认证方式时。
需要注意Windows平台和Linux/UNIX平台密钥文件的命名规则并不相同:
Windows平台命名规则:PWD[sid].ora
Linux/UNIX平台命令规则:orapw[sid]
注意这里的密码文件要严格遵循大小写。
我们创建密码文件的命令为,ORACLE_SID=ora10g
$ cd $ORACLE_HOME/dbs
$ echo $ORACLE_SID
czmmiao
$ orapwd file=orapwczmmiao password=ora123 entries=5;
其中,entries表示有几个不同的Oracle用户用于sysdba权限,同时他们的密码都放在密码文件中里。
remote_login_passwordfile
remote_login_passwordfile这个参数控制能否使用密码文件,该参数有如下值:
none:oracle会忽略任何密码文件,此时有权限的用户(比如sys)必须使用操作系统认证。
shared:该密码文件可以被多个实例共享(用于RAC),这时密码文件中只能包含sys和system用户,不能添加其他用户的密码。
结论1、无论使用orapwd命令还是alter命令都会同时修改数据字典和密码文件中的密码,两个密码均可以作为sys用户的密码来使用。
exclusive:默认值,只有一个数据库实例可以使用此文件。可以向密码文件添加新用户。
下面我们来做具体测试,测试平台为rhel 5.4
首先先禁用操作系统认证。
$ grep -v "#" sqlnet.ora |grep -v ^$|grep -v ^" "
SQLNET.AUTHENTICATION_SERVICES=(NTS)
步骤1利用orapwd命令更改密码文件中的密码
SQL> alter user sys identified by ora123;
User altered.
$ orapwd file=orapwczmmiao.ora password=ora456 entries=5
SQL> conn sys/ora123 as sysdba;
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> conn sys/ora456 as sysdba;
Connected.
步骤2利用alter命令更改数据字典中sys用户的密码
$ orapwd file=orapwczmmiao.ora password=ora456 entries=5
[oracle@dg1 dbs]$ strings orapwczmmiao
]\[Z
ORACLE Remote Password file
INTERNAL
820879DB2FB6DA8B
6A8FB417FCC9E1E2
SQL> alter user sys identified by ora123;
User altered.
SQL> conn sys/ora456 as sysdba;
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> conn sys/ora123 as sysdba;
Connected.
[oracle@dg1 dbs]$ strings orapwczmmiao
]\[Z
ORACLE Remote Password file
INTERNAL
39D45C9706D01A22
17C6C339B77AC938
结论2、当remote_login_passwordfile为exclusive时,允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;允许授予和回收SYSDBA或SYSOPER权限。
REMOTE_LOGIN_PASSWORDFILE参数的默认值是EXCLUSIVE
sys@ora10g> show parameter REMOTE_LOGIN_PASSWORDFILE
NAME TYPE VALUE
-------------------------- ---------- ----------------------
remote_login_passwordfile string EXCLUSIVE
尝试将SYSDBA特权授予给普通用户secooler
sys@ora10g> grant sysdba to secooler;
Grant succeeded.
5)密码文件的变化
此时在密码文件中记录了这个授权的信息。
strings orapwczmmiao
]\[Z
ORACLE Remote Password file
INTERNAL
39D45C9706D01A22
17C6C339B77AC938
SECOOLER
034E4342BB2D437D
最后两行信息即是新增的内容。
客户端连接性测试
SQL>conn secooler/secooler as sysdba
SQL> show user;
USER 为 "SYS"
注意,此处我们虽然使用的是普通用户secooler登录的数据库,但真实的用户名是SYS。因此我们便可以使用这种方法来管理数据库,这就是便捷所在。
人为移除密码文件测试,如果此时我们将密码文件删除,客户端将没有办法再以sysdba权限连接到数据库
$ sqlplus secooler/secooler@ora10g as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on 星期二 12月 21 21:53:50 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-01031: insufficient privileges
请输入用户名:
因此,通过REMOTE_LOGIN_PASSWORDFILE参数和密码文件共同实现了客户端已SYSDBA权限登录系统的目的。
结论3、当REMOTE_LOGIN_PASSWORDFILE参数为NONE时,禁止授予和回收SYSDBA或SYSOPER权限。
调整参数REMOTE_LOGIN_PASSWORDFILE为NONE
sys@ora10g> alter system set remote_login_passwordfile=none scope=spfile;
System altered.
sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ora10g> startup;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 125830056 bytes
Database Buffers 75497472 bytes
Redo Buffers 6316032 bytes
Database mounted.
Database opened.
sys@ora10g> show parameter REMOTE_LOGIN_PASSWORDFILE
NAME TYPE VALUE
-------------------------- ---------- ----------------------
remote_login_passwordfile string NONE
授权测试
sys@ora10g> grant sysdba to secooler;
grant sysdba to secooler
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled
注意,此处的报错原因是不是因为密码文件不存在,与前面曾经提到的报错信息有区别。
回收测试
sys@ora10g> revoke sysdba from secooler;
Revoke succeeded.
此处虽然提示权限回收成功,但是实际上并没有生效,是无效操作。证明之。在此基础上调整参数为EXCLUSIVE
sys@ora10g> alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;
System altered.
sys@ora10g> startup force;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 130024360 bytes
Database Buffers 71303168 bytes
Redo Buffers 6316032 bytes
Database mounted.
Database opened.
此时客户端依然能够成功登陆
$ sqlplus secooler/[email protected] as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on 星期二 12月 21 22:06:05 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
因此证明了当REMOTE_LOGIN_PASSWORDFILE参数为NONE时回收SYSDBA权限是无效的。
结论4、REMOTE_LOGIN_PASSWORDFILE参数SHARED时,允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;禁止授予和回收SYSDBA或SYSOPER权限。
调整参数REMOTE_LOGIN_PASSWORDFILE为SHARED
sys@ora10g> alter system set remote_login_passwordfile=shared scope=spfile;
System altered.
sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ora10g> startup;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 125830056 bytes
Database Buffers 75497472 bytes
Redo Buffers 6316032 bytes
Database mounted.
Database opened.
sys@ora10g> show parameter REMOTE_LOGIN_PASSWORDFILE
NAME TYPE VALUE
-------------------------- ---------- ----------------------
remote_login_passwordfile string SHARED
此时客户端的连接是不受限制的,连接通畅
$ sqlplus secooler/secooler@ora10g as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on 星期二 12月 21 22:08:04 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
此时服务器端授予和回收SYSDBA权限是不被允许的
sys@ora10g> grant sysdba to secooler;
grant sysdba to secooler
*
ERROR at line 1:
ORA-01999: password file cannot be updated in SHARED mode
sys@ora10g> revoke sysdba from secooler;
revoke sysdba from secooler
*
ERROR at line 1:
ORA-01999: password file cannot be updated in SHARED mode
结论5、当密码认证文件重建时将会清楚除sys用户以外的所有其他用户的密码,导致其他用户无法以sysdba身份登录
重建前
strings orapwczmmiao
]\[Z
ORACLE Remote Password file
INTERNAL
39D45C9706D01A22
17C6C339B77AC938
SECOOLER
034E4342BB2D437D
重建后
$ orapwd file=orapwczmmiao password=ora123 force=y
$ strings orapwczmmiao
]\[Z
ORACLE Remote Password file
INTERNAL
820879DB2FB6DA8B
6A8FB417FCC9E1E2
hr用户以sysdba身份进行连接失败
SQL> conn hr/hr as sysdba;
ERROR:
ORA-01031: insufficient privileges
Warning: You are no longer connected to ORACLE
参考至:《教你成为10g OCP》韩思捷著
http://www.linuxdiyf.com/viewarticle.php?id=85888
http://blog.itpub.net/post/42643/514048
http://hi.baidu.com/%EE%D1%D7%D300544/blog/item/a546e0ee1c4eb4ecb3fb9569.html
http://hi.baidu.com/oraix/blog/item/448c91e79b9bf52ab93820d4.html
http://space.itpub.net/?uid-519536-action-viewspace-itemid-682282
http://www.linuxidc.com/Linux/2011-09/42721.htm
本文原创,转载请注明出处、作者
如有错误,欢迎指正