【问题标题】:How to use postgresql roles to connect a database?如何使用 postgresql 角色连接数据库?
【发布时间】:2020-05-16 16:22:20
【问题描述】:

我们今年在课堂上看到了 PostgreSQL 角色。我们的老师告诉我们,如果需要,为每个表甚至列使用具有自定义权限的不同角色会更安全。

我们有一个项目,我们必须在其中使用 PostgreSQL 来构建一个网站,该网站对连接用户的访问权限有限,这些用户可以是不同类型的(管理员、员工、客户)。为了遵循老师的建议,我们创建了具有不同权限的不同角色(每种类型的用户一个)。

我们决定使用 Go 作为后端(使用令牌身份验证),但我不知道如何使用我们的角色,因为我们的角色比用户多。我在文档中读到您“打开”与数据库的连接一次,但要这样做,您必须提供 PostgreSQL 角色。我没有找到在不关闭并重新打开数据库的情况下更改连接角色的方法。如果我在不更改连接角色的情况下运行应用程序,PostgreSQL 如何控制用户是否有权访问请求所需的表。

【问题讨论】:

    标签: postgresql security go roles


    【解决方案1】:

    您可以在 PostgreSQL 中动态更改角色。如果您以nobody 登录,并且nobody 是角色cleve 的成员,您可以通过

    成为角色admins
    SET ROLE cleve;
    

    但是在身份验证期间使用它是有问题的,因为没有什么可以阻止用户运行该语句

    RESET ROLE;
    

    再次成为nobody,然后冒充其他人。

    通常,您可以通过两种方式使用角色系统来利用数据库权限:

    1. 您为应用程序的每个用户都有一个个性化的数据库用户。

      这当然只有在用户集相当稳定且有限的情况下才可行。

      那么个人用户根本没有权限,有adminreaderaccountant等某些角色。登录角色通过成为其中一个或多个角色的成员而被分配权限,并且它们继承其权限。

    2. 您没有个性化的数据库用户。

      那么每组权限只有一个登录角色,比如accountantadminviewer 等等。

      应用程序必须在建立数据库连接之前决定它应该连接哪个用户。如果您需要为此决定进行数据库查询,请以具有非常有限权限的nobody 数据库用户身份执行这些查询。例如,它可能会调用一个验证用户提供的密码的函数。

    【讨论】:

    • 感谢您的详细回答。我们在课堂上看到了“SET ROLE”。我不确定如何在 Go 中做到这一点,但我会(再次)阅读文档。我之前所做的没有用,但我可能做错了。我唯一担心的是,当从一个角色切换到另一个角色时,我认为不可能从受限角色切换到“管理员风格”角色。
    • 绝对可以通过这种方式切换到具有高权限的角色。为此,您希望将用户创建为NOINHERIT,以便它仅在SET ROLE 之后获得特殊权限。但正如我所写,在应用程序中使用SET ROLE 作为安全工具是有问题的,因为它可以通过 SQL 恢复。
    【解决方案2】:

    您可以在会话打开时使用 set role 命令更改角色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多