sqlnet.ora主要是和tnsnames.ora配合使用
- 默认无sqlnet.ora时(可操作系统访问【oracle 用户系 dba组才行】)
[oracle@xag182 /]$ cd $ORACLE_HOME/network/admin
[oracle@xag182 admin]$ pwd
/u01/app/oracle/product/12.2.0/db_1/network/admin
[oracle@xag182 admin]$ ls
listener.ora samples shrept.lst tnsnames.ora
[oracle@xag182 admin]$ sqlplus / as sysdba
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL>
- 操作系统认证
对于操作系统认证,需要将该用户添加到dba(针对sysdba权限)/oper(针对sysoper权限)组中,
就可以使用 "sqlplus / as sysdba"方式登陆
#新建test 用户
[root@xag182 ~]# useradd test
[root@xag182 ~]# echo "123456" | passwd --stdin test
[root@xag182 ~]# su test
[test@xag182 root]$ sqlplus / as sysdba
bash: sqlplus: command not found
[test@xag182 root]$ cd /home/test
[test@xag182 ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export DISPLAY=192.168.0.4:0.0
ORACLE_SID=MPAPEX;export ORACLE_SID
ORACLE_UNQNAME=MPAPEX;export ORACLE_UNQNAME
#JAVA_HOME=/u01/java/jdk1.8.0_181; export JAVA_HOME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/12.2.0/db_1; export ORACLE_HOME
ORACLE_TERM=xterm; export ORACLE_TERM
NLS_DATE_FORMAT="YYYY:MM:DDHH24:MI:SS"; export NLS_DATE_FORMAT
NLS_LANG=American_America.AL32UTF8; export NLS_LANG
TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN
ORA_NLS11=$ORACLE_HOME/nls/data; export ORA_NLS11
PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin:$ORA_CRS_HOME/bin
PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH
THREADS_FLAG=native; export THREADS_FLAG
export TEMP=/u01/tmp
export TMPDIR=/u01/tmp
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
#alias asmcmd='rlwrap asmcmd'
#设置环境变量,登录oracle会提示设置ORACLE_SID以免实例太多误操作
/usr/local/bin/oraenv
ORAENV_ASK=YES
export ORAENV_ASK
umask 022
[test@xag182 ~]$ source .bash_profile
[test@xag182 ~]$ sqlplus / as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
#添加dba、oinstall 、oinstall 属组给test 用
[root@xag182 ~]# usermod -g oinstall -G dba,oper test
[root@xag182 ~]# id test
uid=1001(test) gid=1000(oinstall) groups=1000(oinstall),1001(dba),1002(oper)
[test@xag182 ~]$ sqlplus / as sysdba
SQL>
# 新建sqlnet.ora 文件且当 SQLNET.AUTHENTICATION_SERVICES = NONE时,报错:
[oracle@xag182 admin]$ vim sqlnet.ora
[oracle@xag182 admin]$ cat sqlnet.ora
#NONE : 表示关闭操作系统认证,只能密码认证
SQLNET.AUTHENTICATION_SERVICES= (NONE)
[oracle@xag182 admin]$ sqlplus / as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
[oracle@xag182 admin]$ su - test
[test@xag182 ~]$ sqlplus / as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
#用密码登陆则没有问题
[test@xag182 ~]$ sqlplus sys/123456 as sysdba
SQL>
#当 SQLNET.AUTHENTICATION_SERVICES = ALL时,可操作系统访问
[oracle@xag182 admin]$ cat sqlnet.ora
#NONE : 表示关闭操作系统认证,只能密码认证
#ALL : 操作系统认证和密码认证均可。
#NTS : 用于windows平台。
SQLNET.AUTHENTICATION_SERVICES= (ALL)
[oracle@xag182 admin]$ sqlplus / as sysdba
SQL>
- 外部认证之操作系统身份验证
SQL> show parameter common_user_prefix;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix string C##
SQL> alter system set common_user_prefix='' scope=spfile;
SQL> startup force;
SQL> create user ops$test identified externally;
SQL> grant create session to ops$test;
SQL> exit
[oracle@xag182 admin]$ su - test
#test 操作系统身份验证,
#这个test是在本地环境下的操作系统认证,
#即test与oracle数据库在同一个主机上,
#若test不在同一个主机上,必须将remote_os_authent设置为TRUE。
[test@xag182 ~]$ sqlplus /
SQL> show user;
USER is "OPS$TEST"
SQL>
- 指定CLIENT NAME解析方法的次序,我们连接数据的时候,会有以下的语法格式的输入:
CONNECT username/password [@db_alias] AS [SYSOPER | SYSDBA] ;
可以看到这个语法中,有一个db_alias,这个东西是什么呢?这个db_alias就是在tnsnames.ora中定义的
数据库的别名,比如:
#ORCL是个别名
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
指定CLIENT NAME解析方法的次序,
默认是NAMES.DIRECTORY_PATH=(tnsnames, onames, hostname)
这个db_alias就是上面所说的ORCL,那么我们连接的时候,怎么知道这个ORCL是个什么东西呢?这就和sqlnet.ora中的配置有关系了。
当第一个指定为TNSNAMES时,就先到tnsnames.ora文件中去找对应的db_alias;如果找不到,就再按指定的第二种方式去找;如果都找不到,就将指定的db_alias当做主机名在网络上进行解析,得到数据库服务器的地址。
很多朋友对EZCONNECT很不解,这个EZCONNECT表示简单连接,就是说可以不用在tnsnames.ora文件去查询服务名就可以进行数据库的连接,比如我们可以这样进行连接:
username/password@hostname:port/service_name
- sqlnet.ora中的NAMES.DIRECTORY_PATH参数配置
NAMES.DIRECTORY_PATH常用的值有tnsnames,hostname,onames和ezconnect和ldap,cds,nis不常用的值,
默认值是(tnsnames,onames,hostname)。
如果设置NAMES.DIRECTORY_PATH=(tnsnames),那么客户端就只会从tnsnames.ora查找
你要连接的字符串(db_alias)记录,如果tnsname.ora文件中没有此记录,则连接不上数据库。
如果设置NAMES.DIRECTORY_PATH=(tnsnames,hostname),那么客户端首先会从tnsnames.ora查找
你要连接的字符串(db_alias)记录,如果tnsname.ora文件中没有此记录,则尝试把你要连接的
字符串(db_alias)当作一个主机名,通过网络的途径去解析它的ip地址然后去连接
这个ip上GLOBAL_DBNAME=连接字符串(db_alias实例),当然这里连接字符串(db_alias)并不是一个主机名,最后会尝试以ezconnect的方式连接数据库。
例如sqlnet.ora配置如下:
NAMES.DIRECTORY_PATH= (TNSNAMES,ezconnect)
则可以同时支持如下格式的访问:
$ sqlplus scott/tiger@orcl
$ sqlplus scott/tiger@service_IP(or hostname):1521/service_name #ezconnect方式
当然采用第一种格式时需要正确配置tnsnames.ora,因为sqlplus需要在这里
匹配IP地址、端口、服务名等参数
- 限制IP对数据库的访问
(1)在sqlnet.ora文件中配置,比如:
限制IP地址192.168.131.109对数据库的访问
在sqlnet.ora文件中添加如下内容:
tcp.validnode_checking=yes
tcp.invited_nodes=(192.168.130.11)
tcp.excluded_nodes=(192.168.131.109)
第一行的含义:启用IP限制功能;
第二行的含义:允许访问数据库的IP地址列表,多个IP地址使用逗号分开,此例中我们写入数据库服务器的IP地址;
第三行的含义:禁止访问数据库的IP地址列表,多个IP地址使用逗号分开,此处我们写入欲限制的IP地址192.168.131.109。
然后重启监听生效。