Saltar al contenido

¿Cómo creo una política de contraseñas en Amazon RDS para PostgreSQL?

6 minutos de lectura
0

Quiero crear una política de contraseñas en Amazon Relational Database Service (Amazon RDS) para PostgreSQL.

Descripción corta

De forma predeterminada, Amazon RDS para PostgreSQL no cuenta con la funcionalidad necesaria para aplicar una política de contraseñas. Sin embargo, puedes usar los enlaces de PostgreSQL y las extensiones de lenguaje de confianza (TLE) para ampliar las capacidades principales. Para personalizar la forma en que PostgreSQL gestiona las contraseñas al crear o cambiar las contraseñas de los usuarios o los roles, utiliza el enlace de verificación de acceso.

Nota: TLE es compatible con las versiones 16.1 y posteriores, 15.2 y posteriores, 14.5 y posteriores y 13.12 y posteriores de Amazon RDS para PostgreSQL. Para obtener más información, consulta Requisitos para usar extensiones de lenguaje de confianza para PostgreSQL.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Creación de un grupo de parámetros de clientes y configuración de la extensión TLE

Sigue estos pasos:

  1. Crea un grupo de parámetros personalizado y, a continuación, asócialo a tu instancia de Amazon RDS para PostgreSQL.
    Nota: Los cambios en el grupo de parámetros provocarán tiempos de inactividad. Utiliza un periodo de mantenimiento para evitar tiempos de inactividad inmediatos.

  2. Configura la extensión TLE.

  3. Inicia sesión en tu instancia, ejecuta la siguiente consulta y, a continuación, confirma que el parámetro shared_preload_libraries está actualizado:

    postgres=> SHOW shared_preload_libraries;shared_preload_libraries  
    rdsutils,pg_tle,pg_stat_statements  
    (1 row)  
    postgres=>
  4. Ejecuta la siguiente consulta para crear la extensión TLE:

    CREATE EXTENSION pg_tle;

    Nota: Para configurar la extensión pg_tle, el rol de usuario de la base de datos debe tener permisos de rol rds_superuser.

  5. Concede el rol pgtle_admin a tu usuario principal de la instancia de Amazon RDS para PostgreSQL. Si has usado un usuario predeterminado, ese es el usuario principal de postgres:

    GRANT pgtle_admin TO example-user;

    Nota: Sustituye example-user por el usuario principal de la instancia de Amazon RDS para PostgreSQL.

Configuración del enlace de verificación de acceso

Un enlace de verificación de acceso de PostgreSQL comprueba las contraseñas de las operaciones de SQL y no permite a los usuarios establecer las contraseñas que figuran en la tabla password_check.bad_passwords. El enlace de verificación de acceso también comprueba la longitud de las contraseñas y confirma que contienen letras mayúsculas y minúsculas, números y caracteres especiales.

Nota: Puedes modificar la función de un enlace de PostgreSQL según tus necesidades específicas. Puedes agregar más contraseñas a la tabla bad_passwords, cambiar la longitud requerida de la contraseña o modificar la función para comprobar la complejidad de la contraseña.

Sigue estos pasos:

  1. Ejecuta el siguiente comando SQL pgtle.install_extension. Modifica el código SQL según tus necesidades 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_$);

    Nota: En el comando anterior, sustituye example-password-check-rules por el nombre de tus reglas de verificación de contraseñas.

  2. Ejecuta la siguiente consulta para crear la extensión:

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

    Nota: En el comando anterior, sustituye example-password-check-rules por el nombre de tus reglas de comprobación de contraseñas.

  3. Modifica el grupo de parámetros personalizado asociado a tu instancia y, a continuación, activa el parámetro pgtle.enable_password_check.

  4. Para probar las reglas de comprobación de contraseñas, utiliza los siguientes ejemplos.
    Ejemplo:

    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: El ejemplo anterior indica un error porque no puedes usar contraseñas del diccionario de contraseñas común.
    Ejemplo:

    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: El ejemplo anterior indica un error porque la contraseña debe tener al menos 8 caracteres.
    Ejemplo:

    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: El ejemplo anterior indica un error porque la contraseña debe contener letras mayúsculas, minúsculas, números y caracteres especiales.

Para las versiones de Amazon RDS para PostgreSQL que no admiten TLE, utiliza AWS Identity and Access Management (IAM) para la autenticación de Amazon RDS o Kerberos. Además, para restringir la creación de contraseñas a un conjunto de roles o a un rol específico, consulta Delegación y control de la administración de contraseñas de los usuarios.

Información relacionada

Uso de extensiones de lenguaje de confianza para PostgreSQL

Referencia de enlaces para extensiones de lenguaje de confianza para PostgreSQL