暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

OceanBase登录失败处理策略

2023-02-01
1089

OceanBase 数据库的 Oracle 模式提供 Profile 中基于密码的用户登录验证策略,实现用户锁定的功能。

背景信息

Profile 文件是限制数据库用户使用的资源的一种手段。在 OceanBase 数据库的 Oracle 模式中,Profile 文件主要用来控制用户的登录验证策略。通过使用用户的 Profile 文件,可以实现用户的锁定功能。

Profile 文件对密码提供了两个参数来实现连续登录失败后锁定用户:

  • FAILED_LOGIN_ATTEMPTS:连续登录失败的次数。

  • PASSWORD_LOCK_TIME:锁定时间,单位为天。

用户被锁定后,其锁定和解锁策略如下:

  • 用户锁定:每次因密码不正确登录失败,如果检查失败次数达到阈值,则触发锁定用户。

  • 用户解锁:如果登录用户被锁定,再次登录时,系统会检查锁定时间,如果锁定时间已达到,系统会进行解锁,然后重新尝试登录。如果锁定时间未到,系统会报错,您也可以利用 SQL 语句解锁用户。

实现方法

管理员可以通过创建 Profile 并将其应用给用户的方式来实现用户密码的失败处理。主要包含以下两步:

  1. 创建 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:用于指定连续登录用户帐户失败的次数。

      如果不指定该参数,则默认使用 DEFAULT Profile 的限制,默认 DEFAULT Profile 中该参数的值为 UNLIMITED,表示连续登录用户帐户失败的次数无限制。

    • PASSWORD_LOCK_TIME:当连续登录失败次数达到阈值后,用于指定用户帐户被锁定的天数。

      如果不指定该参数,则默认使用 DEFAULT Profile 的限制,默认 DEFAULT Profile 中该参数的值为 UNLIMITED,表示不限制用户锁定的天数。

    • PASSWORD_LIFE_TIME:用于指定同一密码可用于身份验证的有效天数。

      如果不指定该参数,则默认使用 DEFAULT Profile 的限制,默认 DEFAULT Profile 中该参数的值为 UNLIMITED,表示不限制同一密码可用于身份验证的天数。

    • PASSWORD_GRACE_TIME:当达到身份验证的有效天数后,系统会发出警告,该参数用于指定发出警告后仍允许用户账户登录的宽限期天数。

      如果不指定该参数,则默认使用 DEFAULT Profile 的限制,默认 DEFAULT Profile 中该参数的值为 UNLIMITED,表示不限制用户登录的天数。

    • integer | UNLIMITED | DEFAULT:用于指定参数值的取值范围,其中:

      • integer 表示整数。

      • UNLIMITED 表示没有为该参数设置限制。

      • DEFAULT 表示使用 DEFAULT Profile 的限制。

    更多 CREATE PROFILE 语句的详细信息,请参见 CREATE PROFILE

  2. 应用 Profile 至用户。

    应用 Profile 至用户主要有以下两种场景:

    • 在创建用户时,直接指定已创建的 Profile 文件。

      SQL 语句如下:

      obclient> CREATE USER user_name IDENTIFIED BY password PROFILE
      {"profile_name" | default};
      

      如果在创建用户时未指定 Profile,则默认使用 DEFAULT Profile。DEFAULT Profile 的配置可以通过系统视图 DBA_PROFILES 查看。

      更多 CREATE USER 语句的详细信息,请参见 CREATE USER 

    • 如果用户已创建,则可以通过修改用户的 Profile 文件将已创建的 Profile 文件应用至用户。

      SQL 语句如下:

      obclient> ALTER USER user_name PROFILE {"profile_name" | default};
      

      更多 ALTER USER 语句的详细信息,请参见 ALTER USER 。

操作示例

  1. 使用管理员用户登录 Oracle 租户。

  2. 创建 Profile 并设置连续错误登录策略。

    创建名为 userprof1 的 Profile,连续错误登录 5 次即锁定一天。

    obclient> CREATE PROFILE "userprof1" LIMIT FAILED_LOGIN_ATTEMPTS 5 
    PASSWORD_LOCK_TIME 1;
    
  3. 完成后,可以执行以下语句,确认设置是否成功。

    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
    
  4. 创建 User,并指定 Profile。

    obclient> CREATE USER secuser IDENTIFIED BY ***1** PROFILE "userprof1";
    
    obclient> GRANT all privileges ON *.* to secuser;
    
  5. 验证设置结果。

    当连续输入 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
    
  6. 执行以下 SQL 语句,解锁用户。

    注意

    解锁用户的操作一般由管理员完成,普通用户如果需要执行锁定和解锁操作,必须具备全局的 ALTER USER 权限。查看用户权限和授权的相关操作请参见 查看用户权限 和 修改用户权限

    obclient> ALTER USER secuser ACCOUNT UNLOCK;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论