PostgreSQL 数据库 设置90天密码过期时间的完整方案

PostgreSQL 数据库 设置90天密码过期时间的完整方案

PostgreSQL 数据库 设置90天密码过期时间的完整方案

一、基础密码过期设置方法

  1. 使用ALTER ROLE命令设置密码有效期

    sql 复制代码
    -- 设置90天后过期
    ALTER ROLE username VALID UNTIL (CURRENT_TIMESTAMP + INTERVAL '90 days');
    
    -- 检查设置结果
    SELECT rolname, rolvaliduntil FROM pg_roles WHERE rolname = 'username';
  2. 批量设置所有用户密码过期时间

    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 $$;

二、高级密码策略组合

  1. 密码复杂度要求(建议与过期策略配合使用):

    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
  2. 密码历史记录(防止重复使用旧密码):

    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;

三、自动化管理方案

  1. 创建定期检查脚本(可设置为cron任务):

    bash 复制代码
    #!/bin/bash
    # 检查即将过期的密码(提前7天提醒)
    psql -U postgres -c "SELECT rolname, rolvaliduntil 
                         FROM pg_roles 
                         WHERE rolvaliduntil BETWEEN NOW() AND NOW() + INTERVAL '7 days';"
  2. 密码到期自动锁定功能

    sql 复制代码
    CREATE 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;

四、注意事项

  1. 系统账户排除:不应为postgres等系统账户设置密码过期
  2. 应用账户处理:服务账户可能需要特殊处理或设置为永不过期
  3. 时区问题:确保数据库服务器时区设置正确,避免过期时间计算错误
  4. 备份策略:修改重要账户密码前确保有备份恢复方案
  5. 多节点同步:主从架构中需确保所有节点策略一致