设置密码安全策略

加密存储密码

用户密码存储在系统表PG_AUTHID中,为防止用户密码泄露,VexDB 对用户密码进行加密存储,所采用的加密算法由配置参数password_encryption_type决定。

  • 当参数设置为0时,表示采用md5方式对密码加密。MD5加密算法安全性低,存在安全风险,不建议使用。
  • 当参数设置为1时,表示采用sha256和md5方式对密码加密。MD5加密算法安全性低,存在安全风险,不建议使用。
  • 当参数设置为2时,表示采用sha256方式对密码加密,为默认配置。
  • 当参数设置为3时,表示采用SM3方式对密码加密。

示例: 采用sha256和md5方式对密码加密。

  1. 以安装 VexDB 的操作系统用户(以 vexdb 为例)登录数据库主节点。
  2. 使用如下命令连接数据库,其中 vexdb 为需要连接的数据库名称,5432为数据库主节点的端口号。
    vsql -d postgres
    
  3. 查看已配置的加密算法。
    SHOW password_encryption_type;
    

    返回结果如下:
    password_encryption_type
    --------------------------
    2
    (1 row)
    

    如果显示结果为 0 或 1,执行 \q 命令退出数据库。
  4. 执行如下命令将其设置为安全的加密算法:采用 sha256 和 md5 方式对密码加密。
    vb_guc reload -D $PGDATA  -c "password_encryption_type=2"
    
说明

为防止用户密码泄露,在执行CREATE USER或者CREATE ROLE命令创建数据库用户时,不能指定UNENCRYPTED属性,即新创建的用户的密码只能是加密存储的。

密码复杂度

初始化数据库、创建用户、修改用户时需要指定密码,密码必须要符合复杂度的要求,否则会提示用户重新输入密码。

  • 参数 password_policy控制了密码至少包含的有效字符类别数,其中有效字符包括大写字母(A-Z)、小写字母(a-z)、数字(0-9)、特殊字符(如表3.特殊字符所示)。取值及其对应的有效复杂度如下表所示:
    表1 password_policy 取值说明
    参数取值 说明
    0 关闭密码复杂度校验,但密码不能为空并且只包含有效字符。

    说明

    设置为 0 会存在安全风险,不建议设置为0,即使需要设置也要将所有 VexDB 节点中的 password_policy 都设置为 0 才能生效。
    1 启用密码复杂度校验,密码至少需满足四类有效字符中的三类,为参数默认取值。
    2 启用密码复杂度校验,且密码需满足四类有效字符中的四类。
    3 启用密码复杂度校验,且密码至少需满足四类有效字符中的两类。
  • 同时,其他参数与password_policy 协同控制密码的复杂度校验策略,包括如下参数:
    表2 密码复杂度协同参数
    参数名称 说明
    password_min_uppercase 密码包含的大写字母(A-Z)的最少个数。
    password_min_lowercase 密码包含的小写字母(a-z)的最少个数。
    password_min_digital 密码包含的数字(0-9)的最少个数。
    password_min_special 密码包含的特殊字符的最少个数。特殊字符参见表3.特殊字符
    password_min_length 密码的最小长度。
    password_max_length 密码的最大长度。
  • 密码除了必须要符合参数password_policy 和表2.密码复杂度协同参数对复杂度的要求以外,还应满足如下要求:
    • 不能和用户名、用户名倒写相同,本要求为非大小写敏感。
    • 不能和当前密码、当前密码的倒写相同。
    • 不能是弱口令,弱口令指的是强度较低,容易被破解的密码,对于不同的用户或群体,弱口令的定义可能会有所区别,用户需自己添加定制化的弱口令。
    • 使用CREATE WEAK PASSWORD DICTIONARY创建弱口令,存放于GS_GLOBAL_CONFIG系统表中,弱口令默认为空。
    • 当创建用户、修改用户需要设置密码时,系统将会把用户设置的密码和弱口令字典中存放的口令进行对比,如果符合,则会提示用户该口令为弱口令,设置密码失败。

