作为休息服务的CouchDB访问似乎不安全。任何人都可以访问数据库并在文档曝光后删除/添加文档。
有什么策略来保护CouchDB?
答案 0 :(得分:18)
自2009年以来发生了很多变化,所以我将在这里提出答案。这个答案来自this page on the wiki。
CouchDB有一个_users
数据库,用于定义用户。以下是维基的要点:
然后,对于任何给定的数据库,您可以按名称或角色定义权限。身份验证的实现方式是通过_session
数据库。向_session DB发送有效的用户名和密码将返回一个身份验证cookie。这是CouchDB身份验证的几个选项之一。还有一些选择:
此外,根据您可能使用的托管服务,您可以选择限制通过SSL访问沙发。
在Node,Couch和各种其他有效扩展水平扩展的技术(添加更多服务器)之间,开发人员可以采用一种有趣的压力或激励措施,使应用程序以这种方式扩展。但这是一个单独的问题。
答案 1 :(得分:10)
目前安全方面真正起作用的唯一事情就是CouchDB配置中的这种情况。
[couch_httpd_auth]
require_valid_user=true
[admins]
admin = sekrit
这会在所有CouchDB上放置基本的HTTP身份验证。即使这在客户端库中也不是很好。对于python,例如你需要a patched library。
第二种方法是将代理放在CouchDB前面,让代理进行身份验证和授权工作。由于CouchDB的RESTful设计,这非常容易。
到目前为止,所有其他方法都必须考虑高度实验性。
答案 2 :(得分:7)
这可能与您原来的问题略有不同。如果您的couchdb只是完整服务器应用程序的后端存储,您可以为要使用的服务器应用程序创建一个特殊帐户,并需要这些凭据才能访问couchdb。
另一方面,人们直接通过javascript客户端点击的纯沙发应用程序需要非常小心才能保证安全。
使用重写不是可选的。您需要一个vhosts配置,通过重写强制请求到您的域。
将路由* / _ all_docs和/ * / _ design / *重写为404页面。否则,用户可以列出每个文档或获取整个应用程序。
将一般对象访问,即/ dbname /:id重写为可以拒绝访问的节目,如果不允许用户查看该文档。遗憾的是,没有基于文档的附件访问控制的等效解决方法。
我们使用haproxy过滤_users上的GET请求。来自外部的人没有合法的理由来获取用户记录或列出所有用户。我们希望用户能够注册,因此我们需要写访问权限。目前,沙发不能阻止对数据库的读访问,同时允许写入。这是一个错误。过滤haproxy之类的东西是我们现在最好的解决方法。
使用您自己的数据库来保留除_users提供的信息之外的联系信息。这样可以更好地控制访问。
validate_doc_update应该小心拒绝任何不应该允许的写入。
在每种情况下,您都需要想象一下了解系统的人可以做些什么来破坏它并锁定那些攻击途径。
答案 3 :(得分:1)
截至2013年2月(和CouchDB 1.2),CouchDB的安全模型对我来说似乎不够灵活。如果您不太关注安全性,那么坚持使用它并不会很糟糕,如果你不为真正的用户投入生产,那么它就不适用。
在后一种情况下,您应该使用单独的身份验证中间件。这提供了相对容易地实现自定义认证的可能性。无论是OAuth,Cookies还是SSL,您都可以完全控制它并再次验证第三方服务(或您自己的专有机制)似乎相对简单。说到安全性,我也会关心DoS攻击,看来你无法通过CouchDB本身限制对CouchDB的请求数量。
由于没有明确支持每个文档的授权,您还需要自己的层(有关详细信息,请参阅this)。完美的例子是维护一个移动应用程序,其中包含许多不在彼此之间共享数据的用户。 TouchDB非常适合这种情况,但是你可能不会为使用CouchDB的后端上的每个用户创建一个单独的数据库,因为它不是完全可扩展的。使用单独的中间件,您可以检查文档中的特殊字段,该字段标识此文档所属的用户,或使用您想要的任何其他类型的ACL。
在安全问题未解决之前,我不会考虑实际应用程序中的任何性能问题。因此,即使部署nginx来重写URL也比在公共服务器上部署无栅栏CouchDB要好得多。此外,使用nginx的性能可以忽略不计。
答案 4 :(得分:1)
CouchDB可以很好地处理cookie,SSL,oauth和多用户:
这是python中的一些实际代码:
from couchdb import Server
s = Server("https://user:password@example.com:6984")
请求cookie:当然在上面和下面编码的url
您必须将凭据放两次才能开始使用第一个Cookie Server()构造函数以及_session POST正文
中都有code, message, obj = s.resource.post('_session',headers={'Content-Type' : 'application/x-www-form-urlencoded'}, body="name=user&password=password")
assert(code == 200)
现在您已收到cookie,将其解压缩
cookie = message["Set-Cookie"].split(";", 1)[0].strip()
现在,退出python并重新启动
接下来,请求服务器对象,但这次没有用户名和密码
s = Server("https://example.com:6984")
s.resource.headers["Cookie"] = cookie
是的,没有密码,尝试访问数据库:
db = s["database"]
可选择在服务器端设置“persistent”cookie选项,以使cookie持续更长时间。
答案 5 :(得分:0)
您是否阅读过CouchDB文档http://couchdb.apache.org/docs/overview.html?它有一个“安全和验证”部分,可以解决您的一些问题。