文档下载建议反馈入口

  • 密码复杂度策略
  • 查看密码有效期
  • 密码连续错误登录失败处理策略

密码管理

密码作为一种用户身份凭据,在用户登录到 KaiwuDB 数据库时用于身份验证,确保用户身份的合法性。为了保护用户密码的安全,KaiwuDB 支持以下密码管理能力:

  • 配置密码复杂度策略:支持用户设置密码复杂度规则,检查用户密码复杂度,防止出现空密码、弱密码。
  • 查看密码有效期:支持用户通过 SQL 语句查看密码的有效期。
  • 配置密码连续错误登录失败处理策略:连续多次密码错误导致登录失败后,临时锁定用户,限制该用户继续尝试登录。

密码复杂度策略

为了防止恶意的密码攻击,KaiwuDB 数据库支持配置密码复杂度策略。通过以下 SQL 语句,用户可以查看所有密码复杂度策略相关的集群参数:

SELECT * FROM [SHOW CLUSTER SETTING ALL] WHERE VARIABLE LIKE '%password.%';

执行成功后,控制台输出以下信息:

variable                                     |  value      |  setting_type  |                   description
---------------------------------------------+-------------|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------
password.validate.check_user_name.enabled    |  true       |  b             |  whether check passwords are similar to the user name
password.validate.max_length                 |  63         |  i             |  the maximum length accepted for passwords set in cleartext via SQL. Note that -1 means no length limit.
password.validate.min_length                 |  8          |  i             |  the minimum length accepted for passwords set in cleartext via SQL. Note that a value lower than 1 is ignored: password cannot be empty in any case.
password.validate.mixed_case_count           |  1          |  i             |  the minimum number of uppercase and lowercase letters accepted for passwords set in cleartext via SQL
password.validate.number_count               |  1          |  i             |  the minimum number of digits accepted for passwords set in cleartext via SQL
password.validate.special_char_count         |  1          |  i             |  the minimum number of special characters accepted for passwords set in cleartext via SQL

用户可以根据需要使用 SET CLUSTER SETTING 语句设置密码复杂度参数,配置密码复杂度的检查规则:

  • password.validate.check_user_name.enabled:密码与用户名匹配检查
  • password.validate.max_length:密码最大长度检查
  • password.validate.min_length:密码最小长度检查
  • password.validate.mixed_case_count:密码中大写字符和小写字符数检查
  • password.validate.number_count:密码中数字字符数检查
  • password.validate.special_char_count:密码中特殊字符数检查

对采用明文方式设置用户密码的 SQL 语句(CREATE USERALTER USER),系统根据设置的密码复杂度规则,按照以下顺序检验密码是否符合规范。如果该密码不符合规范,则系统报错。

  1. 密码的最大长度和最小长度
  2. 密码的大小写字母数
  3. 密码的数字和特殊字符数
  4. 密码中是否含有用户名或者用户名的逆序

有关密码复杂度策略的详细配置信息,参见集群实时参数

配置示例

说明

密码复杂度策略的变更不会影响已存在的密码,只对新设置的密码产生影响。

