Come posso gestire la complessità e la scadenza delle password per le connessioni di un cluster di database Aurora compatibile PostgreSQL?
Desidero gestire la complessità e la scadenza delle password per le connessioni a un cluster di database Amazon Aurora compatibile con PostgreSQL.
Breve descrizione
Per gestire le password per un cluster di database Aurora compatibile con PostgreSQL, puoi utilizzare i seguenti metodi:
- Crea un hook per il controllo delle password con Trusted Language Extension (TLE).
- Attiva la funzionalità di gestione delle password con restrizioni.
- Utilizza l'autenticazione AWS Identity and Access Management (AWS IAM) del database.
- Crea una policy delle password personalizzata per gli utenti IAM.
- Utilizza AWS Secrets Manager.
Risoluzione
Utilizza un hook per il controllo delle password con TLE
Per utilizzare un hook per il controllo delle password con TLE, devi prima configurare TLE nel cluster di database Aurora compatibile con PostgreSQL. Quindi crea l'hook per il controllo delle password.
Nota: quando assegni un nome all'hook, non puoi utilizzare user-password-check-rules.
Esempio di codice hook per il controllo delle password:
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_$ );
Nota: modifica il codice in base alle esigenze del caso d'uso. Ad esempio, puoi aggiungere altre password alla tabella bad_passwords, modificare i requisiti di lunghezza della password o verificarne la complessità.
Per controllare se una password soddisfa i requisiti di lunghezza, esegui questo comando:
CREATE ROLE user1 PASSWORD '123456';
Output atteso:
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)"
Nota: l'esempio precedente indica un errore perché la password deve contenere almeno otto caratteri.
Per verificare se una password è troppo comune, esegui questo comando:
CREATE ROLE user1 PASSWORD 'password';
Output atteso:
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)"
Nota: l'esempio precedente indica un errore perché non è possibile utilizzare password contenute nel dizionario delle password comuni.
Per verificare la scadenza di una password, completa i seguenti passaggi:
-
Esegui questo comando per verificare l'ultima volta che un utente ha cambiato una password:
SELECT * FROM password_check.usertime WHERE user_name = 'user1';Output atteso:
user_name | lasttime ----------+---------------------------- user1 | 2025-10-01 18:48:07.319908 (1 row) -
Esegui questo comando per impostare l'ultima volta a 91 giorni:
UPDATE password_check.usertime SET lasttime = CURRENT_TIMESTAMP - INTERVAL '91 days' WHERE user_name = 'user1';Output atteso:
UPDATE 1 -
Esegui questo comando per verificare che l'ultima volta corrisponda a 91 giorni:
SELECT * FROM password_check.usertime WHERE user_name = 'user1';Output atteso:
user_name | lasttime ----------+---------------------------- user1 | 2025-07-02 18:55:36.248913 (1 row) -
Esegui questo comando per verificare la funzione di scadenza delle password:
ALTER USER user1 WITH PASSWORD 'NewTestPass786!';Output atteso:
NOTICE: Password has expired. It must be changed every 90 days. Last change was on 2025-07-02 18:55:36.248913 ALTER ROLE -
Esegui questo comando per verificare che la password utente sia stata modificata con data e ora dell’ultimo aggiornamento:
SELECT * FROM password_check.usertime WHERE user_name = 'user1';Output atteso:
user_name | lasttime ----------+---------------------------- user1 | 2025-10-01 19:18:42.028533 (1 row)
Attiva la funzionalità di gestione delle password con restrizioni
Imposta il parametro rds.restrict_password_commands su 1 in modo che solo gli utenti del database a cui si assegna il ruolo rds_password possano gestire le password.
Completa i seguenti passaggi:
- Crea un gruppo di parametri del cluster di database.
- Associa il gruppo di parametri del cluster di database al cluster di database.
- Modifica il gruppo di parametri del cluster di database impostando rds.restrict_password_commands su 1.
Nota: per applicare la modifica, devi riavviare l'istanza database primaria Aurora compatibile con PostgreSQL.
Utilizza l'autenticazione IAM del database
Con l'autenticazione IAM del database, utilizzi un token di autenticazione per connetterti al cluster di database anziché una password.
Per utilizzare l'autenticazione IAM del database, completa i seguenti passaggi:
- Attiva l'autenticazione IAM del database.
- Crea una policy IAM per l'accesso IAM al database.
- Connettiti al cluster di database come utente primario o utente che può creare e concedere autorizzazioni.
- Concedi ai tuoi utenti il ruolo rds_iam.
- Utilizza l'autenticazione IAM per connetterti al cluster di database.
Crea una policy delle password personalizzata per gli utenti IAM
Per ulteriori informazioni, consulta Configurare una policy delle password di un account per gli utenti IAM.
Utilizza Secrets Manager
Utilizza AWS Secrets Manager per gestire le password degli utenti primari. Utilizza le chiavi di condizione IAM per imporre la gestione Aurora delle password degli utenti primari.
Per ulteriori informazioni, consulta Gestione delle password con Amazon Aurora e AWS Secrets Manager.
Informazioni correlate
Informazioni su ruoli e autorizzazioni di PostgreSQL
New – Trusted Language Extensions for PostgreSQL on Amazon Aurora and Amazon RDS (Novità: Trusted Language Extension (TLE) per PostgreSQL in Amazon Aurora e Amazon RDS)
- Argomenti
- Database
- Lingua
- Italiano
