Ir para o conteúdo

Como faço para criar uma política de senha no Amazon RDS para PostgreSQL?

6 minuto de leitura
0

Quero criar uma política de senha no Amazon Relational Database Service (Amazon RDS) para PostgreSQL.

Breve descrição

Por padrão, o Amazon RDS para PostgreSQL não tem funcionalidade para impor uma política de senha. No entanto, é possível usar hooks do PostgreSQL e as extensões Trusted Language Extensions (TLE) para ampliar os recursos principais. Para personalizar como o PostgreSQL manipula senhas quando você cria ou altera senhas para usuários ou perfis, use o passcheck hook.

Observação: o TLE oferece suporte ao Amazon RDS para PostgreSQL para as versões 16.1 e mais recentes, 15.2 e mais recentes, 14.5 e mais recentes e 13.12 e mais recentes. Para obter mais informações, consulte Requisitos para usar extensões de linguagem confiáveis para PostgreSQL.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Crie um grupo de parâmetros do cliente e configure a extensão TLE

Conclua as etapas a seguir:

  1. Crie um grupo de parâmetros personalizado e, em seguida, associe-o à sua instância do Amazon RDS para PostgreSQL.
    Observação: alterações no grupo de parâmetros causarão tempo de inatividade. Use uma janela de manutenção para evitar o tempo de inatividade imediato.

  2. Configure a extensão TLE.

  3. Faça login na sua instância, execute a consulta a seguir e confirme se o parâmetro shared_preload_libraries está atualizado:

    postgres=> SHOW shared_preload_libraries;shared_preload_libraries  
    rdsutils,pg_tle,pg_stat_statements  
    (1 row)  
    postgres=>
  4. Execute a consulta a seguir para criar a extensão TLE:

    CREATE EXTENSION pg_tle;

    Observação: para instalar e configurar a extensão pg_tle, seu perfil de usuário do banco de dados deve ter permissões de perfil rds_superuser.

  5. Conceda o papel pgtle_admin ao usuário principal da sua instância Amazon RDS para PostgreSQL. Se você usou um usuário padrão, esse é o usuário principal do postgres:

    GRANT pgtle_admin TO example-user;

    Observação: substitua example-user pelo usuário principal da sua instância Amazon RDS para PostgreSQL.

Configure o passcheck hook

Um passcheck hook do PostgreSQL verifica senhas para operações SQL e não permite que os usuários definam as senhas listadas na tabela password_check.bad_passwords. O passcheck hook também verifica o tamanho da senha e confirma que as senhas contêm letras maiúsculas e minúsculas, números e caracteres especiais.

Observação: é possível modificar a função de um hook do PostgreSQL de acordo com suas necessidades específicas. É possível adicionar mais senhas à tabela bad_passwords, alterar o tamanho necessário da senha ou modificar a função para verificar a complexidade da senha.

Conclua as etapas a seguir:

  1. Execute o seguinte comando SQL pgtle.install_extension. Modifique o código SQL de acordo com suas necessidades específicas:

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

    Observação: no comando anterior, substitua example-password-check-rules pelo nome das suas regras de verificação de senha.

  2. Execute a consulta a seguir para criar a extensão:

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

    Observação: no comando anterior, substitua example-password-check-rules pelo nome das suas regras de verificação de senha.

  3. Modifique seu grupo de parâmetros personalizados associado à sua instância e ative o parâmetro pgtle.enable_password_check.

  4. Para testar suas regras de verificação de senha, use os exemplos a seguir.
    Exemplo:

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

    Observação: o exemplo anterior indica um erro porque você não pode usar senhas do dicionário comum de senhas.
    Exemplo:

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

    Observação: o exemplo anterior indica um erro porque a senha deve ter pelo menos 8 caracteres.
    Exemplo:

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

    Observação: o exemplo anterior indica um erro porque a senha deve conter letras maiúsculas, minúsculas, números e caracteres especiais.

Para versões do Amazon RDS para PostgreSQL que não oferecem suporte ao TLE, use o AWS Identity and Access Management (AWS IAM) para autenticação Amazon RDS ou Kerberos. Além disso, para restringir a criação de senhas a um conjunto de perfis ou a um perfil específica, consulte Delegar e controlar o gerenciamento de senhas de usuários.

Informações relacionadas

Trabalhando com extensões de linguagem confiáveis para PostgreSQL

Referência de hooks para Trusted Language Extensions for PostgreSQL