PostgreSQL 数据库 设置90天密码过期时间的完整方案
PostgreSQL 数据库 设置90天密码过期时间的完整方案
- PostgreSQL 数据库 设置90天密码过期时间的完整方案
- 一、基础密码过期设置方法
- 二、高级密码策略组合
- 三、自动化管理方案
- 四、注意事项
PostgreSQL 数据库 设置90天密码过期时间的完整方案
一、基础密码过期设置方法
-
使用ALTER ROLE命令设置密码有效期:
-- 设置90天后过期 ALTER ROLE username VALID UNTIL (CURRENT_TIMESTAMP + INTERVAL '90 days');-- 检查设置结果 SELECT rolname, rolvaliduntil FROM pg_roles WHERE rolname = 'username';
-
批量设置所有用户密码过期时间:
-- 为所有非系统用户设置90天有效期 DO $$ DECLAREr RECORD; BEGINFOR r IN SELECT rolname FROM pg_roles WHERE rolname NOT LIKE 'pg_%'LOOPEXECUTE format('ALTER ROLE %I VALID UNTIL %L', r.rolname, CURRENT_TIMESTAMP + INTERVAL '90 days');END LOOP; END $$;
二、高级密码策略组合
-
密码复杂度要求(建议与过期策略配合使用):
-- 启用passwordcheck扩展 CREATE EXTENSION IF NOT EXISTS passwordcheck;-- 配置密码策略(需在postgresql.conf中设置) passwordcheck.min_length = 12 passwordcheck.mixed_case = on passwordcheck.require_digit = on passwordcheck.password_condition_punct = 1
-
密码历史记录(防止重复使用旧密码):
-- 创建密码历史表 CREATE TABLE password_history (username text,password_hash text,change_time timestamp );-- 创建触发器函数 CREATE OR REPLACE FUNCTION record_password_change() RETURNS event_trigger AS $$ BEGININSERT INTO password_historyVALUES (current_user, md5(current_setting('password')), now()); END; $$ LANGUAGE plpgsql;
三、自动化管理方案
-
创建定期检查脚本(可设置为cron任务):
#!/bin/bash # 检查即将过期的密码(提前7天提醒) psql -U postgres -c "SELECT rolname, rolvaliduntil FROM pg_roles WHERE rolvaliduntil BETWEEN NOW() AND NOW() + INTERVAL '7 days';"
-
密码到期自动锁定功能:
CREATE OR REPLACE FUNCTION lock_expired_accounts() RETURNS void AS $$ BEGINUPDATE pg_authid SET rolpassword = NULL, rolvaliduntil = NULL WHERE rolvaliduntil < CURRENT_TIMESTAMP; END; $$ LANGUAGE plpgsql;
四、注意事项
- 系统账户排除:不应为postgres等系统账户设置密码过期
- 应用账户处理:服务账户可能需要特殊处理或设置为永不过期
- 时区问题:确保数据库服务器时区设置正确,避免过期时间计算错误
- 备份策略:修改重要账户密码前确保有备份恢复方案
- 多节点同步:主从架构中需确保所有节点策略一致