以下示例假设用户已经启动并连接 KaiwuDB 数据库。本示例设置以下密码复杂度规则:

  • 最小长度为 8 个字符
  • 至少包含 3 个大写字母、3 个小写字母和 1 个特殊字符、
  • 用户密码不能与用户名相同
  1. 设置密码复杂度规则。

    -- 1. 设置密码最小长度为 8 个字符。
    SET CLUSTER SETTING password.validate.min_length = 8;
    
    -- 2. 设置密码至少包括 3 个大写字母和 3 个小写字母。
    SET CLUSTER SETTING password.validate.mixed_case_count = 3;
    
    -- 3. 设置密码不能与用户名相同。
    SET CLUSTER SETTING password.validate.check_user_name = true;
    
  2. 退出后重新登录,确认集群参数是否生效。

    SELECT * FROM [SHOW CLUSTER SETTING ALL] WHERE VARIABLE LIKE '%password.%';
    

    执行成功后,控制台输出以下信息:

    variable                                     |  value      |  setting_type  |                   description
    ---------------------------------------------+-------------|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------
    password.validate.check_user_name.enabled    |  true       |  b             |  whether check passwords are similar to the user name
    password.validate.max_length                 |  63         |  i             |  the maximum length accepted for passwords set in cleartext via SQL. Note that -1 means no length limit.
    password.validate.min_length                 |  8          |  i             |  the minimum length accepted for passwords set in cleartext via SQL. Note that a value lower than 1 is ignored: password cannot be empty in any case.
    password.validate.mixed_case_count           |  3          |  i             |  the minimum number of uppercase and lowercase letters accepted for passwords set in cleartext via SQL
    password.validate.number_count               |  1          |  i             |  the minimum number of digits accepted for passwords set in cleartext via SQL
    password.validate.special_char_count         |  1          |  i             |  the minimum number of special characters accepted for passwords set in cleartext via SQL
    
  3. 验证密码复杂度规则是否生效。

    创建 user1user2 两个用户,分别为其设置符合要求的密码和不符合要求的密码。

    1. 创建 user1 用户并为其设置符合要求的密码。

      CREATE USER user1 WITH PASSWORD '11aaa!!AAA';
      

      执行成功后,控制台输出以下信息:

      CREATE USER
      
    2. 创建 user2 用户并为其设置不符合要求的密码。

      CREATE USER user2 WITH PASSWORD '11aa!!AA';
      

      系统报错,提示:

      ERROR: the maximum length of the passwords cannot be less than the minimum length, and the maximum or minimum length cannot be less than the total length of the following settings: capital letters, lowercase letters, digits, and symbol characters
      

查看密码有效期

在安全模式下,当 KaiwuDB 数据库用户创建或修改用户时,可以设置用户密码的有效期。在登录 KaiwuDB 数据库时,用户可以在终端上查看该用户的密码到期时间。如果在创建用户的时候未设置密码的有效期,终端显示 unlimited,即没有密码有效期。关于如何创建或修改用户密码的有效期,参见创建用户或者修改用户

KaiwuDB 提供 kwdb_internal.role_options 系统视图,用来提供用户选项信息。用户可以通过以下 SQL 语句查看系统视图中的用户密码信息。

SELECT VALUE FROM kwdb_internal.role_options WHERE username=current_user() AND option ='VALID UNTIL';

密码连续错误登录失败处理策略

安全模式下,当用户登录数据库时,如果连续多次输入错误密码,达到用户最大连续登录失败尝试次数的阈值,数据库将锁定该用户 15 分钟,以便防止恶意的密码攻击,从而保护数据库,提升数据库的安全性。默认情况下,最大连续登录失败尝试次数为 5 次。

处于锁定状态的用户在登录数据库时,系统将提示用户账户已锁定并显示剩余锁定时间。在此期间,不论用户输入的密码是否正确,都无法登录数据库。锁定时间结束或者管理员手动解锁后,若用户输入正确的密码,可正常登录数据库。若用户输入错误的密码,且再次达到最大登录失败次数后,用户重新被锁定。每次登录成功后,系统重置最大连续尝试登录失败次数的计数。

KaiwuDB 支持使用 CREATE USERALTER USER 语句的 FAILED LOGIN ATTEMPTS 选项配置用户的登录失败次数。有关详细信息,参见创建用户或者修改用户

配置示例

以下示例假设已经安全部署并启动 KaiwuDB 数据库。有关如何安全部署并启动 KaiwuDB 数据库的详细信息,参见单节点裸机部署或者单节点容器部署

本示例创建 user1 用户并设置最大连续登录失败尝试次数为 5 次。超过设置的阈值后,用户被锁定。管理员手动解锁用户。

  1. 创建 user1 用户并设置最大连续登录失败尝试次数为 5 次。

    CREATE USER user1 WITH FAILED LOGIN ATTEMPTS '5';
    
  2. 查看 user1 用户的最大连续登录失败尝试次数设置。

    SELECT * FROM kwdb_internal.role_options
    
  3. 验证密码连续错误登录失败处理策略是否生效。当连续输入 5 次错误密码时,用户会被锁定,提示:

    ERROR: account xxx has been locked. Please try again after xxx second(s).
    
  4. 管理员手动解锁用户。

    ALTER USER user1 WITH ACCOUNT UNLOCK;