ORACLE数据库有两种安全验证模式:OS认证和口令(密码)认证
一、OS认证
Oracle的OS认证(操作系统认证)是一种安全验证模式,它允许特定的操作系统用户无需提供数据库密码即可登录数据库,并通常被授予SYSDBA或SYSOPER等最高管理权限。
这种认证方式的核心思想是将用户的身份验证工作从数据库层面转移到操作系统层面。
1.1 工作原理
当一个用户尝试通过OS认证连接数据库时(例如使用sqlplus / as sysdba命令),Oracle数据库会执行以下检查:
-
检查组关系:数据库会检查当前登录操作系统的用户,是否属于一个特定的操作系统用户组。这个组通常被称为OSDBA组。
-
授予权限 :如果该用户确实在OSDBA组中,Oracle就会信任操作系统的验证结果,允许该用户以
SYSDBA身份登录,而不再要求输入数据库密码。
1.2 验证
1、操作系统验证
我们可以将新建立用户或者把原来的用户加入到oinstall组或dba等组中,然后使用这个用户在安装了数据库的本地机器登陆或者使用安全的远程连接登陆,可以作为sysdba登录,在数据库级不需要提供密码。

2、命令验证

3、sqlnet.ora文件中加入 ,文件位置在 $ORACLE_HOME/network/admin目录下
bash
SQLNET.AUTHENTICATION_SERVICES=(NTS) #这一种模式只支持WINDOWS NT系统
LINUX下默认是支持OS认证和口令(密码)认证的所以不需要修改sqlnet.ora
1.3 关闭OS认证
-
把操作系统用户的dba组和oinstall组取消
-
修改sqlnet.ora文件
bash
SQLNET.AUTHENTICATION_SERVICES = (NONE) # 关闭os认证方式
2个条件满足一个即可关闭OS认证
二、口令验证
-
Oracle的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件,否则不能连上。
-
由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件。使用口令文件的好处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。
-
安装完oracle,没有给普通用户授予sysdba权限,口令文件中只存放了sys的口令,如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,当然这时必须要求数据库处于open状态。
2.1 使用口令文件验证
如果当前没有使用口令文件验证。可以采用如下方法开启口令文件验证。
1.修改sqlnet.ora里的参数
SQLNET.AUTHENTICATION_SERVICES = (NONE) //关闭OS认证方式,打开口令认证方式
2.建立口令文件 (口令文件丢失或者口令文件损坏,无法使用口令登录时重建)
默认格式
bash
orapwd file=\$ORACLE_HOME/dbs/orapw$ORACL_SID password=<password> force=y # 其中force=y为覆盖老密码文件
如果出现OPW-00029: Password complexity failed for SYS user : Password must contain at least 8 characters.
说明要满足ORACLE对密码复杂度。因为ORACLE 12.2以后增强了密码强度的要求,但是如果您依旧想使用短密码的话可以写成
bash
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle force=y format=12 # format=12使用12.2之前的密码验证模式

当上面两个步骤生效后,我们发现之前的sqlplus / as sysdba无法进入到oracle sys用户下:

然后我们可以使用以下两种方式登录oracle
第一种是隐式输入账号密码

第二种是显示输入(不推荐,数据库的密码直接明文显示,具有安全隐患)

在口令验证的情况下,如果你把密码忘记了,可以使用如下方式修改
1.重建密码文件
2.改回到os认证模式,进入到sys用户下,使用如下命令修改密码:

2.2 REMOTE_LOGIN_PASSWORDFILE参数
在某些情况下可以使用REMOTE_LOGIN_PASSWORDFILE参数增强系统的安全性,所谓提高安全性就是禁止以SYSDBA或SYSOPER特权用户从客户端登陆到数据库 系统中。这是一种牺牲管理便捷性提升安全性为前提的。需酌情使用。
使用show parameter remote_login;来查看当前参数的值

2.2.1 REMOTE_LOGIN_PASSWORDFILE参数详解
在此总结一下在REMOTE_LOGIN_PASSWORDFILE参数取不同值时的行为特性。 REMOTE_LOGIN_PASSWORDFILE参数可以有三种取值:EXCLUSIVE(默认)、NONE和SHARED。
1)当取值为EXCLUSIVE时 允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作; 允许授予和回收SYSDBA或SYSOPER权限。(允许你在sys用户下使用alter user sys identified by xxx;给sys用户修改密码的) )
2)当取值为NONE时 禁止客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作; 禁止授予和回收SYSDBA或SYSOPER权限。
3)当取值为SHARED时 允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作; 禁止授予和回收SYSDBA或SYSOPER权限。(不允许你在sys用户下使用alter user sys identified by xxx;给sys用户修改密码的)
以上便是参数REMOTE_LOGIN_PASSWORDFILE在不同取值情况下对系统的影响。每一种取值都有其自己的应用场景。我们需要做的是根据不同的场景做出相应的取舍。
2.2.2 REMOTE_LOGIN_PASSWORDFILE参数修改
- 使用sys用户登录到ORACLE客户端SQLPLUS,使用以下命令进行参数修改:
sql
alter system set remote_login_passwordfile=shared scope=spfile;

- 由于是修改SPFILE文件所以修改完成后,需要使用
shutdown immediate关闭数据库,然后再使用startup重新打开数据库

- 重启后重新查看该参数的值
sql
SQL> SHOW PARAMETER REMOTE_LOGIN_PASSWORDFILE;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string SHARED
-- 可见当前值已经变成了SHARED