Oracle身份认证方式(sqlnet.ora配置)

sqlnet.ora主要是和tnsnames.ora配合使用
  1. 默认无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> 
  1. 操作系统认证
对于操作系统认证,需要将该用户添加到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>
  1. 外部认证之操作系统身份验证
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>
  1. 指定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
  1. 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地址、端口、服务名等参数
  1. 限制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。
然后重启监听生效。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容