PostgreSQL®在Aiven平台上使用安全代理工具

这是关于Aiven Security Agent for PostgreSQL®的翻译。

2022年8月11日 – 8月11日,2022年

PostgreSQL® 使用 Aiven 安全代理

Aiven通过开源的方式解决了PostgreSQL扩展功能给用户提供了很棒的功能的安全难题!

問題是… shì…)

Aiven以Database as a Service (DBaaS)的形式提供PostgreSQL®。作为服务的一部分,客户将被赋予特权用户(avnadmin)。然而,该用户没有被授予superuser权限。superuser权限可以绕过所有权限检查,并重新配置数据库。超级用户特权还提供对基础主机上的文件读取和程序执行等交互功能的访问权限。

数据库是非常方便的,但通过扩展功能可以使它更加便利。PostgreSQL支持许多有用的扩展功能,我们希望客户能够使用这些扩展功能。然而,非常遗憾的是,基于PostgreSQL的设计,大部分扩展功能需要进行升级(超级用户)权限的安装。这会带来安全上的问题:如果客户没有超级用户权限,他们如何才能安装扩展功能呢?

你按照计划进行吗?

在许多(或几乎所有)安全问题中,困扰我们的是这些问题只是在特定的上下文环境中才被视为安全问题。实际上,它是几乎所有上下文环境中所需的功能。安全领域一直在为此担忧,经常强调架构设计和开发人员能力的不足才是真正的问题。如前所述,在像Aiven这样的数据库平台服务中,这种情况更加严重。我们将安全感和信任视为我们的卖点,无论处于什么情况下,客户都可以信任我们来管理他们的数据。

在应用程序设计师、安全(以及合规)行业和客户的信任之间,我们应该如何实现这种平衡呢?我们需要确保客户能够充分享受服务的好处,而不必承担不必要的风险。同时,由于我们拥有共同的利益,我们还需要与客户共同承担责任和负担。

更多漏洞 = 更多补丁

我们发现了新的安全漏洞,几乎每时每刻都会应用补丁,而我们就像这只仓鼠一样不断经历着痛苦。作为像Aiven这样与客户数据密切相关的工作人员,每次维护时,都会出现对客户最重要的资产甚至对客户功能的潜在风险。

我们与售后解决方案架构师团队密切合作,努力为客户设计具备最高的恢复能力、可用性和故障耐受性的Aiven服务。回顾2021年12月,由于Log4j项目相继发布了新的补丁,我们经历了一系列维护事件。

症候性斑块

脆弱性 → 补丁 → 脆弱性-微小变化 → 脆弱性-微不同的触发条件补丁 → 脆弱性突变-第三号 → 脆弱性-捕获一些额外突变的补丁。这种情况对于所有相关方来说都非常昂贵。尽管如此,开源开发团队的能力和能量经常不足以提供对整个脆弱性类别的耐久修复。

在我的观点中,这是一家从使用开源软件中获得利益的大公司的最大失败之一。他们似乎不愿意为真正修补问题所需的适当(通常是昂贵的)架构更改付费。这种临时修补周期正是开源世界必须以最好的努力接受的。开发者对此感到沮丧,就像他们的项目用户一样,甚至更甚!

我建议安全领域的人在指责”不够充分”之前,先从开发者的角度思考。全力以赴,意识到即使已经倒下时还要被踢一脚,这无疑会让人在精神上疲惫不堪。

采取不同的方法

每天早上起床之后,我对于去工作感到兴奋和有动力的原因之一是,Aiven的投资者、董事会和管理团队授权我采取不同的方法来应对这个充满了临时补丁的无休止循环。

最近半年以来,与PostgreSQL扩展功能相关的漏洞奖金和内部产品安全性的问题发现有所增加。我们作为开发人员代表那些努力研究这些扩展功能的人,也经历了这种周期性的痛苦。我们不得不成为坏消息的传递者,并且有时不得不与同一个筋疲力尽的开发者多次讨论同一个软件包。幸运的是,Aiven有一支优秀的团队,我们的安全架构师Etienne Stalmans已经找到了适用于我们所遇到的扩展功能相关问题的所有类别的可行缓解措施。

这并不是一个完全的解决方案。完全的解决方案将是通过重新构建几十年前就存在的PostgreSQL的基础。然而,这总比什么都不做要好得多!

PostgreSQL的扩展和Aiven的实施方法。

