话说大张江有处仙乡,唤做SIT部落。仙女老爷们的日常便是把机房的各色设备连来倒去,探究万物的兼容调和之法。小仙惫懒, Oracle系列都这开头......
言归正传:今儿我们来聊聊Oracle数据库的密码文件。
What
Oracle 数据库密码文件是用来存放oracle数据库中具有SYSOPER/SYSDBA系统权限的用户密码信息的,非SYSOPER/SYSDBA系统权限的用户密码信息不会保存在oracle数据库的密码文件中。
Why
如果DBA想要启动一个数据库实例,Oracle必须有一种方式能核实该DBA用户,确认该DBA用户是否有启动数据库实例的权限。
通过上面的描述,我们知道DBA的密码是不能保存在数据库当中的,这是为什么呢?因为如果密码保存在数据库里面,我们只有启动了数据库实例之后才能验证DBA的密码是否正确,这样岂不是本末倒置了。因此,DBA的认证只能放到oracle数据库的外面。
有两种DBA的认证机制,一种是通过密码文件审核,另外一种是通过操作系统审核。
How
1. 操作系统审核
如果你是在Oracle数据库的服务器端,可以这样登录数据库
oracle$ sqlplus nolog
SQL> conn assysdba
SQL> show user
USER is "SYS"
有没有注意到,在你没有输入用户名和密码的情况下,竟然以超级管理员用户sys登录进了oracle数据库,牛掰啊。 各位同学可以想一下,为什么不需要输入密码就可以以sys用户登录。
上面这种登录方式叫做超级用户的操作系统审核,这是通过操作系统来判断当前oracle用户是否属于dba组来决定的。
# id oracle
uid=1101(oracle) gid=1010(oinstall) 组=1010(oinstall),1021(asmdba),1031(dba),1032(oper)
也就是说,因为oracle用户是属于dba组的,所以在服务器端以oracle用户登录数据库不需要输入用户名和密码就可以登录sys用户。
更进一步,其实不管有没有用户存在,只要是以oracle用户登录进操作系统并且oracle属于dba组,就可以以sys用户登录oracle数据库。
例如:
SQL> conn abc/abc as sysdba
Connected.
SQL> show user
USER is "SYS"
SQL>
// 上面的数据库用户abc实际上是不存在的
聪明的同学肯定猜到了,想要取消操作系统审核就是把oracle用户从dba组里面删掉。
[root@centos-vm ~]# gpasswd-d oracle dba
正在将用户“oracle”从“dba”组中删除
# id oracle
uid=1101(oracle) gid=1010(oinstall) 组=1010(oinstall),1021(asmdba),1032(oper)
这个时候再尝试用缺省方式登录
SQL> conn as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL>
// 登录失败,因为oracle不属于dba组
关闭操作系统审核的另外一种方式是通过编辑配置文件
/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/sqlnet.ora
在里面增加一行SQLNET.AUTHENTICATION_SERVICES=(none)。这个时候不管oracle是否属于dba组,也不能通过操作系统审核登录到oracle数据库。
2. 密码文件审核
密码文件的存放路径:
$ORACLE_HOME/dbs/orapw$ORACLE_SID on unix and linux
$ORACLE_HOME/database/PWD%ORACLE_SID%.ora on windows.
例如我的密码文件是:
$ls -l/u01/app/oracle/product/12.2.0/dbhome_1/dbs/orapworcl1
密码文件是个二进制文件,不能用文本编辑器打开,可以通过strings查看
密码文件的相关参数
这个初始化参数 remote_login_passwordfile指定了是否使用密码文件来验证DBA用户的登录。取值可以是 shared,exclusive(默认)和none
1)当取值为EXCLUSIVE时
允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;
允许授予和回收SYSDBA或SYSOPER权限。
2)当取值为NONE时
禁止客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;
禁止授予和回收SYSDBA或SYSOPER权限。
3)当取值为SHARED时
允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;
禁止授予和回收SYSDBA或SYSOPER权限。
怎么修改参数的取值呢?可以回看我们参数文件那一期。
通过密码文件登录oracle数据库
SQL> conn sys/password123! as sysdba
Connected to an idle instance.
SQL> show user
USER is "SYS"
删除密码文件
如果把密码文件orapworcl1删除了的话,就不能通过密码文件审核的方式登录数据库了。
SQL> conn sys/password123! as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL>
那问题来了,这个时候操作系统审核关闭,密码文件也被删除了,怎么才能用sys用户登录数据库呢?
手动创建密码文件
oracle提供了一个命令,可以在密码文件丢失的情况下,手动创建密码文件
orapwd file=/u01/app/oracle/product/12.2.0/dbhome_1/dbs/orapworcl1 password=password123!
这样就可以重新通过密码文件验证的方式登录oracle数据库。
操作系统审核的优先级高于密码文件的审核,但是一般为了安全考虑,会关闭操作系统审核。个人感觉,如果能接触到物理机,任何审核方式都是失效的。