[关闭]
@307086418 2020-03-18T02:58:31.000000Z 字数 5856 阅读 1442

Oracle Sqlnet.ora/Passwordfile/OS系统认证登录总结

未分类


一、Sqlnet.ora

该文件位于$ORACLE_HOME/dbs下,我们这里只谈论他的几个参数,其余用到再说

1. SQLNET.AUTHENTICATION_SERVICES=

  1. ALL:两种方式都行
  2. NTS:操作系统身份验证
  3. NONE:只能通过输入用户名密码登录

2.NAMES.DIRECTION_PATH=(TNSNAMES,EZCONNECT)

  1. 这里只列举常用的两种
  2. TNSNAMES:利用tnsnames.ora里面的别名
  3. EZCONNECT:IP+端口

3.客户端限制
是否进行限制(默认no):
TCP.VALIDNODE_CHECKING
如:TCP.VALIDNODE_CHECKING=yes
限制客户端访问
TCP.EXCLUDED_NODES=(hostname | ip_address, hostname | ip_address, ...)
如:TCP.EXCLUDED_NODES=(finance.us.acme.com, mktg.us.acme.com, 144.25.5.25)
允许客户端访问,会覆盖限制访问
TCP.INVITED_NODES=(hostname | ip_address, hostname | ip_address, ...)
如:TCP.INVITED_NODES=(sales.us.acme.com, hr.us.acme.com, 144.185.5.73)

二、介绍一个参数remote_login_passwordfile

该参数是一个静态参数(不用记,试一下就知道了)
alter system set remote_login_passwordfile =

  1. NONE:禁用口令密码文件(此时普通用户还是可以通过口令密码方式登录,口令密码文件只记录SYSDBA,SYSOPER这种身份的用户,若此时sqlnet.aauthentication_services nts/all,操作系统匿名登录可以,但是如果为NONE,则只有普通用户通过输入用户名密码登录)
  2. EXCLUSIVE:(默认值)独占模式使用密码文件,官档中提到了“only one instance of one database”使用exclusive方式,在数据库中可以执行对sysdba用户的增加、修改、删除、修改密码,这些都会被记录到口令密码文件中。
  3. SHARED:配置shared值的口令文件可以被一台服务器上的多个数据库或者RAC集群数据库共享;(现在知道exclusive模式时说的“only one instance of one database“的含义了吧,就是为了区分RAC环境)。shared下的口令密码,也就意味着不能增加sysdba身份的用户,也不能修改密码。

三、Passwordfile介绍

  1. 密码文件Password解决的是数据库用户非操作系统验证问题。Oracle对用户名、密码的验证是有很多层次的,分别为操作系统层面和数据库层面。操作系统层面验证,就是利用用户登录操作系统时的操作系统帐号作为验证手段。当我们登录一个host主机(操作系统),实际上已经经过了操作系统级别的验证。Oracle在验证用户登录的时候,是可以指定是否使用操作系统的验证结果。如果系统设置为允许操作系统验证结果,那么是不需要输入用户名和密码就可以登入系统的。
    我们经常登录数据库服务器本机(一般通过ssh或者telnet远程连接),之前是需要输入OS的用户名和密码。之后,常常使用这个命令进行登录。
    image_1e3kc5foiuoqprv16mumut4ch9.png-38.7kB
    并不是每个操作系统用户都可以这样登陆的,操作系统层面有时候时很严格的,一般都是在安装Oracle的时候,默认进行的操作系统角色权限配置。比如:在windows环境下,安装oracle的用户(管理员用户)就被GUI安装程序设为为一个ora_dba的角色组。在Unix/Linux环境下,也有osdba的角色组。将登录用户名加入到改组中,实际上就可以通过操作系统验证。
    sqlnet.ora可以对此进行限制,上面已经讲过了。
    注意:这很重要!! 这里对远程登录和本地登录一个区分。本文提到的远程登录,是通过Oracle客户端软件,通过访问远程数据库服务器的监听器,构建与实例的连接。在这个过程中,是没有输入服务器用户名、密码要求的。也就是说,远程登录从没有登录OS。本地登录是通过远程桌面、telnet、ssh连接到服务器上,输入OS帐号登录。运行的程序是驻留在数据库服务器上的程序。
  2. 数据库层面的验证就是数据库用户名和密码的验证。这部分信息通常是保存在数据库文件内部,是数据字典的一部分内容。只有在数据库实例启动并且加载上的情况下,才可以访问到。

    这是,就出现了一个矛盾。如果当前我的数据库系统没有启动,没法访问用户帐户信息。怎样进行登录?

    我们通常的解决方法是使用telnet/ssh登录到服务器本地。使用conn / as sysdba连接上空实例,之后再启动。也就是利用操作系统层面的验证。那么,如果我不希望使用操作系统层面的验证,难道就没有办法登录实例了吗?

    于是,密码文件就出现了。($ORACLE_HOME/dbs/orapwSID)

    简单的说,密码文件就是一个保存在数据文件外的信息文件,可以在数据文件没有加载的时候被实例访问到。里面保存的就是用户名信息和密码信息,通常是那些执行启动、关闭等维护权限(sysdba/sysoper)用户的密码,如sys。

  3. 密码文件中的内容是二进制的,无法直接查看,可以通过v$pwfile_users查看(当然也可以用string查看orapwSID)
    image_1e3kcvebgh8j6871fg2vhcspem.png-18.2kB
    system是我后加上去的

  4. 首先,要说明的问题是,密码文件是驻留在数据库服务器上的一个文件。如果数据库是使用OUI安装的,密码文件是默认生成的。其中维护的具有SYSDBA管理权限的用户信息,也是随着系统运行自动维护的。

