使用 Elasticsearch 进行 AJAX 通信的流量和访问控制解决方案?
Posted
技术标签:
【中文标题】使用 Elasticsearch 进行 AJAX 通信的流量和访问控制解决方案?【英文标题】:Traffic and access control solution for AJAX communication with Elasticsearch? 【发布时间】:2016-03-13 11:44:23 【问题描述】:情况:
对于网上商店,我想使用 Elasticsearch 构建分页产品列表 - 并在这些列表上过滤。我想绕过完全运行应用程序的 php/mysql 服务器,并通过 AJAX 调用直接从客户的浏览器与 Elasticsearch 通信。优点是:
PHP/MySQL 服务器上的大部分负载将由 ES 集群处理 CDN 机会(扩展!)问题:
这种方法会减轻我们后端服务器的大量负载,但会产生一些新问题。匿名用户会产生大量请求,但我们需要对这些请求进行一些控制:
交通管制:
如何防范恶意用户以这种方式拨打大量电话并扫描/下载我们的整个产品目录? (例如竞争抓取定价信息) 如何阻止已被(以某种方式)识别为行为不良的 IP?访问控制:
如何确保前端只能进行我们希望允许的查询? 如何确保客户只能看到选择的结果字段,并且无法从 ES 中获取不适合他们的任何数据?重要的是不要让一台机器在某处处理所有这些,因为这只会重新创建一台负责处理所有事情的机器。我想真正利用 ES 集群,而不需要任何必须处理扩展问题的中间件。
我们不想完全依赖第 3 方,我们正在寻找一种对我们合作的合作伙伴具有一定灵活性的解决方案(例如在弹性和 AWS 之间切换)。
可能的解决方案或部分解决方案:
我一直在研究一些“Elasticsearch 即服务”选项,但我对它们的质量没有信心,即使我能解决它们提到的问题:
www.elastic.co/found,他们的高级解决方案有一个“屏蔽”服务,似乎没有涵盖上述所有情况(据我所知,只有 IP 阻塞),但有一个自定义插件(https://github.com/floragunncom/search-guard) 可以对结果字段进行过滤并提供一种进行用户管理等的方法。这似乎是一个合理的选择,但它很昂贵并且将应用程序与“找到”的产品联系在一起。我们应该能够在需要时更换合作伙伴。 Amazon AWS Elasticsearch 服务具有基本的 IAM 支持,可以将 CloudFront 放在它前面,但不提供任何访问控制。 安装单独的 L7 应用过滤解决方案以检测刮板等。问题:
有没有人采用这种方法并找到了解决所有这些问题的好设置?
【问题讨论】:
我建议您看一下Shield,这是 Elastic 人员创建的商业产品。它应该负责您想要设置的大多数控件。 【参考方案1】:我建议的第一件事是限制从安全组后面对弹性搜索实例的访问,并且只允许应用程序服务器 IP 地址访问端口 22、80、9200 和 9300,这些端口是 ElasticSearch 使用的端口。
关于防止报废,没有绝对的保护解决方案,但是如果您的目标是简单地限制这些报废程序对您的应用程序服务器和 ES 实例施加的负载,您可以查看https://github.com/davedevelopment/stiphle,它旨在限制速率用户,他们在页面上使用的示例限制为每秒 5 个请求,这对于普通用户来说似乎是非常合理的,如果需要,可以进一步降低以使报废非常耗时。
【讨论】:
以上是关于使用 Elasticsearch 进行 AJAX 通信的流量和访问控制解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch使用 Elasticsearch 轻松进行文本分类
Elasticsearch:使用 Python elasticsearch-dsl-py 库对 Elasticsearch 进行查询
Elasticsearch:使用 Python elasticsearch-dsl-py 库对 Elasticsearch 进行查询