共计 7241 个字符,预计需要花费 19 分钟才能阅读完成。
密码文件 (password file) 是一个可选的文件,允许远程 SYSDBA 或管理员访问数据库。
启动 Oracle 时,还没有数据库可以用来验证密码。在本地系统上启动 Oracle 时,Oracle 会利用操作系统来执行这种认证。安装 Oracle 时,会要求完成完成的人指定管理员“组”。在 Unix/Linux 上,这个组一般默认为 dba,在 Windows 上默认为 OSDBA,不过也可以是平台上任何合法的组名。这个组很特殊,因为这个组中的任何用户都可以作为 SYSDBA 连接 Oracle,而无需指定用户名或密码。
[root@rhel6 ~]# id mysql
uid=496(mysql) gid=495(mysql) groups=495(mysql),500(oinstall)
[root@rhel6 ~]# su – mysql
-bash-4.1$ export ORACLE_HOME=/u02/app/oracle/product/11.2.4/db1
-bash-4.1$ export ORACLE_SID=orcl
-bash-4.1$ cd $ORACLE_HOME/bin
-bash-4.1$ ./sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Thu Dec 15 21:32:05 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: ^C
-bash-4.1$ su
Password:
[root@rhel6 bin]# usermod -G dba mysql
[root@rhel6 bin]# id mysql
uid=496(mysql) gid=495(mysql) groups=495(mysql),501(dba)
[root@rhel6 bin]# exit
exit
-bash-4.1$ ./sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Thu Dec 15 21:32:36 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
sys@ORCL>show user
USER is “SYS”
现在可以连接数据库做管理工作,或启动关闭数据库。如果要从另外一台机器通过网络完成这个操作会怎么样呢?下面我使用 @连接串来连接:
C:\Users\victor>sqlplus /@orcl as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12 月 15 21:42:04 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
在网络上,对于 SYSDBA 的操作系统认证不再奏效,即使把很不安全的 REMOTE_OS_AUTHENT 参数设置为 TRUE 也不例外。所以操作系统认证不可行。因此密码文件应运而生了。
密码文件保存了一个用户名和密码列表,这些用户名和密码分别对应于通过网络远程认证为 SYSDBA 的用户。Oracle 必须使用这个文件来认证用户,而不是数据库中存储的正常密码列表。
下面验证这种情况。首先,设置 REMOTE_LOGIN_PASSWORDFILE,有三个值:NONE,意味着没有密码文件,不存在“远程 SYSDBA 登录”、SHARED, 多个数据库可以使用同样的密码文件、EXCLUSIVE,只有一个数据库使用一个给定的密码文件。这里设置为 EXCLUSIVE。
alter system set remote_login_passwordfile=exclusive scope=spfile;
修改这个参数需要重启数据库。
使用 orapwd 创建和填写这个初始的密码文件,密码文件位于 $ORACLE_HOME/dbs 目录中。
[oracle@rhel6 dbs]$ which orapwd
/u02/app/oracle/product/11.2.4/db1/bin/orapwd
[oracle@rhel6 dbs]$ orapwd
Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>
where
file – name of password file (required),
password – password for SYS will be prompted if not specified at command line,
entries – maximum number of distinct DBA (optional),
force – whether to overwrite existing file (optional),
ignorecase – passwords are case-insensitive (optional),
nosysdba – whether to shut out the SYSDBA logon (optional Database Vault only).
There must be no spaces around the equal-to (=) character.
[oracle@rhel6 dbs]$ pwd
/u02/app/oracle/product/11.2.4/db1/dbs
[oracle@rhel6 dbs]$ orapwd file=orapw$ORACLE_SID password=oracle entries=20
[oracle@rhel6 dbs]$ ls -l orapw$ORACLE_SID
-rw-r—– 1 oracle oinstall 3584 Dec 15 21:55 orapworcl
目前该文件中只有一个用户,也就是用户 SYS,尽管数据库上还有其他 SYSDBA 账户,但它们还不在密码文件中。不过基于以上设置我们可以作为 SYSDBA 通过网络连接 Oracle,即使 Oracle 没有启动,并且可以远程启动 Oracle。
C:\Users\victor>sqlplus sys/oracle@orcl as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12 月 15 22:00:24 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 784998400 bytes
Fixed Size 2257352 bytes
Variable Size 754978360 bytes
Database Buffers 20971520 bytes
Redo Buffers 6791168 bytes
数据库装载完毕。
数据库已经打开。
注意:如果上边这一步遇到 ORA-12505 “TNS:listener does not currently know of SID given in connect descriptor” 说明没有配置数据库实例的静态监听。
创建了密码文件,那我们能不能看看密码文件里到底记录了什么内容呢,会不会把我们的密码泄漏呢?
密码文件是一个二进制文件是不能直接查看的,Linux 上可以使用 strings 命令查看
[oracle@rhel6 dbs]$ strings orapworcl
]\[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
8A8F025737A9097A
mHD2
从输出可以看出密码文件中没有使用明文记录我们的密码而是记录了一些串码。
其实这个密码文件还和数据库中的一个视图 v$pwfile_users 有一些关系
V$PWFILE_USERS lists all users in the password file, and indicates whether the user has been granted the SYSDBA, SYSOPER, and SYSASM privileges.
USERNAME VARCHAR2(30) Name of the user that is contained in the password file
SYSDBA VARCHAR2(5) Indicates whether the user can connect with SYSDBA privileges (TRUE) or not (FALSE)
SYSOPER VARCHAR2(5) Indicates whether the user can connect with SYSOPER privileges (TRUE) or not (FALSE)
SYSASM VARCHAR2(5) Indicates whether the user can connect with SYSASM privileges (TRUE) or not (FALSE)
sys@ORCL>select * from v$pwfile_users;
USERNAME SYSDBA SYSOPER SYSASM
—————————————————————————————— ————— ————— —————
SYS TRUE TRUE FALSE
– 给用户 zx 赋予 SYSDBA 权限可以看到 v$pwfile_users 多了一条记录,而密码文件 orapworcl 也多了一行串码。
sys@ORCL>grant sysdba to zx;
Grant succeeded.
sys@ORCL>select * from v$pwfile_users;
USERNAME SYSDBA SYSOPER SYSASM
—————————————————————————————— ————— ————— —————
SYS TRUE TRUE FALSE
ZX TRUE FALSE FALSE
sys@ORCL>!strings /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl
]\[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
8A8F025737A9097A
mHD2
7B06550956254585
– 给用户 zx 赋予 SYSOPER 的权限,可以看到 v$pwfile_users 的 zx 行状态发生了变化,但是 orapworcl 没有变化
sys@ORCL>grant sysoper to zx;
Grant succeeded.
sys@ORCL>select * from v$pwfile_users;
USERNAME SYSDBA SYSOPER SYSASM
—————————————————————————————— ————— ————— —————
SYS TRUE TRUE FALSE
ZX TRUE TRUE FALSE
sys@ORCL>!strings /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl
]\[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
8A8F025737A9097A
mHD2
7B06550956254585
– 移除密码文件再移回来,移除密码文件后 v$pwfile_users 变为空,移回后 v$pwfile_users 又有记录。
sys@ORCL>! mv /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl_orcl
sys@ORCL>select * from v$pwfile_users;
no rows selected
sys@ORCL>! mv /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl_orcl /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl
sys@ORCL>select * from v$pwfile_users;
USERNAME SYSDBA SYSOPER SYSASM
—————————————————————————————— ————— ————— —————
SYS TRUE TRUE FALSE
ZX TRUE TRUE FALSE
– 测试 zx 用户远程以 SYSDBA 登录
C:\Users\victor>sqlplus zx/zx@orcl as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12 月 15 22:34:09 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show user;
USER 为 “SYS”
– 回收用户 zx 的 SYSDBA 和 SYSOPER 权限,v$pwfile_users 中的 zx 记录行没有了,密码文件 orapworcl 没有变化
sys@ORCL>revoke sysdba,sysoper from zx;
Revoke succeeded.
sys@ORCL>select * from v$pwfile_users;
USERNAME SYSDBA SYSOPER SYSASM
—————————————————————————————— ————— ————— —————
SYS TRUE TRUE FALSE
sys@ORCL>!strings /u02/app/oracle/product/11.2.4/db1/dbs/orapworcl
]\[Z
ORACLE Remote Password file
INTERNAL
AB27B53EDC5FEF41
8A8F025737A9097A
mHD2
7B06550956254585
– 再次测试 zx 用户远程以 SYSDBA 登录,现在无法登录
C:\Users\victor>sqlplus zx/zx@orcl as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on 星期四 12 月 15 22:35:17 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138686.htm