一般来说,是不需要我们直接进行密码文件的管理工作。但是有时候,当发生密码文件被破坏的时候,常常需要手工的重建密码文件。

“使用管理员帐号不能登陆”

有时候我们会发生这样的事情(在网上也经常看到这样的询问贴),需要启动数据库,但是输入了正确的用户名和密码不能登陆。这种问题的解决也比较通用。

1、 确认密码文件起效情况。密码文件就是一个物理文件,保存着可以在实例关闭时登录用户的帐号密码信息。但是是否使用密码文件就是需要系统参数来控制了。这个参数就是remote_login_passwordfile,其各种取值已经在前面讲述过了,这里就不累述。一般我们就确认为Exclusive或者NONE。如果不想使用密码文件,就是用NONE值。如果使用密码文件,就设置为Exclusive值。不使用密码文件,就只能使用操作系统层面验证,一般认为这样安全问题更大。所以,通常我们的设置都是exclusive;
2、 判断密码文件情况。可以通过视图v$pwfile_users来检查用户列表。如果检查不到或者信息有问题,就需要手工重新创建密码文件了。

创建密码文件

使用orapwd命令创建密码文件,具体语法格式和参数为:

ORAPWD file=[filename] password=[password] [entries=numberuser] [force=y/n] [ignorecase=y/n];

其中:
file表示生成文件的路径和名称(本参数是必须录入项目);
password表示sys用户的密码(必须录入项目),用来验证生成操作是否合法;
entries表示文件中允许容纳用户的最大数量。密码文件是容纳具有sysdba、sysoper等管理的用户信息,默认情况下是由sys在其中。实际生产环境下,是不可能使用sys如此权限的用户进行日常管理的。必然有一些自定义的数据库管理员和操作员,具有sysdba和sysoper权限。这些信息都要存放在密码文件中。Entries参数项目就是定义这个文件最大可以容纳的用户信息数量。Oracle官方文档中,建议设置这个值为一个高于实际需要的值,供日后拓展时使用;
force:是否覆盖已存在的密码文件。如果设置为Y,表示如果现在存在有密码文件,就覆盖掉。默认值为N;
gnorecase:忽视大小写。是保存密码的一种策略。如果设置为Y,表示忽视大小写。注意:在早期的Oracle版本中(包括10g),用户密码是不区分大小写的,输入之后,Oracle在内部全部按照大写处理。而这个不合时宜的特性在Oracle11g中进行了修正,默认情况下,已经支持大小写用户密码。

