推出适用于 PostgreSQL 的 Trusted Language Extensions

推出适用于 PostgreSQL 的 Trusted Language Extensions_第1张图片

推出适用于 PostgreSQL 的 Trusted Language Extensions_第2张图片

点击上方【凌云驭势 重塑未来】

一起共赴年度科技盛宴!

PostgreSQL 凭借其面向开发者的可扩展设计,已成为许多企业和初创企业首选的开源关系数据库。开发人员使用 PostgreSQL 的原因之一是,通过使用自己喜欢的编程语言,他们可以构建扩展来添加数据库功能。

首选的开源关系数据库:

https://aws.amazon.com/blogs/aws/amazon-rds-for-postgresql-now-available/

您已经可以在 Amazon Aurora PostgreSQL 兼容版适用于 PostgreSQL 的 Amazon Relational Database Service 中安装并使用 PostgreSQL 扩展。在 Amazon Aurora 和 Amazon RDS 中支持超过85个 PostgreSQL 扩展,例如用于记录数据库活动的 pgAudit 扩展。许多工作负载都使用这些扩展,但客户要求灵活地为 PostgreSQL 数据库实例构建和运行他们选择的扩展。

Amazon Aurora PostgreSQL 兼容版:

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Appendix.PostgreSQL.CommonDBATasks.html

适用于 PostgreSQL 的 Amazon Relational Database Service:

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Extensions.html

pgAudit 扩展:

https://aws.amazon.com/premiumsupport/knowledge-center/rds-postgresql-pgaudit/

今天,我们宣布正式推出适用于 PostgreSQL Trusted Language Extensions(pg_tle),这是一款用于构建 PostgreSQL 扩展的新开源开发工具包。借助适用于 PostgreSQL 的 Trusted Language Extensions,开发人员可以构建在 PostgreSQL 上安全运行的高性能扩展。

采用适用于 PostgreSQL 的 Trusted Language Extensions,数据库管理员可以控制谁可以安装扩展以及运行扩展的权限模型,让应用程序开发人员在确定扩展程序满足其需求后立即提供新功能。

要开始使用 Trusted Language Extensions 进行构建,您可以使用可信语言,例如 JavaScript、Perl 和  PL/pgSQL。这些可信语言具有安全属性,包括限制直接访问文件系统和防止不必要的权限升级。您可以轻松地在 Amazon Aurora PostgreSQL 兼容版14.5和 Amazon RDS for PostgreSQL14.5或更高版本上安装用可信语言编写的扩展。

适用于 PostgreSQL 的 Trusted Language Extensions 是一个在 GitHub 上 Apache License2.0下获得许可的开源项目。您可以在适用于 PostgreSQL 的 Trusted Language Extensions 路线图上评论或提出建议,帮助我们支持跨多种编程语言的项目等。作为一个社区来做这件事将帮助开发者更容易使用 PostgreSQL 的最佳部分来构建扩展。

让我们探讨一下如何使用适用于 PostgreSQL 的 Trusted Language Extensions 为 Amazon Aurora 和 Amazon RDS 构建新的 PostgreSQL 扩展。

设置适用于 PostgreSQL 的 Trusted Language Extensions


要将 pg_tle 与 Amazon Aurora 一起使用,或者使用 Amazon RDS for PostgreSQL,您需要设置一个参数组,在 PostgreSQL shared_preload_libraries 设置中加载 pg_tle。在 Amazon RDS 控制台的左侧导航窗格中选择参数组,然后选择创建参数组以创建新的参数组。

参数组:

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

在参数组系列中选择 postgres14 和 Amazon RDS for PostgreSQL,并在组名中选择 pg_tle 后,选择创建。您可以为 Amazon Aurora PostgreSQL 兼容版的集群选择 aurora-postgresql14。

推出适用于 PostgreSQL 的 Trusted Language Extensions_第3张图片

选择已创建的 pgtle 参数组,然后在参数组操作下拉菜单中选择编辑。您可以在搜索框中搜索 shared_preload_library,然后选择编辑参数。您可以添加首选值,包括 pg_tle,然后选择保存更改。

