2016-02-12 60 views
1

我正忙于为多租户应用程序提供postgres行级别的安全性。我想通过一个策略来实现这一点,该策略基于tenant_name(它是我的表中的一列)分隔行。我有每个租户的角色。但是,我通过超级用户连接来维护连接池。这样我可以只有一个连接池。一旦我有租户的查询,我想先删除特权给该租户,然后执行查询。postgres中的角色,组和会话授权

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

那么我该如何实现呢?一旦我为某些用户“设置会话授权”或“设置角色”,该用户就不应该再次运行相同的事情。

感谢

回答

0

您可能需要阅读this,你的答案。

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

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

+0

Thanks @Robins,这有帮助。事实上你最后提到的是事实。但是,“无法控制的环境”究竟意味着什么?如何把控制? –

+0

既然你提到这个'这个租户用户可以自己做一个“设置会话授权some_other_tenant”',我假设这不是一个完全受控的环境,所以必须是最大的偏执狂。 –

+0

“受控环境”是您可以确保0%的用户将这种类型的用户升级0%的时间。既然你不能确定...那么这是一个不受控制的环境(我总是想象Netflix的混沌猴子对我的数据库造成严重破坏:)(http://techblog.netflix.com/2012/07/chaos-monkey-released -into-wild.html):) –