跳至內容

如何管理 Aurora PostgreSQL 相容版資料庫叢集連線的密碼複雜度與到期日?

4 分的閱讀內容
0

我想管理與 Amazon Aurora PostgreSQL 相容版本資料庫叢集連線的密碼複雜度與到期日。

簡短描述

若要管理您的 Aurora PostgreSQL 相容版資料庫叢集密碼,可以使用以下方法:

解決方法

使用含 TLE 的密碼檢查勾點

若要使用含 TLE 的密碼檢查勾點,您必須先在 Aurora PostgreSQL 相容版資料庫叢集中設定 TLE。然後,建立密碼檢查勾點

**注意:**當您命名勾點時,您不能使用 user-password-check-rules

密碼檢查勾點程式碼範例:

SELECT pgtle.install_extension(
  'user-password-check-rules',
  '1.0',
  'Do not let users use the 10 most commonly used passwords',
  $_pgtle_$
    CREATE SCHEMA password_check;
    REVOKE ALL ON SCHEMA password_check FROM PUBLIC;
    GRANT USAGE ON SCHEMA password_check TO PUBLIC;
    -- Create table for bad passwords
    CREATE TABLE password_check.bad_passwords (plaintext) AS
    VALUES
      ('123456'),
      ('password'),
      ('12345678'),
      ('qwerty'),
      ('123456789'),
      ('12345'),
      ('1234'),
      ('111111'),
      ('1234567'),
      ('dragon');
    -- Create table for tracking user password changes
    CREATE TABLE password_check.usertime (
      user_name text PRIMARY KEY,
      lasttime timestamp
    );
    CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext);
    CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean)
    RETURNS void AS $$
      DECLARE
        invalid bool := false;
        userexists bool;
        last_password_change timestamp;
      BEGIN
        -- Check if user already exists      
        SELECT EXISTS (SELECT user_name FROM password_check.usertime WHERE user_name = username) INTO userexists;
        -- If user exists, check password age
        IF (userexists) THEN
          SELECT lasttime INTO last_password_change
          FROM password_check.usertime
          WHERE user_name = username;
          -- Check if password is older than 90 days
          IF (CURRENT_TIMESTAMP - last_password_change) > INTERVAL '90 days' THEN
            RAISE EXCEPTION 'Password has expired. It must be changed every 90 days. Last change was on %', last_password_change;
          END IF;
          -- Update timestamp for new password change
          UPDATE password_check.usertime SET lasttime = CURRENT_TIMESTAMP WHERE user_name = username;
        ELSE
          -- First time user, add to tracking table
          INSERT INTO password_check.usertime VALUES(username, CURRENT_TIMESTAMP);
        END IF;
        -- Existing password length check
        IF length(password) < 8 THEN
          RAISE EXCEPTION 'Password must be at least 8 characters long.';
        END IF;
        -- Existing common password check
        IF password_type = 'PASSWORD_TYPE_MD5' THEN
          SELECT EXISTS(
            SELECT 1
            FROM password_check.bad_passwords bp
            WHERE ('md5' || md5(bp.plaintext || username)) = password
          ) INTO invalid;
          IF invalid THEN
            RAISE EXCEPTION 'Cannot use passwords from the common password dictionary';
          END IF;
        ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN
          SELECT EXISTS(
            SELECT 1
            FROM password_check.bad_passwords bp
            WHERE bp.plaintext = password
          ) INTO invalid;
          IF invalid THEN
            RAISE EXCEPTION 'Cannot use passwords from the common password dictionary';
          END IF;
        END IF;
        -- Existing complexity check
        IF NOT (password ~ '[A-Z]' AND password ~ '[a-z]' AND password ~ '[0-9]' AND password ~ '[^a-zA-Z0-9]') THEN
          RAISE EXCEPTION 'Password must contain uppercase letters, lowercase letters, numbers, and special characters';
        END IF;
      END
    $$ LANGUAGE plpgsql SECURITY DEFINER;
    GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC;
    SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck');
  $_pgtle_$
);