三、实验

  1. 不允许OS认证登录
    image_1e3kdjoqnro01hqj1f50ig46ct13.png-7kB
    image_1e3kdom4a546vb817m21b2arrp1t.png-19.4kB
    本来我们数据库是打开的,这个时候,非口令密码文件中的用户也能普通登录
    image_1e3kdti1u1asfjrl15v6118t145e2a.png-21.6kB
    如果此时数据库是关着的,就只有口令密码文件中的用户能登陆了
    image_1e3kea9pg1fe51r5m1t6mfs01km92n.png-61.6kB
    image_1e3keavs5fnr8h10un1l6g1f0i34.png-34.1kB
    上面的实验中我还犯了一个错误,就是@cdbocp和@ip/erp1 都是以远程登录的形式连接的,实例并没有启动,也就没有注册在监听上面,也就无法登陆了。只有
    sqlplus sys/oracle as sysdba 能够成功连接。
    下面我们启动到nomount状态下试一下,发现也不行,监听状态为BLOCKED,同时,数据库没有打开,只有cdb,没有pdb
    image_1e3kepl3m13d1u2s9pdpta4ej3h.png-41.2kB
    image_1e3ker0qkcojfg717oe10s1ecu3u.png-79.7kB
    启动到mount状态下,发现用@cdbocp可以了
    image_1e3kesnve1c5i1aqepke5151ogs4b.png-79.7kB
    如果想要在数据库关闭情况下,通过口里密码文件远程登录,那必须设置静态监听。
    LSNR2是我们设置的静态监听
    image_1e3kfh5g41cc3mvh16341r225m55.png-69.7kB
    然后就可以登陆了,当然静态监听是无法登录到pdb的
    image_1e3kg0rabn3kk0suamfbiq362.png-19.3kB
    2.alter system set remote_login_passwordfile = none scope=spfile,同时也不允许操作系统登录
    这时候sys这些sysdba身份的就没办法登录了
    image_1e3kgs0f616m02ksocrlc4e006f.png-17.3kB
    但是普通用户还能登录,因为我数据库还是打开的,如果关闭了,普通用户肯定也不行了
    image_1e3kh25ob1m7vi1v1hpi17eafsp6s.png-21.8kB
  2. 两种情况处理办法
    如果口令密码不允许登录,操作系统也禁止了,同时数据库也关闭了
    解决方法:那就只有手工编辑一个静态参数文件,加上remote_login_passwordfie=exclusive
    image_1e3ll4t0i1tlk19pkl1npt21qm67m.png-57.9kB
    这是我们利用的静态参数文件
    image_1e3ll60dmopq1qcato626k1oum83.png-12.6kB
    如果是操作系统禁止登录,口令密码文件允许登录,但是密码忘记了
    解决方法:那就重建覆盖口令密码文件
    image_1e3llsna84j0kv93sq1pq1rl68g.png-5kB
    image_1e3lltg3f3ur1f2h59a1hur1hvb8t.png-32.6kB
    可以看到我们建密码文件时除了很多问题,主要是密码不符合规范,解决方法有两种,一种是指定符合规范的密码password='666',另一种是加参数format=12
    image_1e3lmmppa18utb01ms2c3510ki9n.png-70.4kB
    新建之后查看参数v$pwfile_users,发现只有sys了,之前的不见了,要想再用就要重新授权sysdba
    image_1e3lmm2fp1pn3172512cp85s17l29a.png-8.7kB
    4.以授予的sysdba身份的用户登录,其实最终还是以sys登录的
    image_1e3lh7phfact1lss17n81so01n1479.png-21.3kB

三、聊一下Oracle的os认证登录

    用户名、密码是我们最常见的安全验证策略方法,也是我们在各种应用系统软件中采用的最多的安全保护策略。对Oracle而言,以最大限度保护系统数据安全,是不可推卸的天然职责。 
    从最早版本到今天,Oracle在用户名和密码安全策略方面不断的加以改进,比如,进入11g之后,Default Profile要求定期进行用户密码修改操作,用户密码加密算法强化,以及对dba_users等数据字典视图进行优化改进。今天我们要讨论的是一种Oracle的另一种验证策略——OS验证策略。 
    这里,我们要进行一定澄清。最常见的OS验证策略,发生在Oracle服务器端的机器上。突出的表现是:如果我们通过了操作系统层面验证,也就是登录了服务器本机(Remote Desktop或者SecurCRT),Oracle就认为当前用户已经可以通过认证,不需要额外的数据库验证。当然,这要求操作系统用户归属在系统特定用户组,如Linux中的oinstall、dba。比如我们经常启动关闭服务器使用的conn /方式,就是这个类型登录验证方法。注意:通过在sqlnet.ora中参数的配置,我们是可以关闭这个特性的。 
    普通的OS验证策略两个特点:一个是服务器本地生效,客户端匿名登录无效。另一个只能登录为管理员sys,不能其他用户。那么,有没有方法实现客户端远程匿名登录,而且实现非sys用户呢?本篇我们就来介绍这个方法。

本次实验两个主要参数
image_1e3lna4a8185uje4bjh1rvi169fa4.png-23.8kB
1. 服务器端匿名登录配置实验(实验环境11g)
Oracle的OS层面验证,最直接的关联参数就是os_authent_prefix,默认取值为ops,如果此时数据库中包括一个为ops$oracle的用户,是可以在服务器端进行匿名登录的。
下面进行测试,当前Linux服务器端OS用户名为oracle,也是oinstall和dba组成员。

创建用户opsoracle,以sqlplus / as sysdba登录的是sys
image_1e3lo8n60crm1hj91a617la1ajuah.png-30.1kB
image_1e3lo97a23m4b1j1svpfcjc5nau.png-53.8kB
但此时远程是无法匿名登录的
image_1e3lof6rc1gqd10kajrlhhgnjsbb.png-22.2kB
2. 远程匿名登录配置实验
远程匿名登录,Oracle默认是关闭的。这个在实际生产环境中非常有必要,远程客户端对于Oracle而言是不安全可靠的。如果希望开启,需要调整参数remote_os_authent。
注意:我们更改这个参数时重启Oracle报提示过期参数出现在实例启动环节,因为oracle时不推荐我们这样做的
image_1e3lokm2qako51j1at149a2q4bo.png-28.9kB
创建操作系统同名的用户
image_1e3lov64q1ivv1db11bec1rfrmgoc5.png-8.6kB
然后测试
image_1e3lovoifpu21n6kfgh13gedc5ci.png-42.7kB

    OS匿名验证这个特性出现的很早,是早期Oracle发展的一个方向。近些年的版本中,这个特性没有过多的发展,说明Oracle在这个方面已经不再过多延伸了。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注