示例: 启用密码复杂度校验。

  1. 以安装 VexDB 的操作系统用户(以 vexdb 为例)登录数据库主节点。
  2. 使用如下命令连接数据库,其中 vexdb 为需要连接的数据库名称,5432 为数据库主节点的端口号。
    vsql -d postgres
    
  3. 查看已配置的参数。
    SHOW password_policy;
    

    返回结果如下:
    password_policy
    ---------------------
    1
    (1 row)
    

    如果显示结果不为 1,执行 \q 命令退出数据库。
  4. 执行如下命令设置成默认值1。
    vb_guc reload  -D $PGDATA -c "password_policy=1"
    

账户密码的复杂度要求如下:

  • 包含大写字母(A-Z)的最少个数(password_min_uppercase)。
  • 包含小写字母(a-z)的最少个数(password_min_lowercase)。
  • 包含数字(0-9)的最少个数(password_min_digital)。
  • 包含特殊字符的最少个数(password_min_special)(特殊字符的列表请参见表1. 特殊字符)。
  • 密码的最小长度(password_min_length)。
  • 密码的最大长度(password_max_length)。
  • 至少包含上述四类字符中的三类。
  • 不能和用户名、用户名倒写相同,本要求为非大小写敏感。
  • 不能和当前密码、当前密码的倒写相同。
  • 不能是弱口令。
    • 弱口令指的是强度较低,容易被破解的密码,对于不同的用户或群体,弱口令的定义可能会有所区别,用户需自己添加定制化的弱口令。
    • 弱口令字典中的口令存放在GS_GLOBAL_CONFIG系统表中,当创建用户、修改用户需要设置密码时,系统将会把用户设置口令和弱口令字典中存放的口令进行对比,如果符合,则会提示用户该口令为弱口令,设置密码失败。
    • 弱口令字典默认为空,用户通过以下语法可以对弱口令字典进行增加和删除,示例如下:
      CREATE WEAK PASSWORD DICTIONARY WITH VALUES ('password1'), ('password2'); DROP WEAK PASSWORD DICTIONARY;
      

密码重用

用户修改密码时,只有超过不可重用天数(password_reuse_time)或不可重用次数(password_reuse_max)的密码才可以使用。参数配置说明如表2. 不可重用天数和不可重用次数参数说明所示。

示例: 配置 password_reuse_time 参数。

  1. 以安装 VexDB 的操作系统用户(以 vexdb 为例)登录数据库主节点。
  2. 使用如下命令连接数据库。
    vsql -d postgres
    
  3. 查看已配置的参数。
    SHOW password_reuse_time;
    

    返回结果为:
    password_reuse_time
    ---------------------
    90
    (1 row)
    

    如果显示结果不为 90,执行 \q 命令退出数据库。
  4. 执行如下命令设置成默认值90。
    vb_guc reload -D $PGDATA -c "password_reuse_time=90"
    

示例: 配置 password_reuse_max 参数

  1. 以安装 VexDB 的操作系统用户(以 vexdb 为例)登录数据库主节点。
  2. 使用如下命令连接数据库。
    vsql -d vexdb -p 5432
    
  3. 查看已配置的参数。
    SHOW password_reuse_max;
    

    返回结果为:
    password_reuse_max
    --------------------
    3
    (1 row)
    

    如果显示结果不为 3,执行 \q 命令退出数据库。
  4. 执行如下命令设置成默认值 3。
    vb_guc reload -D $PGDATA -c "password_reuse_max = 3"
    

密码有效期限

数据库用户的密码都有密码有效期(password_effect_time),当达到密码到期提醒天数(password_notify_time)时,系统会在用户登录数据库时提示用户修改密码。(密码有效期到期后,只有普通用户会收到提示。)

示例: 配置 password_effect_time 参数。

  1. 以安装 VexDB 的操作系统用户(以 vexdb 为例)登录数据库主节点。
  2. 使用如下命令连接数据库,其中 vexdb 为需要连接的数据库名称,5432 为数据库主节点的端口号。
    vsql -d vexdb -p 5432
    
  3. 查看已配置的参数。
    SHOW password_effect_time;
    

    返回结果为:
    password_effect_time
    ----------------------
    90
    (1 row)
    

    如果显示结果不为90,执行 \q 命令退出数据库。
  4. 执行如下命令设置成默认值90(不建议设置为0)。
    vb_guc reload -D $PGDATA -c "password_effect_time = 90"
    