**注意:**請依您的需求修改程式碼。例如,您可以在 bad_passwords 資料表中新增更多密碼、變更密碼長度需求,或檢查密碼複雜度。

若要檢查密碼是否符合長度要求,請執行以下命令:

CREATE ROLE user1 PASSWORD '123456';

預期輸出:

ERROR: Password must be at least 8 characters long.
CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamptz,bool)
SQL statement "SELECT password_check.passcheck_hook($1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"

**注意:**前述範例顯示了一個錯誤,因為密碼長度必須至少為八個字元。

若要檢查密碼是否過於常見,請執行以下命令:

CREATE ROLE user1 PASSWORD 'password';

預期輸出:

ERROR: Cannot use passwords from the common password dictionary
CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamptz,bool)
SQL statement "SELECT password_check.passcheck_hook($1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"

**注意:**前述範例顯示了一個錯誤,因為您不能使用常見密碼字典中的密碼。

若要檢查密碼到期日,請完成以下步驟:

  1. 執行以下命令,檢查使用者上次變更密碼的時間:

    SELECT * FROM password_check.usertime WHERE user_name = 'user1';

    預期輸出:

    user_name | lasttime
    ----------+----------------------------
    user1     | 2025-10-01 18:48:07.319908
    (1 row)
  2. 執行以下命令,將上次變更時間設定為 91 天前:

    UPDATE password_check.usertime
    SET lasttime = CURRENT_TIMESTAMP - INTERVAL '91 days'
    WHERE user_name = 'user1';

    預期輸出:

    UPDATE 1
  3. 執行以下命令,檢查上次變更時間為 91 天前:

    SELECT * FROM password_check.usertime WHERE user_name = 'user1';

    預期輸出:

    user_name | lasttime
    ----------+----------------------------
    user1     | 2025-07-02 18:55:36.248913
    (1 row)
  4. 執行以下命令,測試密碼到期功能:

    ALTER USER user1 WITH PASSWORD 'NewTestPass786!';

    預期輸出:

    NOTICE: Password has expired. It must be changed every 90 days. Last change was on 2025-07-02 18:55:36.248913
    ALTER ROLE
  5. 執行以下命令,確認使用者密碼已變更且上次變更時間已更新:

    SELECT * FROM password_check.usertime WHERE user_name = 'user1';

    預期輸出:

    user_name | lasttime
    ----------+----------------------------
    user1     | 2025-10-01 19:18:42.028533
    (1 row)

開啟受限密碼管理功能

rds.restrict_password_commands 參數設定為 1,讓只有您授予 rds_password 角色的資料庫使用者可以管理密碼。

請完成以下步驟:

  1. 建立資料庫叢集參數群組
  2. 將資料庫叢集參數群組與您的資料庫叢集建立關聯
  3. 修改資料庫叢集參數群組,將 rds.restrict_password_commands 設定為 1

**注意:**若要套用變更,您必須重新啟動您的 Aurora PostgreSQL 相容版主要資料庫執行個體。

使用 IAM 資料庫驗證

使用 IAM 資料庫驗證時,您會使用驗證權杖連線至您的資料庫叢集,而不是使用密碼。

若要使用 IAM 資料庫驗證,請完成以下步驟:

  1. 開啟 IAM 資料庫驗證
  2. 為 IAM 資料庫存取建立 IAM 政策
  3. 以主要使用者或具有建立及授予權限能力的使用者身分連線至資料庫叢集
  4. 將 rds_iam 角色授予您的使用者
  5. 使用 IAM 驗證連線至您的資料庫叢集

為 IAM 使用者建立自訂密碼政策

如需更多資訊,請參閱為 IAM 使用者設定帳戶密碼政策

使用 Secrets Manager

使用 AWS Secrets Manager 管理主要使用者密碼。使用 IAM 條件索引鍵,強制 Aurora 管理主要使用者密碼

如需更多資訊,請參閱使用 Amazon Aurora 與 AWS Secrets Manager 進行密碼管理

相關資訊

了解 PostgreSQL 角色與權限

全新 – Amazon Aurora 與 Amazon RDS 的 PostgreSQL Trusted Language Extensions

AWS 官方已更新 5 個月前