Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Come posso creare una policy per le password in Amazon RDS per PostgreSQL?
Desidero creare una policy per le password in Amazon Relational Database Service (Amazon RDS) per PostgreSQL.
Breve descrizione
Per impostazione predefinita, Amazon RDS per PostgreSQL non dispone di una funzionalità per applicare una policy delle password. Tuttavia, puoi utilizzare gli hook PostgreSQL e le estensioni Trusted Language Extensions (TLE) per estendere le funzionalità di base. Per personalizzare il modo in cui PostgreSQL gestisce le password quando crei o modifichi password per utenti o ruoli, utilizza l'hook passcheck.
Nota: TLE supporta Amazon RDS per PostgreSQL versione 16.1 e successive, 15.2 e successive, 14.5 e successive e 13.12 e successive. Per ulteriori informazioni, consulta Requisiti per l'utilizzo di Trusted Language Extensions per Postgre SQL.
Risoluzione
Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
Crea un gruppo di parametri del cliente e configura l'estensione TLE
Completa i seguenti passaggi:
-
Crea un gruppo di parametri personalizzato e associalo all'istanza Amazon RDS per PostgreSQL.
Nota: le modifiche ai gruppi di parametri causano tempi di inattività. Utilizza una finestra di manutenzione per evitare tempi di inattività immediati. -
Accedi all'istanza, esegui questa query e verifica che il parametro shared_preload_libraries sia aggiornato:
postgres=> SHOW shared_preload_libraries;shared_preload_libraries rdsutils,pg_tle,pg_stat_statements (1 row) postgres=> -
Esegui questa query per creare l'estensione TLE:
CREATE EXTENSION pg_tle;Nota: per impostare e configurare l'estensione pg_tle, il ruolo utente del database deve avere le autorizzazioni per il ruolo rds_superuser.
-
Concedi il ruolo pgtle_admin all'utente principale dell'istanza Amazon RDS per PostgreSQL. Se hai utilizzato un utente predefinito, tale utente è l'utente postgres principale:
GRANT pgtle_admin TO example-user;Nota: sostituisci example-user con l'utente principale dell'istanza Amazon RDS per PostgreSQL.
Configura l'hook passcheck
Un hook passcheck di PostgreSQL controlla le password per le operazioni SQL e non consente agli utenti di impostare le password elencate nella tabella password_check.bad_passwords. L'hook passcheck controlla anche la lunghezza della password e verifica che le password contengano lettere maiuscole e minuscole, numeri e caratteri speciali.
Nota: puoi modificare la funzione di un hook di PostgreSQL in base alle esigenze specifiche. Puoi aggiungere altre password alla tabella bad_passwords errate, modificare la lunghezza della password richiesta o modificare la funzione per verificarne la complessità.
Completa i seguenti passaggi:
-
Esegui questo comando SQL pgtle.install_extension. Modifica il codice SQL in base alle esigenze specifiche:
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_$);Nota: nel comando precedente, sostituisci example-password-check-rules con il nome delle tue regole di controllo della password.
-
Esegui questa query per creare l'estensione:
postgres=> CREATE EXTENSION "example-password-check-rules";Nota: nel comando precedente, ****sostituisci example-password-check-rules con il nome delle tue regole di controllo della password.
-
Modifica il gruppo di parametri personalizzato associato all'istanza, quindi attiva il parametro pgtle.enable_password_check.
-
Per testare le regole di controllo della password, utilizza i seguenti esempi.
Esempio: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)"Nota: l'esempio precedente indica un errore perché non è possibile utilizzare le password del dizionario delle password comuni.
Esempio: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)"Nota: l'esempio precedente indica un errore perché la password deve contenere almeno 8 caratteri.
Esempio: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)"Nota: l'esempio precedente indica un errore perché la password deve contenere lettere maiuscole, lettere minuscole, numeri e caratteri speciali.
Per le versioni di Amazon RDS per PostgreSQL che non supportano TLE, utilizza AWS Identity and Access Management (AWS IAM) per Amazon RDS o l'autenticazione Kerberos. Inoltre, per limitare la creazione di password a un set di ruoli o a un ruolo specifico, consulta Delega e controllo della gestione delle password utente.
Informazioni correlate
Utilizzo di Trusted Language Extensions per PostgreSQL
Riferimento sugli hook per Trusted Language Extensions per PostgreSQL
- Lingua
- Italiano
