PG 在什么场景需要 OAuth 身份验证方法?
PG 在什么场景需要 OAuth 身份验证方法?
PG 18 新版本提供了OAuth身份验证方法, 但是这个验证方法在什么场景使用呢? OAuth配置门槛其实蛮高的, OAuth该如何使用? 下面来看一下OAuth的作者之一, 来自EDB的 Jacob Champion 分享的文章. 以下内容翻译自: https://www.enterprisedb.com/blog/developing-oauth 同时, 对于如何使用OAuth、OAuth原理、周边工具开发等可以参考他的同事
Guang Yi Xu
的文章.
第一部分: 探索 PostgreSQL 18 OAuth2 身份验证的工作原理
- https://www.enterprisedb.com/blog/preview-postgresql-18s-oauth2-authentication-1-explore-how-it-works
- https://www.enterprisedb.com/blog/preview-postgresql-18s-oauth2-authentication-2-building-custom-oauth2-validator-rust
- https://www.enterprisedb.com/blog/preview-postgresql-18s-oauth2-authentication-3-enhancing-postgresql-client-library-speak
为什么需要 OAuth 身份验证方法?
Postgres 的默认身份验证方法
SCRAM
拥有坚实的加密基础,并且不断改进,将继续成为机器间通信(应用程序)和少量人工客户端(如: DBA、开发者、数据分析师等)的全面卓越选择。但我认为它不太适合大型人工系统,因为维护工作最终归结为为每个可能的(用户、集群)对进行单独的密码管理。对于那些试图保护包含多个数据库的系统、与数百或数千人沟通的人来说,说“我希望我能将所有这些信息都放在一个地方”是很自然的。
不幸的是,Postgres 目前支持的第三方身份验证解决方案有点混乱:
- LDAP,它只是以纯文本形式发送密码并希望获得最佳结果;
- Kerberos 作为一个整体解决方案很难审计和保护,跨平台存在互操作性问题,感觉就像是一个逐渐失去动力的架构;
- TLS 客户端证书,虽然我非常喜欢它们!但对于大多数人来说,在实践中很难维护,他们相当不愿意运行证书颁发机构。
- (还有 RADIUS。我无法对此发表评论;我从未见过它在实践中部署。)
为什么这对开发者、客户和最终用户来说都是一件令人兴奋的事情?
我对 OAuth 感到兴奋,因为它朝着一个生态系统迈进了一步,在这个生态系统中,我们的决策不再基于用户名,而是更多地基于用户权限的声明。我认为以这种方式运作的系统更容易扩展。它还开辟了一些小众用例,比如匿名访问,在这种情况下,你知道最终用户可以访问,但你不必知道用户是谁。 对于客户来说,我认为有些DBA会很乐意摆脱同步脚本和其他定制基础设施,因为这些基础设施需要连接他们的 SSO 服务器和数据库。无论如何,这并非一蹴而就,但总有一个出口。随着验证器实现的发展和成熟,我认为我们可以达到这样的程度:数据库管理员可以按照 自己希望在组织中工作的 方式设置身份验证,然后把时间花在其他更有趣的事情上。 至于最终用户 …… 最终用户真的会“兴奋地”登录吗?我不确定。但我确实希望,对于那些已经需要遵守其组织身份验证设置的用户来说,此功能有助于减少摩擦,并允许他们在更多地方使用他们已经熟悉的身份验证工具。(如果不是这样,我希望在邮件列表中听到它,以便我们可以改进 PG v19 的功能!)你知道什么更令人兴奋吗?未来的改进!它们是什么?
以下是我在 v18 实现中未能实现的一些功能,但我认为最终人们会真正想要的。(它们几乎都与 OAuth“流程”相关:Postgres 客户端通过这些流程与 OAuth 提供程序通信,以确定您的身份以及您愿意授予它哪些权限。)- 我希望能够切换流程而无需编写自定义代码。在 PG18 中,您可以为自己的程序提供自己的客户端流程,但您不能在不开放其他实用程序的情况下将该流程插入到其他实用程序中。这对每个人来说都不够,我们需要找到一种方法来(安全地)允许用户切换到他们自己的实现。
- 我希望我们交付的流程能够安全地缓存令牌。就像没有人愿意在电脑上执行每个操作时都输入密码一样,也没有人愿意每次连接时都重新执行客户端流程。自定义流程(见上文)始终可以实现自己的缓存,但我们应该提供一些可供社区默认使用的功能。我们只需要开发一个安全的地方来存放这些令牌……
- 我想要一个内置的机器对机器流程。PG18 流程是为拥有物理设备的人设计的,因此,如果自治脚本和服务想要使用与人相同的 OAuth 提供程序,就必须实现自定义代码。(这些脚本和服务在 Postgres 中还有其他强大的非 OAuth 选项可用,但对于一些数据库管理员来说,进一步简化和统一他们的设置是有意义的。)
- 我希望将令牌绑定到其客户端。如果令牌在传输过程中泄露或被盗,它可以用来冒充客户端,直到过期。(这比明文密码还是有改进的,但效果并不好。)自从我开始开发这个功能以来,已经出现了一些解决这个问题的规范,我认为我们很快就需要朝着这个方向努力。
- 我想要一个内置的验证器实现。我很失望,因为在 v18 中无法为 OAuth 提供完全“内置”的体验。我不确定这是否真的可行,除非一些主流提供商就其发行的令牌的大量约定达成一致,但我仍抱有希望。我可以梦想。