让我们来看看Aiven是如何为客户实现扩展功能管理以理解此解决方案的。由于涉及到一些技术性的内容,所以我将直接引用Etienne的话来解释:

Aiven允许客户启用预定义的扩展功能列表。为了避免需要超级用户访问权限来安装扩展功能,我们使用pgextwlist扩展功能,使较低权限的用户也能创建扩展功能。pgextwlist首先将权限提升给默认的超级用户postgres,然后执行扩展功能的安装脚本。这将使Aiven面临特权升级攻击的风险。PostgreSQL 对此进行了明确的文档化,链接如下:https://www.postgresql.org/docs/current/sql-createextension.html。

很遗憾,尽管PostgreSQL文档提醒了,但经常遇到的情况是,如果安装扩展功能的脚本被以不安全的方式编写,则用户将能够获得超级用户权限。

拡張功能创建后,另一个常见的设置错误是在SECURITY DEFINER函数中使用SECURITY DEFINER而不使用模式修饰函数。由于扩展功能是由超级用户创建的,因此SECURITY DEFINER函数将以超级用户权限执行。这可能会被攻击者滥用,以高权限执行受攻击者控制的函数。

顾客的有效利用与引发不良事物之间的平衡,是一场为确保顾客获得良好结果而不断进行的战斗。

我的延伸功能是敵對的嗎? (Wǒ de shì de ma?)

看到关于PostgreSQL扩展功能的入站问题的增加,引发了许多无法回答的疑问。pghostile应运而生。这是安全技术团队开发的内部工具,今天我们非常兴奋地能够将其作为开源项目公开!

从项目的readme.md中:

Pghostile可以将PostgreSQL变成对超级用户具有敌对性的环境,并且可以成为攻击者的理想游乐场。Pghostile是一个自动化工具,它重写系统函数(pg_catalog模式的函数),如果这些函数被超级用户调用,攻击者就可以提升特权。

您也可以使用PostgreSQL扩展来测试安全性。通过运行pg_hosfile命令创建一个”exploit函数”,然后执行扩展模块的单元测试,以确认是否能够获得超级用户权限。

总的来说,PostgreSQL存在许多此类问题,pghostile目前正在检查约900个问题(欢迎Pull Request!)。我们在这个版本中与伟大的伙伴加入了。使用Timescale的Sven Klemm开发的出色工具pgspot,可以轻松地确定常见的PostgreSQL扩展配置错误。

拡展功能權限提升的保護

开源这样一个能够帮助我们进一步寻找这种脆弱扩展功能的工具听起来像是“典型的的安全动作”。我们的价值观,即“拥有权”,“开放性”和“勇气”,将推动我们进一步发展。我们需要保护客户免受这种基于扩展功能的权限提升攻击。然而,如果我们将为客户构建的解决方案开源,我们也可以帮助保护数百万个PostgreSQL数据库。

Aiven Security Agent for PostgreSQL(aiven-gatekeeper)可以控制哪些特权函数被公开,并防止它们被用于常见的特权提升攻击。

代理机在启动PostgreSQL服务器时,作为共享库被加载,并通过UtilityProcess钩子来拦截并执行实用函数之前的操作。它可以检查当前的执行状态,并通过判断是否应该允许特权操作来进行安全判断。

代理人会在允许或不允许函数之前,使用以下三个标准进行风险评估:

creating_extension

CREATE EXTENSION関数の実行中に関数が実行される。

is_elevated

現在のユーザはスーパーユーザであるが、セッションユーザがスーパーユーザ権限を持っていない場合、実行コンテキストは “elevated “とみなされる。これはCREATE EXTENSIONまたはSECURITY DEFINER関数の実行中に発生する。

is_security_restricted` です。

PostgreSQLは現在の実行コンテキストをSECURITY RESTRICTEDに設定することができます。エージェントはこれらの既存の制限を補完します。

安全代理商会检查三个主要的实用功能:

    • ロールの変更/作成/付与

スーパーユーザ権限でロールを変更、作成、付与する場合。
スーパーユーザ権限でロールを変更、作成、付与する場合:pg_read_server_files、pg_write_server_files、pg_execute_server_program`。

上記の権限を持つ既存のロールにロールを追加しないようにする。
プログラムへのコピー/プログラムからのコピー

これは通常スーパーユーザか pg_execute_server_program 権限を持つロールのために予約されています。これはコンテキストに関係なく常にブロックされます。Aivenプラットフォームでは、PostgreSQL内からホストコマンドを実行する理由はありません。

