外观
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应根据业务需求和安全策略,制定适合的密码策略,并定期审计和优化,确保数据库密码的安全性,防止未授权访问。
