如何管理 Aurora PostgreSQL 相容版資料庫叢集連線的密碼複雜度與到期日?
我想管理與 Amazon Aurora PostgreSQL 相容版本資料庫叢集連線的密碼複雜度與到期日。
簡短描述
若要管理您的 Aurora PostgreSQL 相容版資料庫叢集密碼,可以使用以下方法:
- 建立密碼檢查勾點與 Trusted Language Extension (TLE)。
- 開啟受限密碼管理功能。
- 使用 AWS Identity and Access Management (IAM) 資料庫驗證。
- 為 IAM 使用者建立自訂密碼政策。
- 使用 AWS Secrets Manager。
解決方法
使用含 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)"
**注意:**前述範例顯示了一個錯誤,因為您不能使用常見密碼字典中的密碼。
若要檢查密碼到期日,請完成以下步驟:
-
執行以下命令,檢查使用者上次變更密碼的時間:
SELECT * FROM password_check.usertime WHERE user_name = 'user1';預期輸出:
user_name | lasttime ----------+---------------------------- user1 | 2025-10-01 18:48:07.319908 (1 row) -
執行以下命令,將上次變更時間設定為 91 天前:
UPDATE password_check.usertime SET lasttime = CURRENT_TIMESTAMP - INTERVAL '91 days' WHERE user_name = 'user1';預期輸出:
UPDATE 1 -
執行以下命令,檢查上次變更時間為 91 天前:
SELECT * FROM password_check.usertime WHERE user_name = 'user1';預期輸出:
user_name | lasttime ----------+---------------------------- user1 | 2025-07-02 18:55:36.248913 (1 row) -
執行以下命令,測試密碼到期功能:
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 -
執行以下命令,確認使用者密碼已變更且上次變更時間已更新:
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 角色的資料庫使用者可以管理密碼。
請完成以下步驟:
- 建立資料庫叢集參數群組。
- 將資料庫叢集參數群組與您的資料庫叢集建立關聯。
- 修改資料庫叢集參數群組,將 rds.restrict_password_commands 設定為 1。
**注意:**若要套用變更,您必須重新啟動您的 Aurora PostgreSQL 相容版主要資料庫執行個體。
使用 IAM 資料庫驗證
使用 IAM 資料庫驗證時,您會使用驗證權杖連線至您的資料庫叢集,而不是使用密碼。
若要使用 IAM 資料庫驗證,請完成以下步驟:
- 開啟 IAM 資料庫驗證。
- 為 IAM 資料庫存取建立 IAM 政策。
- 以主要使用者或具有建立及授予權限能力的使用者身分連線至資料庫叢集。
- 將 rds_iam 角色授予您的使用者。
- 使用 IAM 驗證連線至您的資料庫叢集。
為 IAM 使用者建立自訂密碼政策
如需更多資訊,請參閱為 IAM 使用者設定帳戶密碼政策。
使用 Secrets Manager
使用 AWS Secrets Manager 管理主要使用者密碼。使用 IAM 條件索引鍵,強制 Aurora 管理主要使用者密碼。
如需更多資訊,請參閱使用 Amazon Aurora 與 AWS Secrets Manager 進行密碼管理。
相關資訊
全新 – Amazon Aurora 與 Amazon RDS 的 PostgreSQL Trusted Language Extensions
相關內容
- 已提問 2 年前
- 已提問 2 年前
