密码管理
密码作为一种用户身份凭据,在用户登录到 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 USER
、ALTER USER
),系统根据设置的密码复杂度规则,按照以下顺序检验密码是否符合规范。如果该密码不符合规范,则系统报错。
- 密码的最大长度和最小长度
- 密码的大小写字母数
- 密码的数字和特殊字符数
- 密码中是否含有用户名或者用户名的逆序
有关密码复杂度策略的详细配置信息,参见集群实时参数。
配置示例
说明
密码复杂度策略的变更不会影响已存在的密码,只对新设置的密码产生影响。
以下示例假设用户已经启动并连接 KaiwuDB 数据库。本示例设置以下密码复杂度规则:
- 最小长度为
8
个字符 - 至少包含
3
个大写字母、3
个小写字母和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;
退出后重新登录,确认集群参数是否生效。
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
验证密码复杂度规则是否生效。
创建
user1
和user2
两个用户,分别为其设置符合要求的密码和不符合要求的密码。创建
user1
用户并为其设置符合要求的密码。CREATE USER user1 WITH PASSWORD '11aaa!!AAA';
执行成功后,控制台输出以下信息:
CREATE USER
创建
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 USER
或 ALTER USER
语句的 FAILED LOGIN ATTEMPTS
选项配置用户的登录失败次数。有关详细信息,参见创建用户或者修改用户。
配置示例
以下示例假设已经安全部署并启动 KaiwuDB 数据库。有关如何安全部署并启动 KaiwuDB 数据库的详细信息,参见单节点裸机部署或者单节点容器部署。
本示例创建 user1
用户并设置最大连续登录失败尝试次数为 5 次。超过设置的阈值后,用户被锁定。管理员手动解锁用户。
创建
user1
用户并设置最大连续登录失败尝试次数为 5 次。CREATE USER user1 WITH FAILED LOGIN ATTEMPTS '5';
查看
user1
用户的最大连续登录失败尝试次数设置。SELECT * FROM kwdb_internal.role_options
验证密码连续错误登录失败处理策略是否生效。当连续输入 5 次错误密码时,用户会被锁定,提示:
ERROR: account xxx has been locked. Please try again after xxx second(s).
管理员手动解锁用户。
ALTER USER user1 WITH ACCOUNT UNLOCK;