OceanBase 数据库的 Oracle 模式提供 Profile 中基于密码的用户登录验证策略,实现用户锁定的功能。
背景信息
Profile 文件是限制数据库用户使用的资源的一种手段。在 OceanBase 数据库的 Oracle 模式中,Profile 文件主要用来控制用户的登录验证策略。通过使用用户的 Profile 文件,可以实现用户的锁定功能。
Profile 文件对密码提供了两个参数来实现连续登录失败后锁定用户:
FAILED_LOGIN_ATTEMPTS:连续登录失败的次数。PASSWORD_LOCK_TIME:锁定时间,单位为天。
用户被锁定后,其锁定和解锁策略如下:
用户锁定:每次因密码不正确登录失败,如果检查失败次数达到阈值,则触发锁定用户。
用户解锁:如果登录用户被锁定,再次登录时,系统会检查锁定时间,如果锁定时间已达到,系统会进行解锁,然后重新尝试登录。如果锁定时间未到,系统会报错,您也可以利用 SQL 语句解锁用户。
实现方法
管理员可以通过创建 Profile 并将其应用给用户的方式来实现用户密码的失败处理。主要包含以下两步:
创建 Profile。
您可以通过
CREATE PROFILE语句创建 Profile,并指定用户连续登录失败的次数及对应的锁定时间。SQL 语句如下:
CREATE PROFILE "profile_name" LIMIT { FAILED_LOGIN_ATTEMPTS | PASSWORD_LOCK_TIME | PASSWORD_LIFE_TIME | PASSWORD_GRACE_TIME } { integer | UNLIMITED | DEFAULT };语句说明:
执行该语句需要具备
CREATE PROFILE权限。FAILED_LOGIN_ATTEMPTS:用于指定连续登录用户帐户失败的次数。如果不指定该参数,则默认使用
DEFAULTProfile 的限制,默认DEFAULTProfile 中该参数的值为UNLIMITED,表示连续登录用户帐户失败的次数无限制。PASSWORD_LOCK_TIME:当连续登录失败次数达到阈值后,用于指定用户帐户被锁定的天数。如果不指定该参数,则默认使用
DEFAULTProfile 的限制,默认DEFAULTProfile 中该参数的值为UNLIMITED,表示不限制用户锁定的天数。PASSWORD_LIFE_TIME:用于指定同一密码可用于身份验证的有效天数。如果不指定该参数,则默认使用
DEFAULTProfile 的限制,默认DEFAULTProfile 中该参数的值为UNLIMITED,表示不限制同一密码可用于身份验证的天数。PASSWORD_GRACE_TIME:当达到身份验证的有效天数后,系统会发出警告,该参数用于指定发出警告后仍允许用户账户登录的宽限期天数。如果不指定该参数,则默认使用
DEFAULTProfile 的限制,默认DEFAULTProfile 中该参数的值为UNLIMITED,表示不限制用户登录的天数。integer | UNLIMITED | DEFAULT:用于指定参数值的取值范围,其中:integer表示整数。UNLIMITED表示没有为该参数设置限制。DEFAULT表示使用DEFAULTProfile 的限制。
更多
CREATE PROFILE语句的详细信息,请参见 CREATE PROFILE。应用 Profile 至用户。
应用 Profile 至用户主要有以下两种场景:
在创建用户时,直接指定已创建的 Profile 文件。
SQL 语句如下:
obclient> CREATE USER user_name IDENTIFIED BY password PROFILE {"profile_name" | default};如果在创建用户时未指定 Profile,则默认使用
DEFAULTProfile。DEFAULTProfile 的配置可以通过系统视图DBA_PROFILES查看。更多
CREATE USER语句的详细信息,请参见 CREATE USER 。如果用户已创建,则可以通过修改用户的 Profile 文件将已创建的 Profile 文件应用至用户。
SQL 语句如下:
obclient> ALTER USER user_name PROFILE {"profile_name" | default};更多
ALTER USER语句的详细信息,请参见 ALTER USER 。
操作示例
使用管理员用户登录 Oracle 租户。
创建 Profile 并设置连续错误登录策略。
创建名为
userprof1的 Profile,连续错误登录 5 次即锁定一天。obclient> CREATE PROFILE "userprof1" LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;完成后,可以执行以下语句,确认设置是否成功。
obclient> SELECT * FROM DBA_PROFILES; +-----------+--------------------------+---------------+-------------+ | PROFILE | RESOURCE_NAME | RESOURCE_TYPE | LIMIT | +-----------+--------------------------+---------------+-------------+ | DEFAULT | FAILED_LOGIN_ATTEMPTS | PASSWORD | UNLIMITED | | DEFAULT | PASSWORD_GRACE_TIME | PASSWORD | UNLIMITED | | DEFAULT | PASSWORD_LIFE_TIME | PASSWORD | UNLIMITED | | DEFAULT | PASSWORD_LOCK_TIME | PASSWORD | 86400000000 | | DEFAULT | PASSWORD_VERIFY_FUNCTION | PASSWORD | NULL | | userprof1 | FAILED_LOGIN_ATTEMPTS | PASSWORD | 5 | | userprof1 | PASSWORD_GRACE_TIME | PASSWORD | DEFAULT | | userprof1 | PASSWORD_LIFE_TIME | PASSWORD | DEFAULT | | userprof1 | PASSWORD_LOCK_TIME | PASSWORD | 86400000000 | | userprof1 | PASSWORD_VERIFY_FUNCTION | PASSWORD | DEFAULT | +-----------+--------------------------+---------------+-------------+ 10 rows in set创建 User,并指定 Profile。
obclient> CREATE USER secuser IDENTIFIED BY ***1** PROFILE "userprof1"; obclient> GRANT all privileges ON *.* to secuser;验证设置结果。
当连续输入 5 次错误密码时,用户会被锁定一天。
$ obclient -h127.1 -P2881 -usecuser@sectenant -p**123**; obclient: [Warning] Using a password on the command line interface can be insecure. ERROR 5039 (01007): User locked使用
root用户登录到数据库的sys租户,查看失败登录信息。obclient> SELECT user_name,gmt_modified,failed_login_attempts,last_failed_login_svr_ip FROM oceanbase.__all_virtual_tenant_user_failed_login_stat WHERE user_name='SECUSER'; +-----------+----------------------------+-----------------------+--------------------------+ | user_name | gmt_modified | failed_login_attempts | last_failed_login_svr_ip | +-----------+----------------------------+-----------------------+--------------------------+ | SECUSER | 2021-11-25 16:08:24.911700 | 5 | xxx.xx.xxx.xxx | +-----------+----------------------------+-----------------------+--------------------------+ 1 row in set执行以下 SQL 语句,解锁用户。
注意
解锁用户的操作一般由管理员完成,普通用户如果需要执行锁定和解锁操作,必须具备全局的
ALTER USER权限。查看用户权限和授权的相关操作请参见 查看用户权限 和 修改用户权限。obclient> ALTER USER secuser ACCOUNT UNLOCK;




