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