示例: 配置 password_notify_time 参数。

  1. 以安装 VexDB 的操作系统用户(以 vexdb 为例)登录数据库主节点。
  2. 使用如下命令连接数据库。
    vsql-d postgres
    
  3. 查看已配置的参数。
    SHOW password_notify_time;
    

    返回结果为:
    password_notify_time
    ----------------------
    7
    (1 row)
    

    如果显示结果不为 7,执行 \q 命令退出数据库。
  4. 执行如下命令设置成默认值 7(不建议设置为 0)。
    vb_guc reload -D $PGDATA -c "password_notify_time = 7"
    

密码修改

在安装数据库时,会新建一个和初始化用户重名的操作系统用户,为了保证账户安全,请定期修改操作系统用户的密码。

以修改用户 user1 密码为例,命令格式如下:

passwd user1

建议系统管理员和普通用户都要定期修改自己的账户密码,避免账户密码被非法窃取。

示例: 修改用户 user1 的密码。

  1. 以系统管理员用户连接数据库并执行如下命令:
    ALTER USER user1 IDENTIFIED BY "Vbase@123" REPLACE "5678@def";
    

    Vbase@123、5678@def 分别代表用户user1的新密码和原始密码,这些密码要符合密码复杂度规则,否则会执行失败。
  2. 管理员可以修改自己的或者其他账户的密码。通过修改其他账户的密码,解决用户密码遗失所造成无法登录的问题。 以修改用户joe账户密码为例,命令格式如下:
ALTER USER joe IDENTIFIED BY "Vbase@123";
  • 系统管理员可以修改普通用户密码且不需要用户原密码。
  • 系统管理员修改自己密码但需要管理员原密码。
  • 系统管理员之间不允许互相修改对方密码。

密码验证

设置当前会话的用户和角色时,需要验证密码。如果输入密码与用户的存储密码不一致,则会报错。

以设置用户 joe 为例,验证过程如下:

SET ROLE joe PASSWORD "Vbase@123";

返回结果为:

ERROR:  Invalid username/password,set role denied.

表3 特殊字符

编号 字符 编号 字符 编号 字符 编号 字符
1 ~ 9 * 17 | 25 <
2 10 ( 18 [ 26 .
3 @ 11 ) 19 { 27 >
4 # 12 - 20 } 28 /
5 $ 13 _ 21 ] 29
6 % 14 = 22 - -
7 ^ 15 + 23 - -
8 & 16 \ 24 - -

表2 不可重用天数和不可重用次数参数说明

参数 取值范围 配置说明
不可重用天数(password_reuse_time) 正数,其中整数部分表示天数,小数部分可以换算成时,分,秒。默认值为90。 如果参数变小,则后续修改密码按新的参数进行检查。如果参数变大(比如由 a 变大为 b),因为 b 天之前的历史密码可能已经删除,所以 b 天之前的密码仍有可能被重用。则后续修改密码按新的参数进行检查。 说明: 时间以绝对时间为准,历史密码记录的都是当时的时间,不识别时间的修改。
不可重用次数(password_reuse_max) 1-100之间的正整数。默认值为3 如果参数变小,则后续修改密码按新的参数进行检查。如果参数变大(比如由 a 变大为 b),因为 b 次之前的历史密码可能已经删除,所以 b 次之前的密码仍有可能被重用。则后续修改密码按新的参数进行检查。

设置用户密码失效

具有CREATEROLE权限的用户在创建用户时可以强制用户密码失效,新用户首次登陆数据库后需要修改密码才允许执行其他查询操作,命令格式如下:

CREATE USER joe PASSWORD "Vbase@123" EXPIRED;

具有CREATEROLE权限的用户可以强制用户密码失效或者强制修改密码且失效,命令格式如下:

ALTER USER joe PASSWORD EXPIRED;

或者:

ALTER USER joe PASSWORD "abc@2345" EXPIRED;

密码失效的用户登录数据库后,当执行简单查询或者扩展查询时,会提示用户修改密码。修改密码后可以正常执行语句。

只有初始用户、系统管理员(sysadmin)或拥有创建用户(CREATEROLE)权限的用户才可以设置用户密码失效,其中系统管理员也可以设置自己或其他系统管理员密码失效。不允许设置初始用户密码失效。

需要帮助?

扫码添加企业微信
获得专业技术支持

企业微信二维码
🎯 快速响应💡 专业解答