Oracle的口令管理
编者按: 验证口令,获得访问授权,这是目前最常用的访问控制手段, Oracle 数据库 也采用这样的 安全 策略。在这一策略中,口令的管理是关键,然而要做好这项工作,既保证数据的安全也保证用户使用方便却并非易事。 在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;
gr
ant CREATE SESSION to TESTUSER;
如果连续3次与TestUser账户的连接失败,该账户将自动被Oracle锁定。此后当输入TestUser账户的正确口令时,会收到一条错误信息:
ERROR:ORA-28000: the a
clearcase/" target="_blank" >ccount 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”命令不允许对用户设置的新口令设置限期日期。要设置的话,必须使用前面例子中的PASSW??????餀??????ORD_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 UNLI
MITED;
如果用户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口令管理方面来提高数据库的安全性。数据库的安全性还包括许多内容,如权限的分配、角色的管理、数据库的审计等,搞好数据库的安全是一项很复杂的工作,希望本文能给读者一定的启发,起到抛砖引玉的功效。
原文转自:http://www.ltesting.net
|