应用于:
oracle安全服务器-版本:10.2.0.1 到11.2
文档中信息适用于任何平台
目标:
如何设置sqlnet文件在所有的情况中指向所需要的sqlnet.org文件和到所期望的wallet。
解决方法:
必须要正确的理解sqlnet的设置,以至于创建一个正确的设置和在所有的情况下指向所期望的sqlnet.ora 或者wallet。
在大多数情况下,默认值就可以,然而,在一些复杂的环境中,listener在其他地方被启动而不是从数据库启动或者多个数据库共享相同的环境,也或者他们需要互不相同的wallet,此时理解如何设置sqlnet文件是至关重要的。
通过这样的一些设置,受到影响的是哪一部分呢?大多数情况下,使用wallet的部分为:
1.透明数据加密
2.SSL认证
3.EUS认证
有时,可能也会有这样一些情景,数据库会共享相同的跟目录,但是却不会共享相同的安全设置,这种结果会要求不同的sqlnet.org文件。
前提:
1.当一个进程被启��时,它会从它所启动的进程中继承属性, 例如权限和环境变量。
2.阴影进程如何启动?
有以下三种主要的情况:
2.1遗赠:客户端应用(例如 sqlplus)会使用遗赠协议来连接数据库实例。listener没有被使用。客户端程序(sqlplus)开始了一个新的进程(阴影进程或者确定的服务器进程)而且这个进程(基于从oracle_home和oracle_sid计算而来的哈希值)标示了共享的内存段。在#1中所标记信息,这个进程会从启动的父进程中继承环境和权限,即客户端程序(sqlplus)。理解这些是非常重要的,因为大多数时候单例实体数据库都会以一个序列开始,向下面这样:
sqlplus "/ as sysdba"
2.2重定向:当一个oracle客户端进程需要与一个指定的服务器连接的时候,假设访问远程数据库(不管数据库是否作为客户端程序处在相同的服务器上)。listener会在这种情况下使用。在接触listener和谈判认证后,listener进程会开启一个专用的服务器代表客户端应用(sqlplus)。结果就是,阴影进程会继承listener的权限和部分listener的环境。至少两个环境变量,CRACLE_HOME和ARACLE_SID,不是继承与listener的,因为他们必须要符合于数据库,他们仅仅用来遗嘱连接,阴影进程使用它们来确定共享内存段。而这也是一件很重要的事,因为listener可以知道这两个值和其他的事,不管是静态的还是动态的值,以至于为一个阴影进程设置合适的环境 。
2.3共享服务器:当连接试图建立好之后,共享服务器和转发器也已经启动了,listener仅仅重定向链接试图到最少的共享服务器。共享服务器和转发器继承数据库环境(不是监听器),因此,这仅仅是一个特殊的例子,环境的设置依靠于实例是如何启动的,即使用遗嘱链接或者一个重定向回话创建静态注册的实例。
#2.如何显示数据库环境下的listener
1.动态实例注册-pmon注册数据库到listener并且提供他的全部环境到listener。所有由listener所启动的进程会赋予pmon环境变量和listener权限。Pmon会自动用端口号1521的listener来注册实例,其他的listener可以使用local_listener参数来指定。
2.静态的实例注册。listener知道数据库环境因为它在它的listener.ora 配置文件中已经指定了,使用ID_LIST_listener_name 这个参数。在下面这个给的关于listener LISTENER_TEST的例子中。很清晰地看到,ORACLE_SID和ORACLE_HONE是强制设置的。其他的环境变量,TNS_ADMIN and ORACLE_BASE都是sqlnet.ora和wallet location中最重要的,他们可以通过指定ENVS参数。
SID_LIST_LISTENER_TEST =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = black.us.oracle.com)
(ORACLE_HOME = /refresh/u02/app/oracle/product/10.2.0/db_3)
(SID_NAME = black)
(ENVS= "TNS_ADMIN=/home/oracle/network/admin,ORACLE_BASE=/refresh/u02/app")
)
)
#3.如何指定sqlnet.ora位置
默认情况下,sqlnet.ora文件被安放在$ORACLE_HOME/network/admin。这可以由设置TNS_ADMIN环境变量来改变,其他的默认位置也是存在的,在各种操作系统中都是不同的,但是他们在这个文档中并没有体现,因为他们几乎没有用到过。
有一点需要特殊的提及一下,客户端的sqlnet.ora几乎没有关联,除了恰巧listener(sqlnet.ora)作为客户端。
#4.决定包位置的参数是什么?
默认情况下,包被安放在$ORACLE_BASE/admin/<global_db_name>/wallet。如果这个目录不存在或者ORACLE_BASE没有设置,那么此时的默认位置为$ORACLE_HOME/admin/<global_db_name>/wallet,这个wallet位置可以使用在sqkbet.ora中的WALLET_LOCATION来设置另一个目录。对于TDE中已经介绍过的ENCRYPTION_WALLET_LOCATION,如果两个地方都进行了设置,会覆盖掉WALLET_LOCATION 这个参数值。TED会使用有任何一个参数指定的目录,如果只是其中一个进行了设置。
#5.决定oracle进程的环境,使用如下注解:
Note 373303.1 How to Check the Environment Variables for an Oracle Process
#6.一旦一个进程环境已经设置了,那么在没有重启进程的情况下是不可能改变设置的。
所以,如果一个数据库正在使用动态的注册和数据库由错误的环境所启动的,那么这个数据库必须要用合适的环境重启。如果一个数据库正在使用静态的注册并且listener.ora文件有不正确的设置(尤其是ENVS参数)在正确的设置了值之后,这个listener必须要重启。
#7.如何把这所有的一切糅合起来
以下的是为一些可能的情境所要求的设置,仅仅有两个是最复杂的并且是建议被阻止的,其他的都可以从以下这些例子中派生而来
要考虑的事情有:
+这个实例是不是正在使用动态的或者静态的注册表?如果使用动态的注册表,当启动数据库实例的时候,设置合适的环境是非常重要���。
+sqlnet.net文件是不是在默认的位置?
+wallet是不是在默认的位置?
+这些数据库是不是正在使用相同的根目录或者他们是不是正在共享wallet?
假设listener根目录是不相关的,基于上面的原因,唯一一个listener配置文件应该有一个listener.ora。数据库指定的sqlnet.ora文件应该为数据库实例包的设置决定
+文档中的这些例子被建立在这样的一种的情境,listener是以不同的ORACLE_BASE and和ORACLE_HOME来启动的,而不是通过数据库。
Listener:
ORACLE_BASE: /refresh/u01/app
ORACLE_HOME: /refresh/u01/app/oracle/product/10.2.0/listener_1/bin
Database:
ORACLE_BASE=/refresh/u02/app
ORACLE_HOME=/refresh/u02/app/oracle/product/10.2.0/db_3
1.静态的注册表/非默认的sqlnet.ora文件位置/非默认的包位置/多个实例。
listener.ora的设置类似于如下方式:
SID_LIST_LISTENER_TEST =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = black.us.oracle.com)
(ORACLE_HOME = /refresh/u02/app/oracle/product/10.2.0/db_3)
(SID_NAME = black)
(ENVS= "TNS_ADMIN=/home/oracle/network/admin,ORACLE_BASE=/refresh/u02/app")
)
)
注解TNS_ADMIN值被用来设置为特殊的实例。允许sqlnet.ora文件(在/home/oracle/network/admin)的惯用方式
ORACLE_BASE能应用在这种情景中的其他目的(例如,在11g,他决定着默认的特殊根目录)
Sqlnet.ora的设置类似于下面的这种方式:
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /home/oracle/wallet/$ORACLE_SID)
)
)
每一个实例在试图注册数据库到OID或者创建TDE包之前都应要由他自己的一个目录/home/oracle/wallet/$ORACLE_SID directory
After creating a session to the database using a redirected connection, the wallet location of this new session can be checked:
在给使用重定向连接的数据库创建一个session之后,这个新的session的wallet位置可以被检测到:
1. 从内部的session:
select * from v$encryption_wallet
WRL_TYPE WRL_PARAMETER STATUS
file /home/oracle/wallet/$ORACLE_SID CLOSED
or, by checking the process environment:
LD_LIBRARY_PATH=/refresh/u01/app/oracle/product/10.2.0/listener_1/lib:/usr/dt/lib:/usr/lib:/opt/cobol/cobdir/coblib
ORACLE_SID=black
ORACLE_BASE=/refresh/u02/app
TNS_ADMIN=/home/oracle/network/admin
PATH=/opt/java/bin:/opt/bin:/bin:/usr/bin:/usr/lbin:/usr/local/bin:/etc:/opt/fortran/bin:/usr/ccs/bin:/usr/openwin/bin:/usr/dt/bin:/opt/cobol/bin:.:/refresh/u01/app/oracle/product/10.2.0/listener_1/bin
ORACLE_HOME=/refresh/u02/app/oracle/product/10.2.0/db_3
As seen, the set environment values were the one specified by the listener.ora file. However, the non-specified one, eg: PATH or LD_LIBRARY_PATH, were inherited from the listener process (which is started from home: /refresh/u01/app/oracle/product/10.2.0/listener_1).
2.动态的注册表/非默认的sqlnet.ora文件位置/非默认的wallet位置/多个实例
这个实例使用bequeath链接来启动,环境设置为数据库环境(即 TNS_ADMIN and ORACLE_BASE,如果需要的话)。
Sqlnet.ora应该有类似于如下的设置方法。
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /home/oracle/wallet/$ORACLE_SID)
)
)