Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
如何防止 Amazon RDS for Oracle 数据库实例的主用户账户被锁定?
我希望防止 Amazon Relational Database Service (Amazon RDS) for Oracle DB 实例的主用户账户被锁定。
解决方法
Amazon RDS 中的主用户账户对于监控、管理和执行管理任务以运行数据库实例至关重要。此账户是您的第一个数据库账户,它包括维护和操作数据库所需的管理角色和权限。有关主用户为每个数据库引擎获取的权限和角色的完整列表,请参阅主用户账户权限。如果主用户账户被锁定并且您无法登录,那么您的管理能力将受到干扰,并且关键业务运营可能会受到影响。您可以使用 Amazon RDS 控制台或其他数据库账户重新获得对主账户的访问权限。
确定根本原因
主用户账户锁定的常见原因之一是您将自定义配置文件设置应用于主账户。其中一些设置包括:
- **FAILED_LOGIN_ATTEMPTS:**当连续尝试登录主账户的失败次数超过为此参数设置的值时,该账户将被锁定。
- **PASSWORD_LIFE_TIME:**当使用特定密码的持续时间超过为此参数设置的值时,您将无法使用该密码登录账户,并且该账户将标记为已过期。您必须重置密码才能重新登录。如果您为 PASSWORD_GRACE_TIME 设置了值,并且在宽限期内没有更改密码,则密码将过期,并且后续连接将被拒绝。
- **INACTIVE_ACCOUNT_TIME:**如果主账户在此参数定义的连续天数内未登录数据库,则该账户将被锁定。此参数的最小值为 15 天。没有最大值。
有关密码参数的更多信息,请参阅 Oracle 文档中的 password_parameters。
请运行以下查询来检查主用户账户的当前配置文件设置,以确定账户被锁定的原因:
SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_type = 'PASSWORD' AND profile IN ( SELECT profile FROM dba_users WHERE username = 'EXAMPLE-MASTER-USERNAME' );
示例:
假设您创建了一个包含 FAILED_LOGIN_ATTEMPTS 设置的配置文件,它只允许输入一次错误密码。
SQL> CREATE PROFILE sec_profile LIMIT FAILED_LOGIN_ATTEMPTS 1; Profile created.
您可以通过运行以下查询将此配置文件应用于主用户:
SQL> ALTER USER EXAMPLE-MASTER-USERNAME PROFILE sec_profile; User altered.
断开与数据库的连接并退出 SQL*Plus:
SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.12.0.0.0
使用错误密码登录账户:
bash-4.2$ sqlplus EXAMPLE-MASTER-USERNAME@ora SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 14 13:16:33 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied
系统不允许后续登录,因为已将 FAILED_LOGIN_ATTEMPTS 设置为 1。相反,您会收到以下错误消息:
bash-4.2$ sqlplus EXAMPLE-MASTER-USERNAME@ora SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 14 13:16:44 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-28000: The account is locked.
如果主账户受 PASSWORD_LIFE_TIME 参数的限制,并且使用相同密码的持续时间超过为此参数设置的值,则在尝试登录时您会看到以下错误消息:
-bash-4.2$ sqlplus EXAMPLE-MASTER-USERNAME@ora SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 14 20:14:03 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-28001: the password has expired
解锁主账户
您可以使用以下任一方法解锁主账户:
使用 Amazon RDS 控制台或 AWS Command Line Interface (AWS CLI)
通过重置密码,您可以解锁账户,并在账户到期后重新打开它。有关更多信息,请参阅如何重置 Amazon RDS 数据库实例的主用户密码以解锁主用户?
使用其他数据库账户
如果您已拥有另一个具有 ALTER USER 权限的数据库账户(例如,EXAMPLE-USER),那么您可以使用该账户解锁主用户账户。
通过运行以下查询来标识具有 ALTER USER 权限的账户:
SELECT grantee, privilege FROM dba_sys_privs WHERE privilege = 'ALTER USER' AND grantee IN ( SELECT username FROM dba_users WHERE oracle_maintained = 'N' );
输出与以下内容类似:
GRANTEE PRIVILEGE -------------------------------------------------------------------------------------------------------------------------------- EXAMPLE-USER ALTER USER
请运行以下查询以标识通过角色授予权限的账户:
SELECT DISTINCT dba_users.username FROM dba_role_privs JOIN dba_users ON dba_role_privs.grantee = dba_users.username AND granted_role IN ( SELECT role FROM role_sys_privs WHERE privilege = 'ALTER USER' ) AND dba_users.oracle_maintained = 'N'
输出与以下内容类似:
USERNAME ----------------------------------------------------------------------------------- EXAMPLE-MASTER-USERNAME RDSADMIN USER1 EXAMPLE-USER
**注意:**请忽略输出中的 RDSADMIN,因为它是 RDS 内部账户。
使用账户 EXAMPLE-USER 连接到数据库:
-bash-4.2$ sqlplus EXAMPLE-USER@ora SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 14 13:35:55 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Tue Sep 14 2021 13:33:23 +00:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.12.0.0.0
通过运行以下查询来解锁主用户账户:
SQL> ALTER USER EXAMPLE-MASTER-USERNAME ACCOUNT UNLOCK; User altered.
如果密码已过期,请通过运行以下查询来重置密码:
SQL> ALTER USER EXAMPLE-MASTER-USERNAME IDENTIFIED BY EXAMPLE-MASTER-USER-NEW-PWD; User altered.
断开与数据库 EXAMPLE-USER 的连接并退出 SQL*Plus:
SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.12.0.0.0
您可以使用主用户账户成功登录。您将收到以下消息:
bash-4.2$ sqlplus EXAMPLE-MASTER-USERNAME@ora SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 14 13:36:36 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Tue Sep 14 2021 13:35:12+00:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.12.0.0.0 SQL> SHOW USER; USER is "EXAMPLE-MASTER-USERNAME"
**无法重置主账户的密码:**在某些情况下,您的主账户可能会阻止重置密码:
示例 1:
如果您对主账户使用相同密码的次数超过 PASSWORD_REUSE_MAX 参数定义的次数,则会在 Amazon RDS 控制台中看到以下事件:
Unable to reset your password. Error information: ORA-28007: the password cannot be reused ORA-06512: at line 1
要查看 RDS 实例的最新事件,请参阅查看 Amazon RDS 事件。
要解决此问题,请使用 Amazon RDS 控制台将主账户的密码重置为过去未使用过的新密码。此外,如果您拥有另一个具有 ALTER USER 权限的数据库账户,则可以登录该账户并更改密码。如果允许,请将主账户配置文件的 PASSWORD_REUSE_MAX 更新为“无限制”,以便您能够多次重复使用该密码。
示例 2:
假设主账户具有 PASSWORD_VERIFY_FUNCTION 参数设置来验证严格的密码策略,例如密码的最小长度或使用最小字符数的要求。当您尝试重置密码并且密码不符合定义的规则时,您可能会收到以下错误:
ORA-28003: password verification for the specified password failed.
要解决此问题,请确保新密码符合 PASSOWRD_VERIFY_FUNCTION 中定义的规则。
防止主用户账户被锁定
如果组织的安全策略允许,请避免为 RDS 主用户账户设置自定义配置文件,并保留默认配置文件。使用默认配置文件,您的主用户账户可提供无限制的失败登录尝试。此外,主用户账户的密码永远不会过期,也不会因处于非活动状态而被停用。然而,最佳做法是使用 Amazon RDS 控制台定期重置密码。
您可以通过运行以下查询来查看默认配置文件的限制:
SELECT resource_name, limit FROM dba_profiles WHERE resource_type = 'PASSWORD' AND profile = 'DEFAULT' AND resource_name IN ( 'FAILED_LOGIN_ATTEMPTS', 'PASSWORD_LIFE_TIME', 'PASSWORD_VERIFY_FUNCTION', 'INACTIVE_ACCOUNT_TIME', 'PASSWORD_REUSE_TIME', 'PASSWORD_REUSE_MAX' );
输出与以下内容类似:
RESOURCE_NAME LIMIT -------------------------------- -------------------------------------------------------------------------------------------------------------------------------- FAILED_LOGIN_ATTEMPTS UNLIMITED PASSWORD_LIFE_TIME UNLIMITED PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED PASSWORD_VERIFY_FUNCTION NULL INACTIVE_ACCOUNT_TIME UNLIMITED 6 rows selected.
如果您的主账户具有自定义配置文件,请将该账户切换为使用默认配置文件。
通过运行以下查询来检查主账户的当前配置文件:
SELECT PROFILE FROM dba_users WHERE USERNAME = 'EXAMPLE-MASTER-USERNAME';
通过运行以下查询将主账户的配置文件更改为“默认”:
SQL> ALTER USER EXAMPLE-MASTER-USERNAME PROFILE default; User altered.
**注意:**如果您修改了默认配置文件密码参数,则对于可能影响登录的参数,请将默认配置文件重置为出厂设置。要执行此操作,请使用以下命令:
SQL> ALTER PROFILE default LIMIT failed_login_attempts UNLIMITED password_life_time UNLIMITED inactive_account_time UNLIMITED; Profile altered.
如果组织的策略要求使用受限设置来重置主账户密码,请确保遵循以下最佳做法:
- 由于 PASSWORD_LIFE_TIME 设置,在密码过期之前,请使用 Amazon RDS 控制台定期重置密码。
- 如果 PASSWORD_LIFE_TIME 对密码验证有严格的要求,请在设置新密码时遵守这些要求。
- 使用基于 INACTIVE_ACCOUNT_TIME 设置的主用户账户,以使其保持激活状态。
跟踪失败的登录尝试
您可以使用 Oracle 中的审计功能跟踪主账户的无效登录尝试。为此,您可以将 RDS for Oracle 实例的 Oracle 初始化参数 audit_trail 修改为 db。您可以在数据库实例的自定义参数组中修改此参数。
如果您的 RDS for Oracle 实例使用默认参数组,则无法更改参数值。您必须创建新的自定义参数组,设置参数值,然后将新创建的参数组附加到实例。然后,重启实例以将新参数组与该实例关联。有关更多信息,请参阅如何修改 Amazon RDS 数据库参数组中的值?
修改自定义参数组中的参数后,必须重启 RDS 实例。这是因为 audit_trail 参数是静态参数,需要重启 RDS for Oracle 数据库才能生效。有关更多信息,请参阅重启数据库实例。
当 RDS 实例的状态变为可用后,使用主账户或任何具有审计权限的账户登录数据库。如果尚未配置失败尝试审计,请运行以下命令以启用失败登录尝试的审计:
AUDIT SESSION WHENEVER NOT SUCCESSFUL;
然后,运行以下查询以跟踪主账户未成功或失败的登录尝试。
**注意:**您可以通过从 WHERE 子句中删除 EXAMPLE-USER 来跟踪任何数据库账户的此数据。
SELECT username, os_username, userhost, TO_CHAR(timestamp, 'MON-DD-YYYY HH24:MI:SS') what_time FROM dba_audit_trail WHERE returncode = 1017 AND username = 'EXAMPLE-USER';
针对 CREATE PROFILE(创建配置文件)的 Oracle 文档
