8

在编写基于 Datomic 和 Clojure 的应用程序时,对等点似乎可以不受限制地访问数据。如何构建一个用户 A 无法访问用户 B 私有数据的多用户系统?

我知道我可以在 Clojure 中编写查询,以便只返回用户 A 的私人数据......但是是什么阻止了恶意用户破解二进制文件以查看用户 B 的私人数据?

更新

根据@Thumbnail 的回答和 John P Hackworth 博客的链接,Clojure/Datomic 应用程序的状态实际上缺乏安全性。

让我更清楚地说明我看到的问题,因为我没有看到任何解决方案,这是引发这个问题的原始问题。

Datomic 有一个数据存储、一个交易者和对等点。对等点位于用户的计算机上,并针对数据存储中的数据运行查询。我的问题是:如何限制对数据存储中数据的访问。由于数据存储是愚蠢的,实际上只是存储数据,我不确定如何提供访问控制。

当 AWS S3 用作数据存储时,客户端(对等方)必须在访问 S3 之前进行身份验证,但是一旦通过身份验证,对等方就无法访问所有数据!?仅限于它运行的查询,如果用户想要获取另一个用户的数据,他们可以更改客户端中的代码(二进制),以便查询以不同的用户名运行,对吗?要清楚......访问控制不只是查询的条件吗?或者是否存在数据存储识别的用户特定连接并且数据存储限制了哪些数据可见?

我错过了什么?

在像 Rails 这样的传统 Web 框架中,服务器端代码限制对数据的所有访问,并对用户进行身份验证和授权。用户可以更改 URL 或客户端代码,但除非用户提供了正确的凭据,否则服务器将不允许访问数据。

由于 Datomic 中的数据存储是愚蠢的,它似乎缺乏基于每个用户限制访问的能力,应用程序(对等方)必须这样做。我不想相信用户的行为,也不想尝试获取其他用户的信息。

一个简单的例子是银行系统。当然,用户将通过身份验证......但在那之后,是什么阻止他们修改客户端代码/二进制文件以更改数据查询以从数据存储中获取其他用户的帐户信息?

更新 - 模型

这里有两个关于 Datomic 和 Clojure 如何工作的可能模型……第一个是我当前的模型(在我的脑海中)。

  • 用户的计算机运行客户端/对等方,该客户端/对等方具有查询并完全访问在客户端启动之前对用户进行身份验证的数据存储,从而将用户限制为我们拥有凭据的用户。
  • 用户的计算机具有与驻留在服务器上的对等点交互的接口(webapp)。查询在服务器上,用户不能修改,因此访问控制本身受到运行对等服务器的安全性的访问控制。

如果第二种模型是正确的,那么我的问题就得到了回答:用户无法修改服务器代码并且服务器代码包含访问控制......因此,我认为驻留在用户计算机上的“对等方”实际上驻留在应用服务器。

4

3 回答 3

14

你的第二个模型是正确的。Datomic 旨在使对等点、交易者和存储都在您控制的软件和硬件的受信任网络边界内运行。您的应用服务器运行对等库,用户通过 HTTP 等协议与您的应用服务器交互。在您的应用程序中,您应该提供某种级别的用户身份验证和授权。这与使用 Rails 等框架编写的大多数应用程序的安全模型一致(即最终用户不需要数据库权限,而是需要应用程序权限)。

Datomic 提供了许多非常强大的抽象来帮助您编写应用程序级别的 auth(n|z) 代码。特别是,由于交易是一流的实体,Datomic 提供了在写入时(http://docs.datomic.com/transactions.html)用任意事实(例如负责人的用户名)注释您的交易的能力。一个给定的事务、一组组等)。在读取时,您可以过滤数据库值(http://docs.datomic.com/clojure/index.html#datomic.api/filter),以便只有与给定谓词匹配的事实才会从查询和其他读取中返回对该数据库值的操作。这使您可以将 authz 问题排除在查询逻辑之外,并始终如一地分层设置安全性。

于 2014-05-07T20:52:28.313 回答
2

据我了解......这远非完全......如果我错了,请纠正我......

Datomic 的显着特点是查询引擎,或者它的大部分,驻留在数据库客户端,而不是数据库服务器中。因此,正如您推测的那样,任何获得对数据库客户端的编程访问权限的“用户”都可以对数据库的任何内容做他们喜欢的事情。

另一方面,Oracle 之类的帐户系统限制了客户端访问,因此恶意用户只能破坏自己的数据。

然而, ...

您的应用程序(数据库客户端)不需要(最好不要!)为任何客户端用户提供开放访问。您需要对用户进行身份验证和授权。您可以向客户端用户显示代码,但只要您的应用程序是安全的,就不能恶意使用这些知识。

进一步的考虑是 Datomic 可以位于 SQL 数据库的前面,可以对其进行受限访问。


网络搜索出现了查斯。Emerick 的Friend库,用于 Clojure 中的用户身份验证和授权。它还发现 John P Hackworth 的冷静评估认为Clojure 网络安全比您想象的要差

于 2014-05-07T09:46:45.413 回答
1

您可以使用事务功能对您的同行/用户实施访问限制。您可以将描述您的策略的数据放入数据库中,并使用事务函数来执行它们。这将机制和策略移动到交易者中。不符合标准的交易可能会失败,或者只是导致没有数据被交易。

显然,您需要某种方法来保护策略数据和事务功能本身。

于 2016-02-25T07:02:49.013 回答