Skip to content

KingBaseES 密码策略

密码策略概述

密码策略是KingBaseES数据库安全的重要组成部分,它通过一系列规则和限制来确保用户密码的安全性,防止弱密码被破解,从而保护数据库免受未授权访问。合理的密码策略可以有效降低数据库被攻击的风险,保障数据安全。

密码复杂性要求

密码复杂性参数

KingBaseES提供了多个参数来配置密码复杂性要求,这些参数可以在postgresql.conf文件中设置,也可以通过SQL命令动态修改。

sql
-- 查看当前密码策略配置
SHOW password_encryption;
SHOW password_min_length;
SHOW password_min_uppercase;
SHOW password_min_lowercase;
SHOW password_min_digits;
SHOW password_min_special_chars;
SHOW password_max_age;
SHOW password_min_age;
SHOW password_reuse_max;
SHOW password_reuse_min;
SHOW password_lock_time;
SHOW password_max_failed_login_attempts;

配置密码复杂性

sql
-- 设置密码加密方式(md5或scram-sha-256)
ALTER SYSTEM SET password_encryption = 'scram-sha-256';

-- 设置密码最小长度
ALTER SYSTEM SET password_min_length = 12;

-- 设置密码最小大写字母数量
ALTER SYSTEM SET password_min_uppercase = 2;

-- 设置密码最小小写字母数量
ALTER SYSTEM SET password_min_lowercase = 2;

-- 设置密码最小数字数量
ALTER SYSTEM SET password_min_digits = 2;

-- 设置密码最小特殊字符数量
ALTER SYSTEM SET password_min_special_chars = 1;

-- 重新加载配置
SELECT sys_reload_conf();

密码有效期管理

设置密码有效期

sql
-- 设置密码最大有效期(天)
ALTER SYSTEM SET password_max_age = 90;

-- 设置密码最小有效期(天),防止频繁修改密码
ALTER SYSTEM SET password_min_age = 1;

-- 为特定用户设置密码有效期
ALTER ROLE user_name WITH VALID UNTIL '2024-12-31';

-- 查看用户密码有效期
SELECT rolname, rolvaliduntil FROM sys_roles WHERE rolname = 'user_name';

密码过期处理

当用户密码过期时,用户将无法登录数据库,需要管理员重置密码或延长有效期。

sql
-- 重置用户密码
ALTER ROLE user_name WITH PASSWORD 'new_password';

-- 延长用户密码有效期
ALTER ROLE user_name WITH VALID UNTIL '2025-03-31';

-- 设置密码永不过期
ALTER ROLE user_name WITH VALID UNTIL 'infinity';

密码历史记录管理

密码历史记录管理可以防止用户重复使用之前的密码,提高密码安全性。

sql
-- 设置密码历史记录数量
ALTER SYSTEM SET password_reuse_max = 10;

-- 设置密码重用间隔(天)
ALTER SYSTEM SET password_reuse_min = 365;

-- 查看密码历史记录
SELECT * FROM sys_password_history WHERE rolname = 'user_name';

密码锁定机制

密码锁定机制可以防止暴力破解攻击,当用户连续多次登录失败时,系统会自动锁定该用户。

sql
-- 设置最大登录失败次数
ALTER SYSTEM SET password_max_failed_login_attempts = 5;

-- 设置锁定时间(分钟)
ALTER SYSTEM SET password_lock_time = 30;

-- 查看用户锁定状态
SELECT rolname, rolpasswordlock FROM sys_roles WHERE rolname = 'user_name';

-- 手动解锁用户
ALTER ROLE user_name WITH PASSWORDLOCK OFF;

密码加密存储

KingBaseES支持多种密码加密方式,包括md5和scram-sha-256,其中scram-sha-256是更安全的加密方式。

配置密码加密方式

sql
-- 使用scram-sha-256加密方式
ALTER SYSTEM SET password_encryption = 'scram-sha-256';

