如何关闭 Oracle 密码过期?
Posted
技术标签:
【中文标题】如何关闭 Oracle 密码过期?【英文标题】:How do I turn off Oracle password expiration? 【发布时间】:2010-11-08 21:55:50 【问题描述】:我正在使用 Oracle 进行开发。我一直用来重建数据库的引导帐户的密码已过期。
如何永久关闭此用户(和所有其他用户)的密码过期?
我使用的是 Oracle 11g,默认密码过期。
【问题讨论】:
我认为你最好在 serverfault.com 上问这个问题。我不会强迫它,因为您确实说过您将它用于开发,而且我认为这里的某个人仍然有机会知道和/或这里的其他人可能会从这些信息中受益。 我想我会这样做。我正在讨论它更适合哪个站点,因为这是一个基本的数据库问题,而不是 DBA 问题。 不确定跨站点问题的欺骗政策是什么,但这里是链接:serverfault.com/questions/37622/… 【参考方案1】:要更改 Oracle 中某个用户配置文件的密码过期策略,首先检查用户正在使用哪个配置文件:
select profile from DBA_USERS where username = '<username>';
然后您可以使用以下方法将限制更改为永不过期:
alter profile <profile_name> limit password_life_time UNLIMITED;
如果您想预先检查您可以使用的限制:
select resource_name,limit from dba_profiles where profile='<profile_name>';
【讨论】:
这改变了配置文件。但是,我有一些用户的密码设置为过期,因为默认配置文件在创建时就是这样。如何更改这些用户帐户以使密码不会过期?select username,expiry_date,account_status from dba_users;
查看 account_status。对于那些即将到期的帐户,您可能需要最后一次重置密码。
alter user aaa account unlock;
为了完整起见,如果您需要将用户更改为另一个配置文件:ALTER USER Bob PROFILE MyNonExpiringProfile;
。
在查询“select profile from DBA_USERS where username = '对于开发,如果没有设置其他配置文件,您可以禁用密码策略(即在默认配置中禁用密码过期):
ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;
然后,重置密码并解锁用户帐户。它永远不会再次过期:
alter user user_name identified by new_password account unlock;
【讨论】:
【参考方案3】:正如其他答案所述,适当地更改用户的个人资料(例如“DEFAULT”个人资料)将导致密码一旦设置,就永远不会过期。
但是,正如一位评论者指出的那样,在配置文件的旧值下设置的密码可能已经过期,并且(如果在配置文件指定的宽限期之后)帐户被锁定。
锁定帐户的过期密码的解决方案(如回复评论中提供的)是使用 ALTER USER 命令的一个版本:
ALTER USER xyz_user ACCOUNT UNLOCK;
但是,解锁命令仅适用于帐户实际被锁定的帐户,但不适用于处于宽限期的帐户,即密码已过期但帐户尚未锁定的帐户。对于这些帐户,必须使用其他版本的 ALTER USER 命令重置密码:
ALTER USER xyz_user IDENTIFIED BY new_password;
下面是一个小的 SQL*Plus 脚本,特权用户(例如用户 'SYS')可以使用它来将用户的密码重置为存储在数据库中的当前现有哈希值。
编辑:旧版本的 Oracle 将密码或密码哈希存储在 pword 列中,较新版本的 Oracle 将密码哈希存储在 Spare4 列中。下面的脚本改为收集pword 和spare4 列,但使用spare4 列重置用户帐户;根据需要进行修改。
REM Tell SQL*Plus to show before and after versions of variable substitutions.
SET VERIFY ON
SHOW VERIFY
REM Tell SQL*Plus to use the ampersand '&' to indicate variables in substitution/expansion.
SET DEFINE '&'
SHOW DEFINE
REM Specify in a SQL*Plus variable the account to 'reset'.
REM Note that user names are case sensitive in recent versions of Oracle.
REM DEFINE USER_NAME = 'xyz_user'
REM Show the status of the account before reset.
SELECT
ACCOUNT_STATUS,
TO_CHAR(LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE,
TO_CHAR(EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE
FROM
DBA_USERS
WHERE
USERNAME = '&USER_NAME';
REM Create SQL*Plus variable to hold the existing values of the password and spare4 columns.
DEFINE OLD_SPARE4 = ""
DEFINE OLD_PASSWORD = ""
REM Tell SQL*Plus where to store the values to be selected with SQL.
REM Note that the password hash value is stored in spare4 column in recent versions of Oracle,
REM and in the password column in older versions of Oracle.
COLUMN SPARE4HASH NEW_VALUE OLD_SPARE4
COLUMN PWORDHASH NEW_VALUE OLD_PASSWORD
REM Select the old spare4 and password columns as delimited strings
SELECT
'''' || SPARE4 || '''' AS SPARE4HASH,
'''' || PASSWORD || '''' AS PWORDHASH
FROM
SYS.USER$
WHERE
NAME = '&USER_NAME';
REM Show the contents of the SQL*Plus variables
DEFINE OLD_SPARE4
DEFINE OLD_PASSWORD
REM Reset the password - Older versions of Oracle (e.g. Oracle 10g and older)
REM ALTER USER &USER_NAME IDENTIFIED BY VALUES &OLD_PASSWORD;
REM Reset the password - Newer versions of Oracle (e.g. Oracle 11g and newer)
ALTER USER &USER_NAME IDENTIFIED BY VALUES &OLD_SPARE4;
REM Show the status of the account after reset
SELECT
ACCOUNT_STATUS,
TO_CHAR(LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE,
TO_CHAR(EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE
FROM
DBA_USERS
WHERE
USERNAME = '&USER_NAME';
【讨论】:
感谢您的帮助。很难找到相关的答案。其他所有答案仅指 PASSWORD_LIFE_TIME。 SYS.USER$.PASSWORD 列将仅包含不区分大小写(大写?)版本的密码的哈希值。在 Oracle 11 中,除非您设置系统参数 SEC_CASE_SENSITIVE_LOGON=FALSE,否则 SYS.USER$.SPARE4 列中的区分大小写密码的哈希值会更长。 感谢您在宽限期状态下解决此案【参考方案4】:我相信默认情况下密码过期行为是永不过期。但是,您可以为您的开发用户集设置配置文件并设置PASSWORD_LIFE_TIME
。有关详细信息,请参阅orafaq。您可以查看here 了解一个人的观点和用法的示例。
【讨论】:
我认为在全新的 11g 安装(而不是升级)中,建议提高安全性,密码将默认在 30 天后过期。 在 11g 上是 180 天:docs.oracle.com/cd/E38689_01/pt853pbr0/eng/pt/tadm/…【参考方案5】:我建议关闭密码过期不是一个好主意,因为它可能对数据的机密性、完整性和可用性造成威胁。
如果你愿意的话。
如果您有适当的访问权限,请使用以下 SQL
从 dba_users 中选择用户名、帐户状态;
这应该会给你这样的结果。
USERNAME ACCOUNT_STATUS
------------------------------ -----------------
SYSTEM OPEN
SYS OPEN
SDMADM OPEN
MARKETPLACE OPEN
SCHEMAOWNER OPEN
ANONYMOUS OPEN
SCHEMAOWNER2 OPEN
SDMADM2 OPEN
SCHEMAOWNER1 OPEN
SDMADM1 OPEN
HR EXPIRED(GRACE)
USERNAME ACCOUNT_STATUS
------------------------------ -----------------
APEX_PUBLIC_USER LOCKED
APEX_040000 LOCKED
FLOWS_FILES LOCKED
XS$NULL EXPIRED & LOCKED
OUTLN EXPIRED & LOCKED
XDB EXPIRED & LOCKED
CTXSYS EXPIRED & LOCKED
MDSYS EXPIRED & LOCKED
现在您可以使用 Pedro Carriço 回答 https://***.com/a/6777079/2432468
【讨论】:
虽然我同意在生产环境中禁用密码过期是轻率的做法,但我们可能希望在开发或测试中将其关闭。【参考方案6】:对于那些将 Oracle 12.1.0 用于开发目的的人: 我发现上述方法对 db user: "system" 没有影响,因为 account_status 将保持在 expired-grace 期间。 最简单的解决方案是我使用 SQL Developer: 在 SQL Developer 中,我必须转到:View / DBA / Security,然后是 Users / System,然后在右侧:Actions / Expire pw,然后:Actions / Edit,我可以取消选中过期选项。 这清除了 account_status,再次显示 OPEN,SQL Developer 不再显示 ORA-28002 消息。
【讨论】:
以上是关于如何关闭 Oracle 密码过期?的主要内容,如果未能解决你的问题,请参考以下文章