薇姿喷雾可以定妆吗:修改Oracle用户密码

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 14:21:04
http://rainteen.blog.163.com/blog/static/1186977472009511113951557/

有时候我们可能不知道一个用户的密码,但是又需要以这个用户做一些操作,又不能去修改掉这个用户的密码,这个时候,就可以利用一些小窍门,来完成操作。

具体操作过程如下:

SQL*Plus: Release 9.2.0.5.0 - Production on 星期日 11月 21 13:32:34 2004

Copyright (c) 1982, 2002, Oracle Corporation.    All rights reserved.

SQL> connect sys/oracle as sysdba

已连接。

SQL> select username,password from dba_users;

USERNAME                         PASSWORD

------------------------------ ------------------------------

SYS                              8A8F025737A9097A

SYSTEM                           2D594E86F93B17A1

DBSNMP                           E066D214D5421CCC

TOAD                             A1BA01CF0DD82695

OUTLN                            4A3BA55E08595C81

WMSYS                            7C9BA362F8314299

已选择6行。

SQL> connect system/oracle

已连接。

SQL> connect sys/oracle as sysdba

已连接。

修改用户system密码为manager

SQL> alter user system identified by manager;

用户已更改。

SQL>    select username,password from dba_users;

USERNAME                         PASSWORD

------------------------------ ------------------------------

SYS                              8A8F025737A9097A

SYSTEM                           D4DF7931AB130E37

DBSNMP                           E066D214D5421CCC

TOAD                             A1BA01CF0DD82695

OUTLN                            4A3BA55E08595C81

WMSYS                            7C9BA362F8314299

已选择6行。

SQL> connect system/manager

已连接。

然后此时可以做想要做的任何操作了

SQL> connect sys/oracle as sysdba

已连接。

修改用户system密码为以前的值

SQL> alter user system identified by values '2D594E86F93B17A1';

用户已更改。

SQL> connect system/oracle

已连接。

SQL> connect sys/oracle as sysdba

已连接。

SQL> connect system/manager

ERROR:

ORA-01017: invalid username/password; logon denied

警告: 您不再连接到 ORACLE。