-- 查看当前加密方式
SHOW password_encryption;

密码加密验证

sql
-- 查看用户密码加密方式
SELECT rolname, 
       CASE 
         WHEN rolpassword LIKE 'SCRAM-SHA-256%' THEN 'scram-sha-256'
         WHEN rolpassword LIKE 'md5%' THEN 'md5'
         ELSE 'unknown'
       END AS encryption_method
FROM sys_roles;

密码策略最佳实践

1. 制定合理的密码复杂性规则

  • 密码长度至少12位
  • 包含大小写字母、数字和特殊字符
  • 避免使用常见密码和弱密码

2. 定期更换密码

  • 普通用户密码每90天更换一次
  • 管理员用户密码每30天更换一次
  • 关键业务账户密码每15天更换一次

3. 实施密码历史记录

  • 记录至少10个历史密码
  • 禁止在365天内重用密码

4. 启用密码锁定机制

  • 连续5次登录失败后锁定用户
  • 锁定时间设置为30分钟
  • 管理员可以手动解锁用户

5. 使用安全的密码加密方式

  • 优先使用scram-sha-256加密方式
  • 定期检查用户密码加密方式,升级旧的md5加密密码

6. 定期审计密码策略

  • 定期检查密码策略配置
  • 审计用户密码复杂度
  • 监控密码过期情况

版本差异

KingBaseES V8 R6

  • 支持基本的密码策略配置
  • 支持md5和scram-sha-256加密方式
  • 支持密码有效期设置
  • 支持密码锁定机制

KingBaseES V8 R7

  • 增强了密码策略功能
  • 支持更细粒度的密码复杂性要求(如大小写字母、数字、特殊字符数量)
  • 支持密码历史记录管理
  • 提供了更丰富的系统视图用于密码策略审计
  • 增强了密码锁定机制
sql
-- V8 R7新增:密码复杂性检查函数
SELECT sys_check_password_strength('MyPassword123!');

-- V8 R7新增:密码历史记录视图
SELECT * FROM sys_password_history;

-- V8 R7新增:密码策略配置视图
SELECT * FROM sys_password_policy;

常见问题(FAQ)

1. 如何查看当前密码策略配置?

sql
-- 查看所有密码策略相关参数
SHOW ALL LIKE 'password%';

2. 如何强制用户修改密码?

sql
-- 设置用户密码立即过期,下次登录必须修改
ALTER ROLE user_name WITH VALID UNTIL '1970-01-01';

3. 如何批量修改用户密码?

sql
-- 创建密码生成函数
CREATE OR REPLACE FUNCTION generate_strong_password(length INT DEFAULT 12) RETURNS TEXT AS $$
DECLARE
  chars TEXT := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
  password TEXT := '';
  i INT;
BEGIN
  FOR i IN 1..length LOOP
    password := password || substr(chars, floor(random() * length(chars) + 1)::INT, 1);
  END LOOP;
  RETURN password;
END;
$$ LANGUAGE plpgsql;

-- 批量修改用户密码
DO $$
DECLARE
  user_record RECORD;
  new_password TEXT;
BEGIN
  FOR user_record IN SELECT rolname FROM sys_roles WHERE rolcanlogin AND NOT rolsuper LOOP
    new_password := generate_strong_password(16);
    EXECUTE format('ALTER ROLE %I WITH PASSWORD %L', user_record.rolname, new_password);
    RAISE NOTICE 'User %: password set to %', user_record.rolname, new_password;
  END LOOP;
END;
$$;

4. 如何解锁被锁定的用户?

sql
-- 解锁特定用户
ALTER ROLE user_name WITH PASSWORDLOCK OFF;

-- 解锁所有被锁定的用户
DO $$
DECLARE
  locked_user RECORD;
