【问题标题】:Roles, groups and set session authorization in postgrespostgres 中的角色、组和设置会话授权
【发布时间】:2016-05-23 02:11:27
【问题描述】:

我正在为多租户应用程序处理 postgres 行级安全性问题。我想通过一个策略来实现这一点,该策略基于我表中的一列租户名称来分隔行。我有每个租户的角色。但是,我通过超级用户的连接来维护一个连接池。这样我就可以只有一个连接池。一旦我有来自租户的查询,我想先删除该租户的权限,然后执行查询。

所以我以超级用户身份连接到数据库,然后执行“设置会话授权租户角色”。这将设置 session_user 和 current_user 变量。但是,问题是该租户用户可以自己执行“设置会话授权 some_other_tenant”,然后行安全性无关紧要。我猜这是因为数据库登录上下文是超级用户。

那么我该如何实现呢?一旦我对某个用户执行“设置会话授权”或“设置角色”,该用户将无法再次运行相同的操作。

谢谢

【问题讨论】:

    标签: postgresql row-level-security


    【解决方案1】:

    您可能想阅读this,以获得答案。

    本质上,创建一个无特权用户并通过该用户登录池(而不是连接池作为主管角色)。登录后,将角色升级为实际连接的用户。上面的 URL 告诉你如何做到这一点。

    我无法理解的是,如果这是一个不受控制的环境,那么即使使用此解决方案,用户也可以升级到其他人的角色并仍然造成严重破坏。所以即使这回答了问题,它可能仍然不是你最终想要做的!

    【讨论】:

    • 谢谢@Robins,这有帮助。你最后说的其实是真的。但是,您所说的“不受控制的环境”到底是什么意思。如何放置控件?
    • 既然你提到了这个this tenant user can himself do a "set session authorization some_other_tenant",我假设这不完全是一个受控环境,所以一个人必须最大限度地偏执。
    • Controlled Environment 是您可以确定 0% 的用户会在 0% 的时间内执行此类用户升级的地方。既然你不能确定......那么这是一个不受控制的环境(我总是想象 Netflix 的 Chaos Monkey 正在破坏我的数据库:) (techblog.netflix.com/2012/07/…) :)
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 2017-02-12
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2013-04-06
    • 2016-01-30
    相关资源
    最近更新 更多