¿Cómo creo una política de contraseñas en Amazon RDS para PostgreSQL?
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:
-
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. -
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=> -
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.
-
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:
-
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.
-
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.
-
Modifica el grupo de parámetros personalizado asociado a tu instancia y, a continuación, activa el parámetro pgtle.enable_password_check.
-
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
- Idioma
- Español

Contenido relevante
- preguntada hace 7 meses
- preguntada hace un año
- preguntada hace 8 meses
- preguntada hace un año
- preguntada hace un año