BEGIN
  FOR locked_user IN SELECT rolname FROM sys_roles WHERE rolpasswordlock LOOP
    EXECUTE format('ALTER ROLE %I WITH PASSWORDLOCK OFF', locked_user.rolname);
    RAISE NOTICE 'User % unlocked', locked_user.rolname;
  END LOOP;
END;
$$;

5. 如何检查密码强度?

sql
-- V8 R7及以上版本
SELECT sys_check_password_strength('MyPassword123!');

-- V8 R6版本可以使用自定义函数
CREATE OR REPLACE FUNCTION check_password_strength(password TEXT) RETURNS TEXT AS $$
DECLARE
  strength TEXT := 'Weak';
  score INT := 0;
BEGIN
  -- 检查密码长度
  IF length(password) >= 12 THEN
    score := score + 2;
  ELSIF length(password) >= 8 THEN
    score := score + 1;
  END IF;
  
  -- 检查是否包含大写字母
  IF password ~ '[A-Z]' THEN
    score := score + 1;
  END IF;
  
  -- 检查是否包含小写字母
  IF password ~ '[a-z]' THEN
    score := score + 1;
  END IF;
  
  -- 检查是否包含数字
  IF password ~ '[0-9]' THEN
    score := score + 1;
  END IF;
  
  -- 检查是否包含特殊字符
  IF password ~ '[!@#$%^&*()_+-=[]{}|;:,.<>?]' THEN
    score := score + 1;
  END IF;
  
  -- 确定密码强度
  IF score >= 5 THEN
    strength := 'Strong';
  ELSIF score >= 3 THEN
    strength := 'Medium';
  END IF;
  
  RETURN strength;
END;
$$ LANGUAGE plpgsql;

-- 使用自定义函数检查密码强度
SELECT check_password_strength('MyPassword123!');

6. 如何禁用密码策略?

sql
-- 注意:不建议禁用密码策略,这会降低数据库安全性
-- 如需临时禁用,可将相关参数设置为宽松值
ALTER SYSTEM SET password_min_length = 1;
ALTER SYSTEM SET password_min_uppercase = 0;
ALTER SYSTEM SET password_min_lowercase = 0;
ALTER SYSTEM SET password_min_digits = 0;
ALTER SYSTEM SET password_min_special_chars = 0;
ALTER SYSTEM SET password_max_age = 0;
ALTER SYSTEM SET password_reuse_max = 0;
ALTER SYSTEM SET password_max_failed_login_attempts = 0;

密码策略审计脚本

1. 检查用户密码过期情况

sql
-- 查看即将过期的密码(7天内)
SELECT 
  rolname,
  rolvaliduntil,
  CURRENT_DATE - rolvaliduntil::DATE AS days_until_expiry
FROM 
  sys_roles
WHERE 
  rolcanlogin AND 
  rolvaliduntil IS NOT NULL AND 
  rolvaliduntil::DATE - CURRENT_DATE <= 7
ORDER BY 
  days_until_expiry;

2. 检查密码加密方式

sql
-- 查看使用旧加密方式(md5)的用户
SELECT 
  rolname,
  'md5' AS encryption_method
FROM 
  sys_roles
WHERE 
  rolpassword LIKE 'md5%';

3. 检查密码复杂度

sql
-- V8 R7版本:检查密码强度
SELECT 
  rolname,
  sys_check_password_strength(rolpassword) AS password_strength
FROM 
  sys_roles
WHERE 
  rolcanlogin;

4. 检查被锁定的用户

sql
-- 查看所有被锁定的用户
SELECT 
  rolname,
  rolpasswordlock,
  rolvaliduntil
FROM 
  sys_roles
WHERE 
  rolpasswordlock;

总结

合理的密码策略是KingBaseES数据库安全的重要保障,通过配置密码复杂性要求、有效期设置、历史记录管理和锁定机制,可以有效提高数据库的安全性。在实际生产环境中,DBA应根据业务需求和安全策略,制定适合的密码策略,并定期审计和优化,确保数据库密码的安全性,防止未授权访问。