Direkt zum Inhalt

Wie erstelle ich eine Passwortrichtlinie in Amazon RDS für PostgreSQL?

Lesedauer: 5 Minute
0

Ich möchte eine Passwortrichtlinie in Amazon Relational Database Service (Amazon RDS) für PostgreSQL erstellen.

Kurzbeschreibung

Standardmäßig verfügt Amazon RDS für PostgreSQL nicht über Funktionen zur Durchsetzung einer Passwortrichtlinie. Du kannst jedoch PostgreSQL-Hooks und Trusted Language Extensions (TLE)-Erweiterungen verwenden, um die Kernfunktionen zu erweitern. Verwende den Passcheck-Hook, um anzupassen, wie PostgreSQL mit Passwörtern umgeht, wenn du Passwörter für Benutzer oder Rollen erstellst oder änderst.

Hinweis: TLE unterstützt Amazon RDS für PostgreSQL-Versionen 16.1 und neuer, 15.2 und neuer, 14.5 und neuer sowie 13.12 und neuer. Weitere Informationen findest du unter Anforderungen für die Verwendung von Trusted Language Extensions für PostgreSQL.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Eine Kundenparametergruppe erstellen und die TLE-Erweiterung einrichten

Führe die folgenden Schritte aus:

  1. Erstelle eine benutzerdefinierte Parametergruppe und verknüpfe sie dann mit der Amazon RDS für PostgreSQL-Instance.
    Hinweis: Änderungen der Parametergruppen führen zu Ausfallzeiten. Verwende ein Wartungsfenster, um sofortige Ausfallzeiten zu vermeiden.

  2. Richte die TLE-Erweiterung ein.

  3. Melde dich bei der Instance an, führe die folgende Abfrage aus und bestätige dann, dass der Parameter shared_preload_libraries aktualisiert wurde:

    postgres=> SHOW shared_preload_libraries;shared_preload_libraries  
    rdsutils,pg_tle,pg_stat_statements  
    (1 row)  
    postgres=>
  4. Führe die folgende Abfrage aus, um die TLE-Erweiterung zu erstellen:

    CREATE EXTENSION pg_tle;

    Hinweis: Um die Erweiterung pg_tle einzurichten und zu konfigurieren, muss die Datenbankbenutzerrolle über die Rollenberechtigungen rds_superuser verfügen.

  5. Gewähre dem Hauptbenutzer der Amazon RDS für PostgreSQL-Instance die Rolle pgtle_admin. Wenn du einen Standardbenutzer verwendet hast, ist dies der primäre postgres-Benutzer:

    GRANT pgtle_admin TO example-user;

    Hinweis: Ersetze example-user durch den primären Benutzer der Amazon RDS für PostgreSQL-Instance.

Den Passcheck-Hook einrichten

Ein PostgreSQL-Passcheck-Hook überprüft Passwörter für SQL-Vorgänge und erlaubt Benutzern nicht, Passwörter festzulegen, die in der Tabelle password_check.bad_passwords aufgeführt sind. Der Passcheck-Hook überprüft auch die Passwortlänge und bestätigt, dass Passwörter Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen enthalten.

Hinweis: Du kannst die Funktion eines PostgreSQL-Hooks an die spezifischen Bedürfnisse anpassen. Du kannst der Tabelle bad_passwords weitere Passwörter hinzufügen, die erforderliche Passwortlänge ändern oder die Funktion ändern, um die Passwortkomplexität zu überprüfen.

Führe die folgenden Schritte aus:

  1. Führe den folgenden SQL-Befehl pgtle.install_extension aus. Passe den SQL-Code an die spezifischen Bedürfnisse an:

    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_$);

    Hinweis: Ersetze im vorherigen Befehl example-password-check-rules durch den Namen der Regeln zur Passwortprüfung.

  2. Führe die folgende Abfrage aus, um die Erweiterung zu erstellen:

    postgres=> CREATE EXTENSION "example-password-check-rules";

    Hinweis: Ersetze im vorherigen Befehl example-password-check-rules durch den Namen der Regeln zur Passwortprüfung.

  3. Ändere die benutzerdefinierte Parametergruppe, die der Instance zugeordnet ist und aktiviere dann den Parameter pgtle.enable_password_check.

  4. Verwende die folgenden Beispiele, um die Regeln für die Passwortprüfung zu testen.
    Beispiel:

    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)"

    Hinweis: Das vorherige Beispiel weist auf einen Fehler hin, da du keine Passwörter aus dem allgemeinen Passwortwörterbuch verwenden können.
    Beispiel:

    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)"

    Hinweis: Das vorherige Beispiel weist auf einen Fehler hin, da das Passwort mindestens 8 Zeichen lang sein muss.
    Beispiel:

    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)"

    Hinweis: Das vorherige Beispiel weist auf einen Fehler hin, da das Passwort Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten muss.

Verwende für Versionen von Amazon RDS für PostgreSQL, die TLE nicht unterstützen, AWS Identity and Access Management (IAM) für die Amazon RDS oder Kerberos-Authentifizierung. Informationen zum Beschränken der Passworterstellung auf eine Gruppe von Rollen oder eine bestimmte Rolle findest du unter Delegieren und Steuern der Benutzerpasswortverwaltung.

Ähnliche Informationen

Arbeiten mit vertrauenswürdigen Spracherweiterungen für PostgreSQL

Hooks-Referenz für Trusted Language Extensions für PostgreSQL