编者按: 验证口令,获得访问授权,这是目前最常用的访问控制手段,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”命令不允许对用户设置的新口令设置限期日期。要设置的话,必须使用前面例子中的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 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”命令。如果改变了缺省环境文件,那么数据库中所有使用缺省环境文件的用户都会受到影响。
要注意