oracle中用户登录的验证方法

oracle数据库中用户登录数据库时可以使用以下两种用户审计方法:
1.操作系统审计
2.密码文件审计

操作系统审计
在osdba和osper两个特定操作系统组中的成员能让dba通过操作系统来审计数据库而不用使用用户名和密码.这就是操作系统审核.这些操作系统组通常指osdba和osoper.这些组在数据库安装过程中被创建.他们的名字根据操作系统的不同有所不同

Operating System Group   UNIX User Group      Windows User Group
OSDBA                    dba                  ORA_DBA
OSOPER                   oper                 ORA_OPER

当oracle universal Installer使用这些缺省的名字,但是可以覆盖它们.覆盖它们的一个理由是在相同的主机上运行多个实例.如果每一个实例有一个不同的人作为dba,可以通过对每一个实例创建一个不同的osdba组来提高每一个实例的安全性.例如,在相同主机上有两个实例,第一个实例的osdba组叫dba1,第二个实例的osdba组叫dba2.第一个dba是dba1的成员,第二个dba是dba2的成员.因此使用操作系统审计每一个dba将能够只连接到指派给它的实例.

在osdba或osoper组中的成员用以下方法来影响连接数据库方式:
如果你是osdba组的成员,当连接数据库时可以指定as sysdba,然后将以sysdba系统权限连接到数据库

如果你是osoper组的成员,当连接数据库时可以指定as sysoper,然后将以sysoper系统权限连接到数据库

如果你不是这些操作系统组中的成员当你试图以sysdba或者sysoper进行连接时connect命令会失败

为了对一个管理用户启用操作系统审计:
1.对这个用户创建一个操作系统账号
2.将这个账号添加到osdba或osoper操作系统组中

使用操作系统审计进行连接
一个用户作为管理员通过操作系统审计来连接到本地数据库可以通过以下命令来实现:
connect / as sysdba
connect / as sysoper
对于windows平台,远程操作系统审计是一个安全连接被支持.但是必须指定远程数据库的网络服务名
CONNECT /@net_service_name AS SYSDBA
CONNECT /@net_service_name AS SYSOPER
而且客户端计算机和数据库主机必须在一个windows域中

密码文件审计
为了对一个管理用户启用密码文件审计必须执行以下操作:
1.如果没有创建密码文件使用orapwd工具创建一个密码文件:
orapwd file=filename entries=max_users
注意:
当使用DBCA来作为数据库安装的一部分时dbca将会创建一个密码文件
从oracle 11gR1开始,密码文件中的密码是区分大小写的除非你在命令行参数加入IGNORECASE=Y

2.将初始化参数remote_login_passwordfile设置为exclusive(这是缺省值)

3.使用sys用户连接到数据库(或者其它有管理权限的用户)

4.如果数据库中这个用户不存在,可以创建用户并指定密码
注意从oracle11gR1开始,数据库密码是区分大小写的(可以将sec_case_sensitive_logon设置为false来禁用区分大小写的功能)

5.给用户授予sysdba或sysoper系统权限
grant sysdba to oe;
这具语句将用户加入到密码文件中因此启用了as sysdba连接选项

管理员用户通过使用SQL*Plus connect命令可以连接到一个本地或远程数据库.它们必须使用它们的用户名和密码以及as sysdba或as sysoper子句来连接.从oracle11gR1开始密码是区分大小写的,只有在创建密码文件时使用IGNOECASE=Y选项才能禁用密码区分大小写这个功能

例如,用户已经被授予了sysdba权限,所以oe可以以下面的形式进行连接:
connect os as sysdba

SQL> grant sysdba to oe;

Grant succeeded.

SQL> conn oe as sysdba
Enter password:
Connected.

然而用户oe没用被授予sysoper权限所以下面的命令将会失败:
CONNECT oe AS SYSOPER

注意:操作系统审计优先于密码文件审计.尤其如果你是osdba或osoper操作系统组的成员而以sysdba或sysoper连接时,你将以管理权限进行连接而不管你指定的username/password

如果你不是osdba或osoper组的成员且在密码文件中也不存在,那么试图以sysdba或sysoper连接时会失败