=================================================================
一个生成Oracle用户密码的通用小程序

      做为Unix 系统管理员,Oracle 数据库管理员,Oracle ERP 应用系统管理员,需要不定期地更改各系统中重要用户的密码,以保证系统及数据的安全。  
   但是,由于所管理的小型机及数据库、应用系统较多,每月更改近百个用户的密码,不论是密码的生成,还是密码的更改,工作量均很大,尤其是密码的生成,为了加强安全性,密码不能太简单,最好为字母与数字的随机组合。但大量的密码,若不借助自动生成,则其编排是Oracle ERP 系统中应用系统用户(指各子系统的用户,非指具体应用用户)同时也是Oracle 数据库用户(如应收模块,用户为 AR,AR既是数据库用户,又是应用用户),而且,只有 applsyspub(登录系统的公用用户),applsys(应用基础用户),apps(具体应用操作用户)为必须为应用系统中密码与数据库密码一致外,其它应用的数据库用户密码可以与应用系统中密码中不一致,只需在对应用系统进行打 patch 工作时才需将其改为一致。因而,可在打 patch 前,在应用系统中将应用系统用户密码修改为与数据库一致即可,平时不用修改其密码,这样一则减少了工作量,二则加强了系统的安全性。  
   更改数据库用户密码可通过在 sqlplus 执行 alter user identified by 密码 的命令而实现,因而,可以通过自动生成密码脚本的方式,高效地完成密码的更改工作。而 Unix 用密码则由于需由管理员负责更改密码的并不多,故可在自动生成后,手工进行修改。  
   为了生成较为复杂的密码,同时提高工作效率,我用 Excel 自带的 VBA 编写了一个小脚本,运行该程序,则自动生成一个更改用户密码的脚本,同时,将用户密码记录在工作表上,以便于打印出来,保存在密码本中,做为记录。 首先,需在工作表中第一列输入各个要修改密码的数据库用户的用户名,在第三列输入各然后,运行脚本 gen_pass_oracle ,则自动生成Oracle 用户的相应的密码;运行脚本 gen_pass_unix ,则自动生成unix 操作系统用户的相应的密码。生成的Oracle 数据库用户密码保存在 change_pass.sql 中,可在 sqlplus 中调用该脚生成的Unix 用户密码保存在 change_pass.txt 中,需手工逐个地更改密码。  
   可通过在程序首部修改 pass_length 的值的方法,确定生成的密码的长度;可通过在程序首部修改 start_asc 的方法,确定密码的组成 0-9,A-Z还是仅 A-Z 其主要实现为:通过检查工作表中每一行第1列(或第3列)是否为空,判断是否结束密码生成工作。若非空,即有用户名,则进行循环,生成在程序头部定义的指定长度的密码串。密码串中的字符为通过起始字符的 ascii 值加上随机数产生的随机值得到的新的 ascii 值,再将其转换为字符型,并加入密码串中。当密码串的长度达到指定长度时,将其组合为一个 sql 语句写入文件中,同时,在该行的第2列(或第4列)中写入该密码串。 同时,考虑到在 Excel 中会将“=”开头的字符串当作公式对待,故,在生成密码串时,将等于"="的ascii 值过滤。用类似方法,可使生成的密码串中不包含其它不想包含的字符。

   通过使用这种方式,生成并修改密码的工作量得到大大减少,安全性得到提高。  
   实际上,这种方法产生的密码不限于 unix 与 Oracle, 可用于各种操作系统中重要用户
   Sub gen_pass_app()  
   Dim bit_count as integer ’循环变量, 密码中位数计数器  
   dim row_num as integer ’需生成密码的用户名信息开始的行号  
   dim rnd_base As Integer ’随机数种子  
   Dim char_value As Integer ’密码中每个字符的 ascii 值  
   Dim temp_str As String ’密码串  
   Dim username(50) As String ’用户名  
   dim pass_length as integer ’定义生成的密码的长度  
   dim start_asc as integer ’ 定义从哪个字符开始生成  
   pass_length = 8 ’ 设定密码长度为 8 位  
   Rem start_asc = 48 ’ 设定密码从 0 开始  
   start_asc = 65 ’ 设定密码从 A 开始  
   rem 由于 Oracle 数据库用户密码不区分大小写,故,视所选择的起始字母,决定随机数
   rnd_base = 90 - start_asc  
     
   rem 打开文件,用于输出生成的改密码的脚本  
   Open "c:change_pass.sql" For Output As #1  
   rem 同时,在工作表上记录相应的密码,以便打印出来备作为记录,此处为先写标题  
   Cells(1, 1) = "Username": Cells(1, 2) = "Password"  
   Cells(1, 3) = "Username": Cells(1, 4) = "Password"  
   rem 先生成 apps 的密码,但脚本中加上注释,因 apps密码必须与应用程序一起改  
   rem 先初始化密码串为空白  
   temp_str = ""  
   For bit_count = 1 To pass_length  
   char_value = start_asc + Int(Rnd(1) * rnd_base)  
   rem 此处为为防=号引起 excel 误认为是公式,从而程序出错。  
   If char_value = 61 Then  
   char_value = 62  
   End If  
   rem 组合成密码  
   temp_str = temp_str + Chr$(char_value)  
   Next bit_count  
   rem 将生成的 apps 密码输出到脚本文件  
   Print #1, "REM alter user apps" + " identified by " + temp_str + ";"  
   rem 同时,记录在工作表上  
   Cells(2, 3) = "APPS": Cells(2, 4) = temp_str  
   rem 需生成密码的用户名从 row_num 行开始  
   row_num = 2  
   rem 若第一列非空,则创建密码,否则退出   Do While Cells(row_num, 1) <> ""  
   temp_str = ""  
   For bit_count = 1 To pass_length  
   char_value = start_asc + Int(Rnd(1) * rnd_base)  
   If char_value = 61 Then  
   char_value = 62  
   End If  
   temp_str = temp_str + Chr$(char_value)  
   Next bit_count  
   Print #1, "alter user " + Cells(row_num, 1) + " identified by " + temp_str +  
   Cells(row_num, 2) = temp_str  
   rem 获取下一行  
   row_num = row_num + 1  
   Loop  
   rem 所有用户的密码已生成,关闭文件  
   Close #1  
   End Sub  
     
   Sub gen_pass_unix()  
  Dim bit_count as integer ’循环变量, 密码中位数计数器  
   dim row_num as integer ’需生成密码的用户名信息开始的行号  
   dim rnd_base As Integer ’随机数种子  
   Dim char_value As Integer ’密码中每个字符的 ascii 值  
   Dim temp_str As String ’密码串  
   Dim username(50) As String ’用户名  
   dim pass_length as integer ’定义生成的密码的长度  
   dim start_asc as integer ’ 定义从哪个字符开始生成  
   pass_length = 8  
   start_asc = 48 ’ 0  
   Rem start_asc = 65 ’ A  
   rem 由于 unix 密码支持大小写,故,视所选择的起始字母,决定随机数的范围,以确保
   rnd_base = 122 - start_asc  
     
   rem 打开文件,用于输出生成的改密码的脚本  
   Open "c:change_pass.txt" For Output As #1  
  rem 同时,在工作表上记录相应的密码,以便打印出来备作为记录,此处为先写标题  
   Cells(1, 3) = "Username": Cells(1, 4) = "Password"  
   row_num = 2  
   rem 若第三列非空,则创建密码,否则退出   Do While Cells(row_num, 3) <> ""  
   temp_str = ""  
   For bit_count = 1 To pass_length  
   char_value = start_asc + Int(Rnd(1) * rnd_base)  
  rem 91-94 为 [ ] ^ _ `  
   rem 因不愿在unix 密码串中包含该类字符,故,通过减少已增大的计数器以保证密码的长度,同时,不将其计入密码串中,以排除它们  
   If (char_value >= 58 And char_value <= 64) Or (char_value >= 91 And char_value <= 96) Then  
   bit_count = bit_count - 1  
   Else  
   temp_str = temp_str + Chr$(char_value)  
   End If  
   Next bit_count  
   Print #1, "user " + Cells(row_num, 1) + " : " + temp_str  
   Cells(row_num, 4) = temp_str  
   rem 获取下一行  
   row_num = row_num + 1  
   Loop  
   rem 所有用户的密码已生成,关闭文件  
   Close #1  
   End Sub

 

=============================================================

Oracle的口令管理

编者按: 验证口令,获得访问授权,这是目前最常用的访问控制手段,Oracle数据库也采用这样的安全策略。在这一策略中,口令的管理是关键,然而要做好这项工作,既保证数据的安全也保证用户使用方便却并非易事。
  
  在Oracle数据库中,若要访问数据,必须先具有该数据库的一个账户。这个访问可以是直接访问(通过一个数据库的用户连接)或间接访问(通过在数据库链接中预设权限的访问)。每个账户必须有一个与其相关的口令,一个数据库账户可以连接到一个操作系统账户上。
  
  口令是在创建用户账户时为每一用户设置的,并可在该账户创建后对它们进行变更。用户变更账户口令的能力受他访问工具权限的限制。数据库以加密的形式将口令存储在一个数据字典表中。如果账户直接与操作系统账户相关,就可以旁路口令检查。在Oracle 8i中,口令可以无效。数据库管理员可以建立能重复使用口令的条件(通过一个数据库口令历史设置值),也可以使用环境文件为口令制定标准,如最小长度,或如果连续多次与账户连接不成功,就可以自动锁定账户。
  
  环境文件
  可以使用环境文件来限制用户能使用的系统和数据库资源,并管理口令限制。如果数据库中没有创建环境文件,将使用缺省环境文件(Default)。缺省环境文件对于所有用户资源没有限制,表1列出了可以通过环境文件限制的资源。
    
    (注: PASSWORD_REUSE_MAX和PASSWORD_REUSE_TIME互不相容,如果其中一个资源设置成一个值,另一个必须设置成Unlimited。)
  
  如表1所示,许多资源都可以被限制,在用户超过资源限制前不会发生任何动作,一旦到达限值, SQL语句就被停止。
  
  环境文件是通过“create profile”命令创建的,可以用“alter profile”命令修改。下例所示的“alter profile”命令用于修改现有的环境文件。在这个例子中,数据库的缺省环境文件被修改成允许最大空闲时间为1小时:
  
  alter profile DEFAULT limit idle_time 60;
  
  在Oracle 8i中,可以使用环境文件来管理口令的终止、重新使用和复杂性。例如,可以限制一个口令的寿命、锁定口令过旧的账户,也可以强制一个口令至少有一定程度的复杂性,并锁定一个多次注册失败的账户。
  
  口令的锁定与过期
  FAILED_LOGIN_ATTEMPTS用于设定账户允许的尝试次数,可以防止恶意人员无限制地尝试账户口令来破解口令。例如,如果设置用户环境文件的FAILED_LOGIN_ATTEMPTS资源为3,该账户允许连续注册失败3次,第4次失败就会引起账户被锁定。
  
  在下面的例子中,创建一个供用户TestUser使用的TEST_PROFILE环境文件:
  
  create profile TEST_PROFILE limit
  
  FAILED_LOGIN_ATTEMPTS 3;
  
  create user TESTUSER identified by abcd1234
  
  profile TEST_PROFILE;
  
  grant CREATE SESSION to TESTUSER;
  
  如果连续3次与TestUser账户的连接失败,该账户将自动被Oracle锁定。此后当输入TestUser账户的正确口令时,会收到一条错误信息:
  
  ERROR:ORA-28000: the account is locked
  
  要对账户解锁,可在数据库管理员账户中使用“alter user”命令的account unlock子句,如下所示:
  
  alter user TESTUSER account unlock;
  
  账户解锁后,TestUser账户再一次被允许连接。可以通过“alter user”命令的account lock子句来手动锁定一个账户。
  
  alter user TESTUSER account lock;
  
  若一个账户由于多次连接失败而被锁定,当超过其环境文件的PASSWORD_LOCK_TIME值时将自动解锁。例如,如果PASSWORD_LOCK_TIME设为1,前面例子中的TestUser账户就被锁定1天,过后账户即被自动解锁。
  
  可以通过环境文件中的PASSWORD_LIFE_TIME资源建立一个口令的最大期限。例如,可以强制TEST_PROFILE环境文件的用户每30天改变一次口令。
  
  alter profile TEST_PROFILE limit
  
  PASSWORD_LIFE_TIME 30;
  
  在这个例子中,“alter profile”命令用于修改TEST_PROFILE环境文件。PASSWORD_LIFE_TIME值设为30,因此使用这个环境文件的每个账户在30天后口令就会过期。如果口令过期,就必须在下次注册时修改它,除非环境文件对过期的口令有一特定的宽限期。宽限期参数叫做PASSWORD_GRACE_TIME,如果在宽限期内没有修改口令,账户就会过期。
  
  (注: 如果使用PASSWORD_LIFE_TIME参数,就必须为用户提供一种便于其改变口令的方法。)
  
  “过期”账户与“锁定”账户不同。锁定账户会随着时间的推移自动解锁,而过期账户需要通过数据库管理员人工干预才能重新激活。
  
  (注:如果使用口令过期特性,就要确保拥有应用程序的账户具有不同的环境文件设置值,否则它们会被锁定,使得应用程序不能使用。)
  
  如前面例子所述,若要重新恢复一个过期账户,需使用“alter user”命令。在这个例子中,用户TestUser首先由数据库管理员手工使其口令过期。
  
  alter user TESTUSER password expire;
  
  接着,TestUser试图连接其账户。当他输入口令时,立即被提示输入账户的新口令。
  
  也可以使用“create user”命令的“password expire”子句,强制用户在第一次访问时修改口令。不过“create user”命令不允许对用户设置的新口令设置限期日期。要设置的话,必须使用前面例子中的PASSWORD_LIFE_TIME环境文件参数。
  
  若要查看任一账户的口令限期,可查询DBA_USERS数据字典视图的Expire_Date列。若用户自己想查看,可查询USER_USERS数据字典视图的Expiry_Date列(通过SQL*Plus或一个基于客户机的查询工具)。
  
  防止口令重新使用
  若要防止一个口令被重新使用,可以使用两个环境文件参数的其中一个: PASSWORD_REUSE_MAX或PASSWORD_REUSE_TIME。这两个参数互不相容,如果给其中的一个设置了值,另一个就必须设为Unlimited。
  
  PASSWORD_REUSE_TIME参数规定一个口令可以重新使用前必须经过的天数。例如,如果设置PASSWORD_REUSE_TIME为60天,则在60天内不能使用同一个口令。
  
  PASSWORD_REUSE_MAX参数指定一个口令可以重新使用前必须对其改变的次数。如果试图在这个限制到达前重新使用该口令,Oracle会拒绝口令的修改。
  
  例如,可以为本章前面创建的TEST_PROFILE环境文件设置一个PASSWORD_REUSE_MAX参数。
  
  alter profile TEST_PROFILE limit
  
  PASSWORD_REUSE_MAX 3
  
  PASSWORD_REUSE_TIME UNLIMITED;
  
  如果用户TestUser现在试图重新使用一个最近的口令,修改口令就会失败。例如,如下修改口令:
  
  alter user TESTUSER identified by eye123;
  
  然后再次改变它:
  
  alter user TESTUSER identified by eye456;
  
  在下次修改口令时,试图重新使用最近的口令,就会失败。他不能重新使用任何他最近用过口令,必须提供一个新口令。
  
  口令历史被存储在SYS模式下一个叫USER_HISTORY$的表中。在这个表中,Oracle存储了用户资源识别符、加密的口令值和创建该口令的日期/时间标记。当PASSWORD_REUSE_TIME值已过期或口令修改次数超过PASSWORD_REUSE_MAX值时,这个老的口令记录就从SYS.USER_HISTORY$表中删除。如果一个新的密码与现有的密码一样,这个新口令就被拒绝。
  
  由于老口令存储在SYS拥有的一个表中,所以数据存储在System表空间中。因此,如果要为频繁修改口令的大量用户保留非常大的口令历史,口令历史表SYS.HISTORY$所需的空间就会影响System表空间的空间需求。
  
  设置口令复杂度
  可以强制用户的口令符合复杂度标准。例如,可以要求口令的最小长度,限制不能是一些简单的词,至少包括一个数字或标点符号等。“create profile”和“alter profile”命令的PASSWORD_VERIFY_FUNCTION参数指定用于评估口令的函数名。如果用户提出的口令不符合要求,就不会被接受。例如,可以拒绝“abcde”和“eye”作为口令,因为它们未包含任何数字值。为简化实施口令复杂度的过程,Oracle提供了一个函数VERIFY_FUNCTION。在缺省情况下,不创建这个函数。只有在运行utlpwdmg.sql脚本文件(该文件位于Oracle软件主目录下的/rdbms/admin子目录中)时才创建VERIFY_FUNCTION函数(注意这个函数应当在SYS模式下创建)。
  
  函数中的前三个条件子句检查口令是否与用户名相同,是否少于4个字符,是否是一组特定的词之一。可以任意修改这些检查或增加你的要求。例如,安全原则可能要求口令最少有六个字符,运行前要简单地更新部分utlpwdmg.sql文件。
  
  函数的下一个主要部分是对口令字符串内容的三段检查。要通过这些检查,口令中至少要包含一个字符、一个数字和一个标点符号。同前面的检查一样,它们是可以编辑的。例如,可以不要求用户在其口令中使用标点符号,只要简单地绕过那部分口令检查就可以。
  
  函数的下一部分是将新口令与老口令逐字符进行比较。如果它们之间的不同之处少于三处,新口令将不予接受。
  
  这个脚本文件中最后一条命令不属于该函数,它是一条改变缺省环境文件的“alter profile”命令。如果改变了缺省环境文件,那么数据库中所有使用缺省环境文件的用户都会受到影响。
  
  要注意的是,VERIFY_FUNCTION函数并不进行任何数据库访问,也不更新任何数据库值。如果修改这个函数,应确保此修改不需要进行数据库访问或修改。
  
  可以修改缺省的环境文件以便在不修改口令过期参数的情况下使用VERIFY_FUNCTION函数。
  
  alter profile DEFAULT limit
  
  PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION;
  
  如果修改缺省环境文件,要确保该环境文件的所有用户都能成功地使用它。例如,如果SYS和System用户使用它,能否按这里指定的设置值来处理其口令呢?这里可能要创建一个新的环境文件,并将该文件指定给非数据库管理员的用户和非应用程序拥有者的用户来简化环境文件管理。这种方法存在的问题是:要记住给所有新用户指定新的环境文件。用户管理活动越标准化,实现这种处理越方便。
  
  口令验证函数的名字不一定是VERIFY_FUNCTION。由于VERIFY_FUNCTION的名字几乎每个函数都用到,所以应当将其改为有意义的一个名字。例如,可以将其改为VERIFY_Oracle_PASSWORD,应当给它一个描述性的、容易记忆的名字,这样做可以方便其他数据库管理员对程序所执行的函数的理解。
  
  结束语
  以上讲述的是从Oracle口令管理方面来提高数据库的安全性。数据库的安全性还包括许多内容,如权限的分配、角色的管理、数据库的审计等,搞好数据库的安全是一项很复杂的工作,希望本文能给读者一定的启发,起到抛砖引玉的功效。