【问题标题】:Symfony - Multiple Database Users - Principle of Least PrivilegeSymfony - 多个数据库用户 - 最小权限原则
【发布时间】:2014-03-11 22:43:42
【问题描述】:

我绝对是 Symfony 的菜鸟,目前我正处于学习曲线的上坡路,但我仍在努力前进 - 我们都曾在某个时候到达过那里。

我在设计我的应用程序时阅读了一些资源,其中之一是信息安全中的最小权限原则:

In information security, computer science, and other fields, the principle of least privilege, also known as the principle of minimal privilege or just least privilege, requires that in a particular abstraction layer of a computing environment, every module (such as a process, a user or a program on the basis of the layer we are considering) must be able to access only such information and resources that are necessary to its legitimate purpose.

考虑到这一点,我决定需要 3 个不同的数据库用户来访问我的数据库:

  1. 只读
  2. 易失性 - 插入、更新、删除
  3. 管理员 - 锁定、备份、更改

在我看来,对于 Symfony,它的设计考虑了单个数据库用户,虽然它看起来是 possible to use multiple users/connections,但似乎也不建议将其作为标准做法:

Using multiple entity managers is pretty easy, but more advanced and not usually required. Be sure you actually need multiple entity managers before adding in this layer of complexity.

那么我的问题是:

  1. 我是否让事情变得更复杂?
  2. 使用单个数据库用户是否会降低 Symfony 的安全性?
  3. 我的文章是否链接到了在 Symfony 中实现最小权限原则的正确方法?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    我认为你让它变得比它需要的更复杂。

    在大多数情况下,您关心的是用户域对象的访问或特权。通常,您可以使用更简单的方法在应用程序级别识别所有权(例如,检查对象的关联用户是否实际上是登录并尝试访问它的用户)来接近此级别的安全性,或者您可以申请通过Access Control List 获得更复杂的所有权和权限模型。

    至于使用单用户是否会使您的数据库或多或少安全。这取决于架构和您要执行的操作。但是,我确实认为它不可避免地会带来超出您已经经历的设计和架构挑战。


    根据我对 Web 应用程序的经验,您确实希望限制与应用程序关联的数据库用户的权限,但是该用户应该具有读写权限(例如,您的 read-onlyvolatile 用户的组合上面在您的问题中列出)。您可能还有一个辅助数据库用户(从您的应用程序逻辑外部化),该用户可直接用于数据库以执行您的管理操作。

    下面,Nico 做了一个很好的观察,暗示你真正要找的是Role based security,这允许你定义不同的角色(例如AnonymousUserAdmin 等)然后可以用来执行关于谁可以在您的应用程序中做什么的基本逻辑。

    例如:Anonymous 用户可以查看数据,但不能创建编辑数据。具有User 角色的经过身份验证的用户可以查看创建编辑内容,但他们可能在应用程序中进一步被限制为只能被能够编辑他们拥有的内容。最后,具有Admin 角色的用户可以不受限制地访问查看创建编辑所有内容。

    以上示例在后端使用单个数据库用户,与您配置的数据库连接相关联。

    除此之外,如上所述和下面讨论的,您可以拥有另一个数据库用户。这在很大程度上取决于您是否想让您的 Symfony 应用程序拥有全部或部分权限。如果您想让另一个用户担任 DBA 的系统管理员角色,您可以创建该用户并将其附加到数据库表空间或模式,这个用户与 Symfony 应用程序关联。它作为一个超级用户,可以在应用程序外部运行以管理数据库,而不受应用程序数据库用户可能受限的权限的限制。

    【讨论】:

    • 你的最后一段是我的意思。为了实现最小权限原则,我的应用程序需要多个数据库用户,每个用户都具有一组预定义的权限。如果有人点击我的查看页面,则读取用户应连接到数据库以检索记录。其他人可能会点击我的评论页面并发表评论。这应该与 volatile 用户一起完成。离线管理员工作将使用第三个帐户完成,并且不会将凭据存储在任何配置文件中。这可以用 Symfony 和 Doctring 完成吗?
    • 是的,但是您的“谁可以执行什么操作”的逻辑是在应用程序级别,很可能使用 ACL。因此,您实际上只有一个数据库用户,它至少是您的read-onlyvolatile 用户的组合。如果您还想通过应用程序公开它,它还可能包括管理权限功能。虽然我只是将管理权限外部化给第二个用户,并且没有任何与该用户交互的 Symfony 应用程序。
    • 你是说我的 Symfony 应用程序或任何应用程序不应该有多个后端数据库用户吗?从我读到的几篇关于 POLP 的文章中,根据他们的功能拥有多个后端用户是一种很好的做法。如果我能再次找到它们,我将链接这些文章。
    • 我的意思是,对于您的应用程序,我构建它的方式是使用单个数据库用户。此数据库用户应该是您的read-onlyvolatile 角色的组合。如果您需要一个管理数据库用户,您可以创建一个,但它们在 Symfony 应用程序外部(例如,当您直接与 Oracle、PostgreSQL、MySQL 等交互时使用它们)。今天有空的时候,我会尽量澄清以上内容。
    • @JohntheRipper 您似乎正在尝试使用 mysql 用户实现 ACL。这可能会导致 mysql 用户混乱,因为您的应用程序具有的功能越多,您需要对应用程序进行分段的用户就越多。我建议你阅读en.wikipedia.org/wiki/Role-based_access_control
    【解决方案2】:

    您的报价适用于服务器级别的用户,而不是直接适用于应用程序级别。如果您希望您的应用程序是多用户的,即 user1 可以访问该页面并添加 cmets 但 user2 不能,您需要对此类行为进行编码。检查RBAC 是如何实现的。这就是你需要的。

    将在您的服务器上运行的 php/ruby/python/whatever 代码通常由一个用户运行,即 http 用户。在您的情况下,可能是用户 apache 可以访问 http 文件夹、/tmp 文件夹并与 mysql 连接。在 mysql 中,您可以拥有多个只能访问某个数据库的用户。请记住,mysql 用户与服务器用户或您的应用程序用户无关。

    如果您需要的是多个用户,每个用户都有自己的数据库,那么您需要一个登录层来创建实体管理器,该管理器将与只能读/写用户数据库的 mysql 用户连接。

    【讨论】:

    • 我不同意你所说的关于 mysql 用户的说法。有几篇与最小权限原则相关的文章指出,对于数据库连接,最好使用多个帐户,每个帐户都针对特定角色量身定制。例如,如果您有一个博客并且一些点击了您的 read_blog 页面,那么您有一个只读数据库用户连接并检索数据。另一方面,添加 cmets 需要具有写访问权限的用户等。所以我试图在 symfony 中实现这一点:多个用户以不同的角色/权限连接到数据库。
    • @JohntheRipper 恕我直言,实现您的方式(mysql 上的 RO、RW 用户)比在应用程序级别实现此功能要困难得多。我所描述的是做这种事情的一般方法,没有太多问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多