跳至內容

如何在 Amazon RDS for PostgreSQL 中建立密碼政策?

3 分的閱讀內容
0

我想在 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 擴充功能

請完成下列步驟:

  1. 建立自訂參數群組,然後將其與 Amazon RDS for PostgreSQL 執行個體建立關聯
    **注意:**參數群組變更將導致停機。使用維護時段來避免立即停機。

  2. 設定 TLE 擴充功能

  3. 登入您的執行個體,執行以下查詢,然後確認 shared_preload_libraries 參數已更新:

    postgres=> SHOW shared_preload_libraries;shared_preload_libraries  
    rdsutils,pg_tle,pg_stat_statements  
    (1 row)  
    postgres=>
  4. 執行以下查詢來建立 TLE 擴充功能:

    CREATE EXTENSION pg_tle;

    **注意:**若要設定 pg_tle 擴充功能,您的資料庫使用者角色必須具備 rds_superuser 角色權限。

  5. 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 表中新增更多密碼、變更所需的密碼長度,或修改檢查密碼複雜度的功能。

請完成下列步驟:

  1. 執行以下 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 替換為您密碼檢查規則的名稱。

  2. 執行以下查詢來建立擴充功能:

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

    **注意:**在上述命令中,**將 **example-password-check-rules 替換為您密碼檢查規則的名稱。

  3. 修改與您執行個體相關聯的自訂參數群組,然後啟用 pgtle.enable_password_check 參數。

  4. 若要測試您的密碼檢查規則,請使用下列範例。
    範例:

    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 RDSKerberos 驗證。此外,若要將密碼建立限制為一組角色或特定角色,請參閱委託和控制使用者密碼管理

相關資訊

使用 Trusted Language Extensions for PostgreSQL

Trusted Language Extensions for PostgreSQL 的勾點參考