ファイルへのコピー/ファイルからのコピー

この機能は通常スーパーユーザか pg_read_server_files または pg_write_server_files 権限を持つロールのために予約されています。これは昇格したコンテキストではブロックされます。

安全代理人会封锁对特定的嵌入式函数及其衍生函数的访问。

    • pg_read_file

 

    • pg_read_binary_file

 

    • pg_reload_conf

 

    • lo_import

 

    lo_export

这些函数都可以对基础文件系统进行读取或写入,并且可以连接以执行命令。

最后,对内部表pg_proc和pg_authid存在写入和无法写入的限制。

代理商是静悄悄地运行的,设计得不会干扰PostgreSQL的合法功能。为了不影响性能,付出了一切努力。就像大多数优秀的安全防护措施一样,在真正需要之前你应该察觉不到其存在。

信任是通过获得并经过验证的。

写一个声称可以解决重要课程的安全漏洞的软件只是一件事情。但是要信任这个软件的作者能够很好地完成工作,并且将其安装在你负责保存数据的生产系统中,是完全不同的事情。通过经历与客户共享这个重担,我们直观地理解了这一点。

为了验证我们的工作是否像我们想象的那样好,我们向尽可能多的人,如朋友和前同事等发出声音,请他们对我们的工作进行审查,并提供关于解决方案架构和实施的第二(第三,第四,第n!)意见。在过去几个月中,我们在开发过程中,我们知道其中一些审阅者实际上将Aiven Security Agent for PostgreSQL部署到生产环境中,为保护数百万个数据库做出了贡献。

尽管我们已经得到了专家的信任,但我们能做的远不止这些。我们联系了应用评估和入侵测试的合作伙伴之一的Leviathan Security Group,询问他们能否评估Aiven Security Agent for PostgreSQL,并为我们提供公布评估结果的工作指示书。

个人来说,我非常高兴地签署了该SoW并完成了工作。第三方对开源项目的验证仍然很少见。您可以阅读他们的完整报告,并与审计、风险或合规人员共享这封适合的信函。我们还将把这些文件作为源代码库的一部分包含在内,并计划在项目中进行重要的代码更改时进行更新。

总之

Aiven采取的方法是尽可能地保持原始服务功能。Aiven并不打算执行PostgreSQL的自定义分支,从自己的PostgreSQL实例迁移到Aiven平台的客户应该知道可以期望什么。通过使用PostgreSQL的钩子机制,可以扩展现有的PostgreSQL功能,并以安全且可预测的方式添加安全性。这还使得解决方案在不同版本的PostgreSQL之间可移植。最重要的是,这种解决方案的开源化非常简单,任何人都可以将其集成到现有的PostgreSQL实例中,而无需重新部署或对系统进行根本性更改。

由于代理程序受限于PostgreSQL扩展机制的设计限制,它无法提供”100%”的解决方案。虽然无法完全防止绕过行级安全(RLS)的特权操作,但可以排除操作被滥用后的可能性。这还可以建立对扩展功能的安装和特权上下文的严格监控和警告,从而实现检测恶意操作的能力。

如果您是使用Aiven for PostgreSQL的客户,那么在2022年7月8日之后启动的所有新实例,或者之后可用的维护更新(Aiven全体PostgreSQL实例的99.91%)将受到Aiven Security Agent for PostgreSQL的保护。如果您尚未执行此维护,请尽快执行。

听取比我聪明得多的人们的话,”某物”比”什么都没有”要”无限大”。我非常荣幸能领导这个由Aiven的安全工程师、开发者和架构师组成的优秀团队,同时得到来自上方的全力支持。

我们相信我们能为社区提供真正有益的东西,尽管我的个人贡献在代码方面根本没有,但是团队做了出色的工作。感谢投资者、董事会成员、高管团队成员、开源程序办公室员工、测试我们工作的朋友和前同事、无名的第三方机构(你知道是谁!)、Leviathan Security Group团队、开发PostgreSQL用Aiven Security Agent的PGhostile团队,特别是感谢给予我们重获信任机会的客户。

请使用中文将以下句子进行同义句改写,只需要一种选项:

请订阅我们的月刊新闻简报,了解Aiven和我们的最新服务动态,以及一些关于开源的有趣信息!您可以在LinkedIn和Twitter上关注我们,获取关于Aiven的每日新闻动态。

如果您想了解服务更新的信息,请查看更改记录。

广告
将在 10 秒后关闭
bannerAds