|
PostgreSQL se ha convertido en la base de datos relacional de código abierto preferida para muchas empresas y nuevas empresas con su diseño extensible para desarrolladores. Una de las razones por las que los desarrolladores usan PostgreSQL es que les permite agregar funciones de base de datos mediante la creación de extensiones con sus lenguajes de programación preferidos.
Ya puede instalar y utilizar extensiones de PostgreSQL en Amazon Aurora PostgreSQL-Compatible Edition y Amazon Relational Database Service para PostgreSQL. Admitimos más de 85 extensiones de PostgreSQL en Amazon Aurora y Amazon RDS, como la pgAudit
extensión para registrar la actividad de su base de datos. Si bien muchas cargas de trabajo usan estas extensiones, escuchamos a nuestros clientes pedir flexibilidad para crear y ejecutar las extensiones de su elección para sus instancias de base de datos de PostgreSQL.
Hoy anunciamos la disponibilidad general de Extensiones de lenguaje de confianza para PostgreSQL (pg_tle
), un nuevo kit de desarrollo de código abierto para crear extensiones de PostgreSQL. Con Trusted Language Extensions para PostgreSQL, los desarrolladores pueden crear extensiones de alto rendimiento que se ejecutan de forma segura en PostgreSQL.
Trusted Language Extensions para PostgreSQL brinda a los administradores de bases de datos control sobre quién puede instalar extensiones y un modelo de permisos para ejecutarlas, lo que permite a los desarrolladores de aplicaciones ofrecer nuevas funciones tan pronto como determinen que una extensión satisface sus necesidades.
Para comenzar a compilar con Trusted Language Extensions, puede usar lenguajes confiables como JavaScript, Perl y PL/pgSQL. Estos lenguajes confiables tienen atributos de seguridad, incluida la restricción del acceso directo al sistema de archivos y la prevención de escaladas de privilegios no deseadas. Puede instalar fácilmente extensiones escritas en un idioma confiable en Amazon Aurora PostgreSQL-Compatible Edition 14.5 y Amazon RDS para PostgreSQL 14.5 o una versión más reciente.
Trusted Language Extensions para PostgreSQL es un proyecto de código abierto con licencia Apache License 2.0 en GitHub. Puede comentar o sugerir elementos en la hoja de ruta de Trusted Language Extensions para PostgreSQL y ayudarnos a respaldar este proyecto en múltiples lenguajes de programación y más. Hacer esto como comunidad nos ayudará a facilitar que los desarrolladores usen las mejores partes de PostgreSQL para crear extensiones.
Exploremos cómo podemos usar Trusted Language Extensions para PostgreSQL para crear una nueva extensión de PostgreSQL para Amazon Aurora y Amazon RDS.
Configuración de Trusted Language Extensions para PostgreSQL
Usar pg_tle
con Amazon Aurora o Amazon RDS para PostgreSQL, debe configurar un grupo de parámetros que cargue pg_tle
en PostgreSQL shared_preload_libraries
ajuste. Elegir Grupos de parámetros en el panel de navegación izquierdo en la consola de Amazon RDS y Crear grupo de parámetros para crear un nuevo grupo de parámetros.
Elegir Crear después de seleccionar postgres14
con Amazon RDS para PostgreSQL en el Familia de grupos de parámetros y pg_tle en el Nombre del grupo. Puedes elegir aurora-postgresql14
para un clúster compatible con PostgreSQL de Amazon Aurora.
Elija un creado pgtle
grupo de parámetros y Editar en el Grupo de parámetros Menú desplegable de acciones. Puedes buscar shared_preload_library
en el cuadro de búsqueda y elija Editar parámetro. Puede agregar sus valores preferidos, incluidos pg_tle
y elige Guardar cambios.
También puede hacer el mismo trabajo en la interfaz de línea de comandos de AWS (AWS CLI).
$ aws rds create-db-parameter-group \
--region us-east-1 \
--db-parameter-group-name pgtle \
--db-parameter-group-family aurora-postgresql14 \
--description "pgtle group"
$ aws rds modify-db-parameter-group \
--region us-east-1 \
--db-parameter-group-name pgtle \
--parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_tle,ApplyMethod=pending-reboot"
Ahora, puede agregar el pgtle
grupo de parámetros a su base de datos de Amazon Aurora o Amazon RDS para PostgreSQL. Si tiene una instancia de base de datos llamada testing-pgtle
puede agregar el pgtle
grupo de parámetros a la instancia de la base de datos usando el siguiente comando. Tenga en cuenta que esto hará que se reinicie una instancia activa.
$ aws rds modify-db-instance \
--region us-east-1 \
--db-instance-identifier testing-pgtle \
--db-parameter-group-name pgtle-pg \
--apply-immediately
Verifique que el pg_tle
biblioteca está disponible en su instancia de Amazon Aurora o Amazon RDS para PostgreSQL. Ejecute el siguiente comando en su instancia de PostgreSQL:
SHOW shared_preload_libraries;
pg_tle
debe aparecer en la salida.
Ahora, tenemos que crear el pg_tle
extensión en su base de datos actual para ejecutar el comando:
CREATE EXTENSION pg_tle;
Ahora puede crear e instalar Trusted Language Extensions para PostgreSQL en su base de datos actual. Si crea una nueva extensión, debe otorgar la pgtle_admin
rol a su usuario principal (por ejemplo, postgres
) con el siguiente comando:
GRANT pgtle_admin TO postgres;
Veamos ahora cómo crear nuestro primer pg_tle
¡extensión!
Creación de una extensión de lenguaje de confianza para PostgreSQL
Para este ejemplo, vamos a crear una extensión pg_tle para validar que un usuario no está configurando una contraseña que se encuentra en un diccionario de contraseñas común. Muchos equipos tienen reglas sobre la complejidad de las contraseñas, especialmente para los usuarios de bases de datos. PostgreSQL permite a los desarrolladores ayudar a hacer cumplir la complejidad de las contraseñas usando el check_password_hook
.
En este ejemplo, creará un gancho de verificación de contraseña utilizando PL/pgSQL. En el gancho, puede verificar si la contraseña proporcionada por el usuario está en un diccionario de 10 de los valores de contraseña más comunes:
SELECT pgtle.install_extension (
'my_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
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 'password must not be found on a 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 'password must not be found on a common password dictionary';
END IF;
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_$
);
Debe habilitar el gancho a través del pgtle.enable_password_check
parámetro de configuración. En Amazon Aurora y Amazon RDS para PostgreSQL, puede hacerlo con el siguiente comando:
$ aws rds modify-db-parameter-group \
--region us-east-1 \
--db-parameter-group-name pgtle \
--parameters "ParameterName=pgtle.enable_password_check,ParameterValue=on,ApplyMethod=immediate"
Estos cambios pueden tardar varios minutos en propagarse. Puede verificar que el valor esté establecido usando el comando SHOW:
SHOW pgtle.enable_password_check;
Si el valor está activado, verá el siguiente resultado:
pgtle.enable_password_check
-----------------------------
on
Ahora puede crear esta extensión en su base de datos actual e intentar establecer su contraseña en una de las contraseñas del diccionario y observar cómo el enlace la rechaza:
CREATE EXTENSION my_password_check_rules;
CREATE ROLE test_role PASSWORD '123456';
ERROR: password must not be found on a common password dictionary
CREATE ROLE test_role;
SET SESSION AUTHORIZATION test_role;
SET password_encryption TO 'md5';
\password
-- set to "password"
ERROR: password must not be found on a common password dictionary
Para deshabilitar el gancho, establezca el valor de pgtle.enable_password_check
a off
:
$ aws rds modify-db-parameter-group \
--region us-east-1 \
--db-parameter-group-name pgtle \
--parameters "ParameterName=pgtle.enable_password_check,ParameterValue=off,ApplyMethod=immediate"
Puedes desinstalar esto pg_tle
extensión de su base de datos y evitar que alguien más ejecute CREATE EXTENSION
en my_password_check_rules
con el siguiente comando:
DROP EXTENSION my_password_check_rules;
SELECT pgtle.uninstall_extension('my_password_check_rules');
Puedes encontrar más extensiones de muestra y darles una oportunidad. Para compilar y probar sus Trusted Language Extensions en su base de datos PostgreSQL local, puede compilar a partir de nuestro código fuente después de clonar el repositorio.
¡Únete a nuestra comunidad!
La comunidad de Trusted Language Extensions para PostgreSQL está abierta a todos. Pruébelo y envíenos sus comentarios sobre lo que le gustaría ver en futuras versiones. Damos la bienvenida a cualquier contribución, como nuevas funciones, extensiones de ejemplo, documentación adicional o cualquier informe de error en GitHub.
Para obtener más información sobre el uso de Trusted Language Extensions para PostgreSQL en la nube de AWS, consulte la documentación de Amazon Aurora PostgreSQL-Compatible Edition y Amazon RDS for PostgreSQL.
Pruébelo y envíe sus comentarios a AWS re: publicar para PostgreSQL o a través de sus contactos habituales de soporte de AWS.
– channy