推出适用于 PostgreSQL 的 Trusted Language Extensions_第4张图片

您也可以在 Amazon 命令行界面(Amazon CLI)中执行同样的任务。

Bash

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

左滑查看更多

现在,您可以将 pgtle 参数组添加到 Amazon Aurora 或 Amazon RDS for PostgreSQL 数据库中。如果您有一个名为 testing-pgtle 的数据库实例,则可以使用以下命令将 pgtle 参数组添加到数据库实例中。值得注意的是,这将导致活动实例重启。

Bash

$ aws rds modify-db-instance \  
--region us-east-1 \  
--db-instance-identifier testing-pgtle \  
--db-parameter-group-name pgtle-pg \  
--apply-immediately

左滑查看更多

验证 pg_tle 库在 Amazon Aurora 或 Amazon RDS for PostgreSQL 实例上是否可用。在您的 PostgreSQL 实例上运行以下命令:

SQL

SHOW shared_preload_libraries;

pg_tle 应该出现在输出中。

现在,我们需要在当前的数据库中创建 pg_tle 扩展来运行这个命令:

SQL

CREATE EXTENSION pg_tle;

现在,您可以在当前数据库中创建和安装适用于 PostgreSQL 的 Trusted Language Extensions。如果您创建了新的扩展,则应使用以下命令将 pgtle_admin 角色授予您的主要用户(例如 postgres):

SQL

GRANT pgtle_admin TO postgres;

现在让我们看看如何创建我们的第一个 pg_tle 扩展!

构建适用于 PostgreSQL 的 Trusted Language Extension

在这个示例中,我们将构建一个 pg_tle 扩展来验证用户是否没有设置常见密码字典中的密码。许多团队都对密码的复杂性制定了规则,特别是对于数据库用户而言。PostgreSQL 允许开发人员使用 check_password_hook 帮助强制执行密码复杂性。

在此示例中,您将使用 PL/pgSQL 构建密码检查挂钩。在挂钩中,您可以查看用户提供的密码是否在包含10个最常用密码值的字典中:

SQL

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

左滑查看更多

您需要通过 pgtle.enable_password_check 配置参数启用挂钩。在 Amazon Aurora 和 Amazon RDS for PostgreSQL 上,您可以使用以下命令来实现:

Bash

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

左滑查看更多

这些更改可能需要几分钟才能传送。您可以使用 SHOW 命令检查该值是否已设置:

SQL

SHOW pgtle.enable_password_check;

如果该值启用,您将看到以下输出:

SQL

pgtle.enable_password_check
----------------------------- 
on

现在您可以在当前的数据库中创建扩展,尝试将密码设置为字典中的一个密码,然后观察挂钩是如何拒绝的:

SQL

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

左滑查看更多

要禁用挂钩,请将 pgtle.enable_password_check 的值设置为 off:

Bash

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

左滑查看更多

您可以使用以下命令从数据库中卸载这个 pg_tle 扩展,防止其他人在 my_password_check_rules 上运行创建扩展:

SQL

DROP EXTENSION my_password_check_rules;
SELECT pgtle.uninstall_extension('my_password_check_rules');

左滑查看更多

您可以找到更多扩展示例并尝试一下。要在本地 PostgreSQL 数据库中构建和测试 Trusted Language Extensions,可以在克隆存储库后使用我们的源代码进行构建。

加入社区!了解更多可拓展设计。我们欢迎任何意见建议,例如新功能、扩展示例、附加文档或 GitHub 中的任何错误报告。更多内容,后续持续分享。

caaaa3d21fab5c98672723f847d9059d.png

2022亚马逊云科技 re:Invent 全球大会

中国行即将开启

点击下方图片即刻观看

推出适用于 PostgreSQL 的 Trusted Language Extensions_第5张图片

推出适用于 PostgreSQL 的 Trusted Language Extensions_第6张图片

推出适用于 PostgreSQL 的 Trusted Language Extensions_第7张图片

听说,点完下面4个按钮

就不会碰到bug了!

推出适用于 PostgreSQL 的 Trusted Language Extensions_第8张图片

你可能感兴趣的:(postgresql,数据库)