【问题标题】:How to enable access control in SQLite?如何在 SQLite 中启用访问控制?
【发布时间】:2016-03-12 05:29:40
【问题描述】:

我们有一个使用 SQLite 作为嵌入式 RDBMS 的应用程序。最初,该应用程序是为单机和单用户设计的。但随着时间的推移,该项目的范围已经扩大。现在我们需要的功能之一是 Fine grained access control.

现在正如Appropriate Uses For SQLite 中提到的那样

... SQLite 不得不牺牲其他 一些人认为有用的特征,例如高 并发,细粒度的访问控制,丰富的内置 函数...

在这个forum post

sqlite 没有用户名和密码。你无法保护数据 以这种方式保存文件。

所以,从上面很明显,访问控制不可用。从某种意义上说,它主要用于移动应用程序、浏览器或任何需要嵌入式数据库的地方。

根据SO post,可以加密数据库。但据我所知,我不能将其描述为fine grained access control,因为 SQLite 数据库绑定到单个加密密钥。另外,我不能有多个用户和不同的访问级别。

Now my question are:

  1. 是否可以在 SQLite 中启用访问控制? (我可能已经回答了我的问题,但为了我内心的满足,我还是问了这个问题:))
  2. 我对@9​​87654327@与加密相关的理解是否正确?
  3. 假设我对单机和单用户使用加密,那么与真正的fine grained access control 相比,它的缺点是什么? (性能可能是其中之一,因为我们必须为每个连接解密它......不确定)

Some Useful Information

  1. 我们使用的是最新版本的 SQLite。
  2. SQLite 作为源代码的一部分嵌入。
  3. 在其全部容量下,我们可以预期一个大小为 1 GB 或左右的数据库。

注意:我知道使用任何其他可以访问控制的 RDBMS 都很好,但问题是针对 SQLite 的。请从这个角度回答他们。谢谢。

【问题讨论】:

    标签: c encryption sqlite access-control


    【解决方案1】:

    SQLite 中没有访问控制(意思是 GRANT / REVOKE 表级访问控制)。您必须通过应用程序代码提供所需的任何访问控制。加密仅在最粗略的级别提供访问控制——您可以访问或不访问数据库。

    【讨论】:

    • 我们主要担心有人可能会使用 sqlite 预编译的二进制文件从外部访问数据库。任何想法如何避免这种情况?还是加密是唯一可行的解​​决方案?
    • 嗯,您的第一层防御是将 SQLite 文件视为包含敏感公司信息的 Word 文档。使文件不可访问。在那之后,是的,加密可以提供非常广泛的访问控制级别。但这不是很好的控制水平。
    【解决方案2】:

    首先,您将如何共享 SQLite 数据库? SQLite 没有像 mysql/postgresql 这样的服务器-客户端架构。

    如果您希望多台计算机同时使用同一个数据库,您可能需要迁移到 MySQL 或 PostgreSQL,否则这将与共享一个 Microsoft Access 数据库相同。

    如果您执行大量插入/更新/删除操作,SQLite 会随着时间的推移变得非常大。该文件将始终增长,但永远不会缩小。

    【讨论】:

    • 是的,我们知道它没有服务器-客户端架构。目前我们只是头脑风暴。由于我们所有的用户都在局域网中,因此一个想法是在文件服务器上提供共享文件夹,所有应用程序实例都将访问那里的共享数据库。最终我们可能会转向 MySQL 或 PostgreSQL,但目前正在探索一些围绕 SQLite 的 hack。谢谢。
    • 哦,那会以一种非常丑陋的方式工作。预计会看到很多超时和事务错误,并准备好处理它们。
    • 你说得对,SQLite 是一个共享文件数据库,而不是客户端服务器。但是,SQLite 与 MS Access 完全不同。此外,SQLite 中未使用的磁盘空间可以使用 Vacuum 命令恢复,或者使用 auto_vacuum 自动恢复。
    【解决方案3】:

    我不知道这个想法会有多好,如果有的话,所以非常欢迎其他 cmets。

    你能做类似以下的事情吗...

    在每个终端上都有一个本地嵌入的 SQLite 数据库。

    当应用程序关闭时,或每次更新内部数据时(我猜是你的选择),在位于“网络上”某处的“主数据库”中创建一个触发器。在这里插入更新的值,并且每个字段都有第二列来存储用户的名称(例如取自本地终端登录名)。

    我不确定这是否可行?然后,您可以在每个“本地”sqlite 文件中实现一个表,该表是用户名和密码列表,以控制对后端主文件的访问(并且可能对 sqlite 文件本身,使用您的应用程序要求用户名)和他们的特定密码)。然后,您甚至可以启用“仅查看”来宾用户,该用户(通过您的应用程序)只能对数据执行查找。该表显然只需要从与主数据库的连接中写入。

    您当然需要构建一种方法来使用服务器上的副本更新每个本地副本,并控制任何损坏/完整性问题...这可能会开始产生其他问题并导致您的应用程序前端变得相当复杂(据我所知,SQLite 无法在内部进行这种测试,因为 sqlite 不是客户端/服务器类型的 RDBMS)。

    当然,一旦你完成了所有这些艰苦的工作,你可以将它分享给 SQLite 团队,然后 sqlite 将在许多实例中变得更加实用。

    大卫

    【讨论】:

      【解决方案4】:

      在查找这个确切的主题时,我想到了这个想法(我正在使用 python 与数据库交互):

      1. 创建一个“管理员”表
      2. 存储用户名和密码列表(当然是散列)
      3. 在python中创建用户名/密码提示,如果哈希和密码不匹配则退出
      4. 创建具有权限级别的列
      5. 使用这些权限级别(以规范化)和该级别可以执行的相关查询类型创建一个表。可选 - 在该表中创建另一列来命名权限级别
      6. 通过与该检查的该用户的权限级别匹配的函数传递每个查询,并查看查询是否包含任何已批准的命令。如果没有,给出访问受限提示。

      显然不是一成不变的,我认为有一些方法可以绕过“包含检查”,所以我也会对此进行头脑风暴。需要考虑的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2011-06-17
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        相关资源
        最近更新 更多