创建和管理密码文件
可以使用密码文件创建工具orapwd来创建一个密码文件.对于有些操作系统可以创建密码文件作为标准安装的一部分

使用orapwd工具来创建一个密码文件
orapwd命令的语法如下:
ORAPWD FILE=filename [ENTRIES=numusers] [FORCE={Y|N}] [IGNORECASE={Y|N}]

file:指定密码文件名称,必须提供完全路径.如果只提供文件名,这个文件将会写在当前目录下.

entries:密码文件中允许的最大的条目数(用户账号)

force:如果为y允许覆盖已经存在的密码文件
ignorecase:如果为y密码将会是大小写敏感的
在(=)字符周围不允许空隔
这个命令会提示输入sys密码并将密码存储在密码文件.

下面的命令创建一个名为orapworcl密码文件允许有30个密码不同的权限用户
orapwd file=orapworcl entries=30

[oracle@jyrac1 ~]$ ls -lrt
total 4
drwxr-x--- 3 oracle oinstall 4096 Mar 24 13:27 oradiag_oracle
[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30

Enter password for SYS:
[oracle@jyrac1 ~]$ ls -lrt
total 12
drwxr-x--- 3 oracle oinstall 4096 Mar 24 13:27 oradiag_oracle
-rw-r----- 1 oracle oinstall 5120 Apr  4 08:49 orapworcl

orapwd命令行参数的描述
file:这个参数设置将要创建的密码文件名称.对这个文件必须指定完全路径.这个文件的内容被加密存储且文件不能直接被读取.这个参数是强制性参数

密码文件的文件名是操作系统特定的.有些操作系统要求密码文件坚持一种特定格式并存储在特定目录.其它的操作系统允许使用环境变理来指定密码文件的名称和位置

下面的表格列出了在unix,linux和windows平台下密码文件所要求的名称和位置.
表1-1

-------------------------------------------------------------
平台             要求的名称          要求的位置
-------------------------------------------------------------
unix and linux   orapwORACL_SID      ORACLE_HOME/dbs
Windows          PWDORACLE_SID.ora   ORACLE_HOME\database
-------------------------------------------------------------

例如,对于一个sid为orcldw的数据库实例,密码文件在linux平台下名称必须为orapworcldw,在windows平台上名称必须为PWDorcldw.ora

在oracle rac环境中要求设置一个环境变量来设置密码文件的路径,每一个实例的环境变量指向相同的密码文件

注意:保护密码文件和标识密码文件位置的环境变量对于系统安全至关重要.任何用户可能会执行威胁安全的连接

entries:这个参数指定密码文件可以接受的最大条目数.这个数字对应允许以sysdba或sysoper权限连接到数据库的不同用户的个数.可以通过v$pwfile_users视图来查看数据库中可以以sysdba或sysoper权限连接到数据库的用户个数

SQL> select * from v$pwfile_users;

USERNAME                       SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                            TRUE  TRUE  FALSE
OE                             TRUE  FALSE FALSE

密码文件中实际允许存储的密码条目数可能比指定的数大,因为orapwd工具会继续存储密码条目直到一个操作系统块被填满为止.例如,如果操作系统块大小是512字节,它将存储四个密码条目.允许的密码条目数总是4的倍数.

当用户被添加到密码文件中或从密码文件中删除用户时条目可以重用.如果打算指定remote_login_passwordfile=exclusive且允许给用户授予sysdba和sysoper权限那么这个参数是必须要指定的.

注意:当你超过允许的密码条目数时你必须创建一个新的密码文件.为了避免这个问题你允许分配的密码条目数必须比你期望的密码条目数大.

force:这个参数如果说设置为y将能够覆盖一个已经存在的密码文件.当这个参数被忽略或者被设置为n时如果已经存在一个同名的密码文件就会返回一个错误信息.

[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30

Enter password for SYS:

OPW-00005: File with same name exists - please delete or rename
[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30 force=n

Enter password for SYS:

OPW-00005: File with same name exists - please delete or rename
[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30 force=y

Enter password for SYS:

ignorecase:如果这个参数设置为y,密码是不区分大小写的.也就是说在使用密码文件中的密码与用户在登录时提供的密码进行比较时会忽略大小写.

共享和禁用密码文件
可以通过初始化参数remote_login_passwordfile来控制一个密码文件在多个oracle数据库实例之间是否共享.也可以使用这个参数来禁用密码文件审计.remote_login_passwordfile参数允许的参数值如下:
none:这个参数设置为none时oracle数据库认为密码文件不存在.也就是说在不安全连接的情况下不允许进行特权连接,或者说不能远程登录数据库

exclusive:(缺省值)一个exclusive密码文件只能被一个数据库实例使用.只有一个exclusive文件能被修改.使用一个exclusive密码文件能让你添加,修改和删除用户.也能使用alter user命令来修改sys用户的密码.

shared:一个shared的密码文件能被一个主机上的多个数据库或一个rac中的多个实例来使用.一个shared密码文件不能被修改.因此你不能向一个shared的密码文件中添加用户.任何试图修改sys用户的密码或者其它用户的sysdba或sysoper权限的操作都会生成一个错误.所有需要sysdba或sysoper系统权限的用户必须在remote_login_passwordfile设置为exclusive时被添加到密码文件中.在所有的用户被添加到密码文件之后再修改remote_login_passwordfile为shared再共享密码文件.

这个选项在管理多个数据库或oracle rac数据库时是非常有用的.

如果remote_login_passwordfile设置为exclusive或shared且密码文件丢失这就等价于remote_login_passwrodfile为none.
当remote_login_passwordfile为none时

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
remote_login_passwordfile            string      NONE
SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

no rows selected

SQL> select * from  V$PWFILE_USERS;

no rows selected

当remote_login_passwordfile为none时查询v$pwfile_users视图是查询不到被授予sysdba权限的用户记录
密码文件orapwjycs存在

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 10:15:06 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied

远程登录是不能连接到数据库

当remote_login_passwordfile为exclusive时

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
remote_login_passwordfile            string      EXCLUSIVE
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 2560 Apr  4 09:56 spfilejycs.ora
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs

将密码文件orapwjycs删除

[oracle@jyrac1 dbs]$ mv orapwjycs orapwjycs.bak
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 2560 Apr  4 09:56 spfilejycs.ora
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs.bak

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 09:59:46 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
ERROR:
ORA-01031: insufficient privileges

远程登录时是连接不了数据库的
现在恢复密码文件orapwjycs

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 09:58:49 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
已连接。

远程登录是能连接数据库

当remote_login_passwordfile为shared时

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
remote_login_passwordfile            string      SHARED

删除密码文件orapwjycs

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora
[oracle@jyrac1 dbs]$ mv orapwjycs orapwjycs.bak
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs.bak
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 10:10:56 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
ERROR:
ORA-01031: insufficient privileges

远程登录时是连接不了数据库

现在恢复密码文件orapwjycs

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs.bak
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora
[oracle@jyrac1 dbs]$ mv orapwjycs.bak orapwjycs
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 10:12:24 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
已连接。

远程登录能连接到数据库

注意:如果remote_login_passwordfile设置为shared是不能修改sys用户的密码的如果你试图修改就会返回错误信息.

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------
remote_login_passwordfile            string      SHARED
SQL> alter user sys identified by "zzh_2046";
alter user sys identified by "zzh_2046"
*
ERROR at line 1:
ORA-28046: Password change for SYS disallowed

保持管理员密码与数据字典同步
如果你将remote_logic_passwordfile初始化参数从none改成exclusive或shared或者使用不同的sys用户的密码来重新创建密码文件,那么必须要确保sys用户在数据字典中的密码与密码文件中的密码是相同的.

为了同步sys用户密码可以使用alter user语句来改变sys用户密码.alter user语句会更新和同步数据字典和密码文件中的密码

为了同步以sysdba或sysoper权限来登录数据库的非sys用户的密码,必须先回收这些权限然后再重新授权:
1.找到所有已经被授予sysdba权限的所有用户

SQL> select * from  V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                            TRUE  TRUE  FALSE
OE                             TRUE  FALSE FALSE

SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

USERNAME
------------------------------
OE

2.回收这些非sys用户的sysdba权限然后再重新授予sysdba权限

SQL> revoke sysdba from oe;

Revoke succeeded.

SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

no rows selected

SQL> grant sysdba to oe;

Grant succeeded.

SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

USERNAME
------------------------------
OE

3.找出所有已经被授予sysoper权限的所有用户
SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != ‘SYS’ AND SYSOPER=’TRUE’;

4.回收非sys用户的sysoper权限然后再重新授予sysoper权限
REVOKE SYSOPER FROM non-SYS-user;
GRANT SYSOPER TO non-SYS-user;

向密码文件添加用户
当你给用户授予sysdba或sysoper权限后,这个用户的用户名和权限信息将被添加到密码文件中.如果服务器没有一个exclusive密码文件(也就是说初始化参数remote_login_passwordfile被设置为none或shared,或者密码文件丢失),如果你试图授予这些权限时oracle数据库会返回一个错误信息.

只要用户有这两个权限中一个这个用户的用户名就会保留在密码文件中.如果你回收这些权限,那么oracle数据库会从密码文件中删除这些用户.

创建一个密码文件并向密码文件中添加用户
1.使用orapwd工具创建密码文件
orapwd命令的语法如下:
ORAPWD FILE=filename [ENTRIES=numusers] [FORCE={Y|N}] [IGNORECASE={Y|N}]

2.设置初始化参数remote_login_passwordfile为exclusive(这是缺省值)
注意:remote_login_passwordfile是一个静态初始化参数因此在不重新启动数据库的情况下是不能修改这个参数的.

3.使用有sysdba权限的用户连接到数据库

SQL>conn sys/zzh_2046 as sysdba

4.启动数据库

SQL> startup
ORACLE instance started.

Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             385880016 bytes
Database Buffers          234881024 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.

5.创建必要的用户授予sysdba或sysoper权限

SQL> create user test identified by test;

User created.

SQL> grant sysdba to test;

Grant succeeded.

SQL> grant sysoper to test;

Grant succeeded.

SQL> select * from  V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                            TRUE  TRUE  FALSE
OE                             TRUE  FALSE FALSE
TEST                           TRUE  TRUE  FALSE

授予和回收sysdab和sysoper权限
如果你的服务器使用一个exclusive密码文件,使用grant语句给用户授予sysdba或sysoper系统权限,例如:
SQL>grant sysdba to oe;

使用revoke语句来回收用户的sysdba或sysoper系统权限,例如:
SQL>revoke sysdba from oe;

因为sysdba和sysoper是最强大的数据库权限,在grant语句中没有使用with admin option选项.也就是被授予权限的用户不能给其它的用户授予sysdba或sysoper权限.只能有一个以sysdba权限的用户连接到数据库能授予或回收其它用户的sysdba或sysoper系统权限.这些权限不能被授予角色,因为角色只能在数据库启动后才可用.不要将sysdba和sysoper数据库权限与操作系统角色混淆.

查看密码文件成员
使用v$pwfile_users视图来查看哪些被授予sysdba或sysoper或sysasm系统权限的用户.这个视图会显示以下信息:
username:这个列包含了由密码文件识别的用户的用户名
sysdba:如果这个列为true那么用户可以使用sysdba系统权限来登录数据库
sysoper:如果这个列为true那么用户可以使用sysoper系统权限来登录数据库
sysasm:如果这个列为true那么用户可以使用sysasm系统权限来登录数据库
注意:sysasm只用于oracle asm实例

维护密码文件
维护密码文件包括以下操作:
1.如果密码文件填充满后扩展密码文件用户数
2.删除密码文件

扩展密码文件用户数
当你向用户授予sysdba或sysoper系统权限因为密码文件已经填充满了而返回一个错误信息那么必须创建一个更大的密码文件并重新给用户授予权限.

替换密码文件
使用一面的过程来替换密码文件:
1.通过查询v$pwfile_users视图来识别哪些用户有sysdba或sysoper权限

2.删除已经存在的密码文件

3.使用orapwd工具来创建一个新的密码文件.确保entries参数的值比你认为将来使用的值要大

4.向密码文件中添加用户

删除密码文件
如果你判断你将不需要使用密码文件来审计用户,可以删除密码文件,然后重新设置remote_login_passwordfile初始化参数为none.在删除密码文件之后,只有哪些由操作系统验证的用户能执行sysdba或sysoper数据库管理操作.

发表评论

电子邮件地址不会被公开。