Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 Amazon RDS for PostgreSQL 中建立密碼政策?
我想在 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 中建立密碼政策。
簡短描述
預設情況下,Amazon RDS for PostgreSQL 沒有強制執行密碼政策的功能。但是,您可以使用 PostgreSQL 勾點和 Trusted Language Extensions (TLE) 擴充功能來擴充核心功能。若要自訂 PostgreSQL 在建立或變更使用者或角色密碼時處理密碼的方式,請使用 passcheck 勾點。
**注意:**TLE 支援 Amazon RDS for PostgreSQL 版本 16.1 及更新版本、15.2 及更新版本、14.5 及更新版本以及 13.12 及更新版本。如需詳細資訊,請參閱使用 Trusted Language Extensions for PostgreSQL 的要求。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
建立客戶參數群組並設定 TLE 擴充功能
請完成下列步驟:
-
建立自訂參數群組,然後將其與 Amazon RDS for PostgreSQL 執行個體建立關聯。
**注意:**參數群組變更將導致停機。使用維護時段來避免立即停機。 -
登入您的執行個體,執行以下查詢,然後確認 shared_preload_libraries 參數已更新:
postgres=> SHOW shared_preload_libraries;shared_preload_libraries rdsutils,pg_tle,pg_stat_statements (1 row) postgres=> -
執行以下查詢來建立 TLE 擴充功能:
CREATE EXTENSION pg_tle;**注意:**若要設定 pg_tle 擴充功能,您的資料庫使用者角色必須具備 rds_superuser 角色權限。
-
將 pgtle_admin 角色授予您的 Amazon RDS for PostgreSQL 執行個體主要使用者。如果您使用了預設使用者,那麼該使用者就是主要的 postgres 使用者:
GRANT pgtle_admin TO example-user;**注意:**將 example-user 替換為您的 Amazon RDS for PostgreSQL 執行個體主要使用者。
設定 passcheck 勾點
PostgreSQL passcheck 勾點會檢查 SQL 作業的密碼,且不允許使用者設定 password_check.bad_passwords 表中所列的密碼。passcheck 勾點還會檢查密碼長度,並確認密碼包含大寫和小寫字母、數字和特殊字元。
**注意:**您可以根據您的特定需求修改 PostgreSQL 勾點函式。您可以在 bad_passwords 表中新增更多密碼、變更所需的密碼長度,或修改檢查密碼複雜度的功能。
請完成下列步驟:
-
執行以下 pgtle.install_extension SQL 命令。根據您的具體需求修改 SQL 程式碼:
SELECT pgtle.install_extension ( 'example-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 password_check.bad_passwords (plaintext) AS VALUES ('123456'), ('password'), ('12345678'), ('qwerty'), ('123456789'), ('12345'), ('1234'), ('111111'), ('1234567'), ('dragon'); 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; BEGIN -- Check password length IF length(password) < 8 THEN RAISE EXCEPTION 'Password must be at least 8 characters long.'; END IF; -- Check common passwords from password from bad_passwords table 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; -- Check password contains uppercase lowercase number and special character 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_$);**注意:**在上述命令中,將 example-password-check-rules 替換為您密碼檢查規則的名稱。
-
執行以下查詢來建立擴充功能:
postgres=> CREATE EXTENSION "example-password-check-rules";**注意:**在上述命令中,**將 **example-password-check-rules 替換為您密碼檢查規則的名稱。
-
修改與您執行個體相關聯的自訂參數群組,然後啟用 pgtle.enable_password_check 參數。
-
若要測試您的密碼檢查規則,請使用下列範例。
範例:postgres=> CREATE ROLE t_role PASSWORD 'password';ERROR: Cannot use passwords from the common password dictionary CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 25 at RAISE 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)"**注意:**上述範例顯示了一個錯誤,因為您不能使用常見密碼字典中的密碼。
範例:postgres=> CREATE ROLE t_role PASSWORD 'pass';ERROR: Password must be at least 8 characters long. CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 7 at RAISE 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)"**注意:**上述範例顯示了一個錯誤,因為密碼長度必須至少為 8 個字元。
範例:postgres=> CREATE ROLE t_role PASSWORD 'passwordd';ERROR: Password must contain uppercase letters, lowercase letters, numbers, and special characters CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 31 at RAISE 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)"**注意:**上述範例顯示了一個錯誤,因為密碼必須包含大寫字母、小寫字母、數字和特殊字元。
對於不支援 TLE 的 Amazon RDS for PostgreSQL 版本,請使用AWS Identity and Access Management (IAM) for Amazon RDS 或 Kerberos 驗證。此外,若要將密碼建立限制為一組角色或特定角色,請參閱委託和控制使用者密碼管理。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 2 年前
- 已提問 3 年前
- 已提問 1 年前