2、服务器端OS验证配置
Oracle的OS层面验证,最直接的关联参数就是os_authent_prefix,默认取值为ops$。这种技术是很简单的,是建立在操作系统用户名与数据库用户名之间的映射规则上。
Oracle规定,如果尝试连接数据库的操作系统用户名添加参数os_authent_prefix作为前缀之后,与数据库某一个特定用户名schema相同,那么就可以实现OS验证配置。注意:这个规则是在服务器端成立的。比如:如果当前连接的操作系统名为oracle,os_authent_prefix为ops$,如果此时数据库中包括一个为ops$oracle的用户,是可以在服务器端进行匿名登录的。
下面进行测试,当前Linux服务器端OS用户名为oracle,也是oinstall和dba组成员。
[oracle@localhost ~]$ id
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba),502(oper) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
创建用户ops$oracle,授予一定权限。
SQL> create user ops$oracle identified by oracle;
User created.
SQL> grant connect, resource to ops$oracle;
Grant succeeded.
这样conn /后不带as sysdba登录就允许通过了。
SQL> conn /
Connected.
SQL> show user
USER is "OPS$ORACLE"
如果添加了as sysdba,匿名管理员登录同样成立。
SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"
这个规则在服务器端还是问题不大,在现实环境中实际意义也不是很大。但是,这个特性势必会引起一个想法:匿名远程登录是否可以实现?
3、匿名OS验证远程登录
在之前笔者的文章中,我们讨论过什么是“远程登录”。结论是:对Oracle而言,只要通过监听器程序的过程,Oracle都会将其作为远程登录。而不是去探究登录动作是不是服务器端发生。要经过监听器程序,最直接的就是登录中加入@地址标记符。
我们首先在服务器端进行试验,其上已经有sicspcdb的本地连接命名。
[oracle@localhost ~]$ tnsping sicspcdb
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 14-JUL-2014 17:47:08
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = sicspcdb)))
OK (0 msec)
测试服务器端OS匿名验证。
SQL> conn /@sicspcdb
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> conn /@sicspcdb as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
远程匿名登录,Oracle默认是关闭的。这个在实际生产环境中非常有必要,远程客户端对于Oracle而言是不安全可靠的。如果希望开启,需要调整参数remote_os_authent。
SQL> alter system set remote_os_authent=true;
alter system set remote_os_authent=true
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
该参数需要重启数据库。
SQL> alter system set remote_os_authent=true scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 2.0911E+10 bytes
Fixed Size 2262368 bytes
Variable Size 1.1677E+10 bytes
Database Buffers 9193914368 bytes
Redo Buffers 38170624 bytes
Database mounted.
Database opened.
注意:我们修改参数之后,重启Oracle报提示过期参数出现在实例启动环节。这个现象我们注意下来,之后讨论!
Os参数修改成功。
SQL> show parameter os
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
(篇幅原因,有省略……)
os_authent_prefix string ops$
os_roles boolean FALSE
remote_os_authent boolean TRUE
remote_os_roles boolean FALSE
timed_os_statistics integer 0
为了后续操作,生成一份pfile。
SQL> create pfile from spfile;
File created.
此时,在Linux服务器端OS匿名登录成功。
SQL> conn / --服务器本地登录成功
Connected.
SQL> conn /@sicspcdb –-服务器远程匿名登录成功
Connected.
SQL> show user
USER is "OPS$ORACLE"
SQL> conn /@sicspcdb as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied –sys远程匿名登录失败!
下面我们在windows客户端上进行测试,看远程客户端OS匿名登录是否成功。Windows操作系统用户名为admin,需要在数据库中进行额外配置。
SQL> create user ops$admin identified by oracle;
User created.
SQL> grant connect, resource to ops$admin;
Grant succeeded.
在windows本地测试:
--本地TNS名称验证
C:\Users\admin>tnsping sicspcdb_linux_bk
TNS Ping Utility for 64-bit Windows: Version 11.2.0.4.0 - Production on 14-7月 -
2014 18:04:25
Copyright (c) 1997, 2013, Oracle. All rights reserved.
已使用的参数文件:
D:\app\admin\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.1
6.19.2)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = sicspcdb)))
OK (10 毫秒)
登录测试。
C:\Users\admin>sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on 星期一 7月 14 18:04:45 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> conn /@sicspcdb_linux_bk
已连接。
SQL> show user
USER 为 "OPS$ADMIN"
实验成功!通过参数remote_os_authent的开启,可以帮助我们实现客户端的匿名登录。