#elasticsearch #proxy #reverse-proxy #public #http #exposing #node

bin+lib es-public-proxy

简单的只读 HTTP 代理,用于将 Elasticsearch 节点暴露给公共互联网

5 个版本

0.2.6 2021年3月30日
0.2.3 2020年12月17日
0.2.2 2020年12月17日
0.2.1 2020年10月18日
0.2.0 2020年8月27日

#2210 in 命令行工具

AGPL-3.0-or-later

53KB
1K SLoC

es-public-proxy:简单的只读 HTTP 代理,用于将 Elasticsearch 节点暴露给公共互联网

  • 所有用户数据类型安全的反序列化和再序列化
  • 单二进制文件,易于安装
  • 简单的配置,默认设置合理
  • 在网络延迟和计算资源方面的开销低
  • 可选的 CORS 头部,以直接处理浏览器请求
  • SSL、传输压缩、负载均衡、可观测性和速率限制留给其他工具,如 nginx、caddy 或 HAproxy
  • 永久免费软件:AGPLv3+ 许可证

Elasticsearch REST API 功能强大,文档齐全,并为许多编程语言提供了客户端库实现。对于只包含公共信息的数据集和服务,方便地提供至少一部分 API 的直接访问对任何人都是有用的。Elasticsearch 维护者警告不要这样做,因为该 API 不是为公共使用而设计的。Elasticsearch 的最新版本有一个身份验证/授权子系统,并且有第三方插件用于只读访问(例如 ReadonlyREST),但这些解决方案需要仔细配置和了解哪些端点是“安全”的。Elasticsearch 接受 GET 请求的请求体,一个建议的解决方案是使用类似 nginx 的反向代理来仅过滤 GET 请求。然而,某些安全的端点(如删除滚动对象)需要其他 HTTP 动词,而大多数浏览器都不支持 GET 请求体,所以这只是一个部分解决方案。

es-public-proxy 旨在为将特定索引上流行的查询暴露给公共网络的用例提供一个简单且可靠的替代方案。HTTP 请求在安全、编译的编程语言(Rust)中解析和过滤,然后将仅安全的查询重新序列化并转发到监听不同端口的后端搜索实例。

请注意,当然客户端仍然可以提交各种“昂贵”的查询,这会减慢主机的速度。其中一些可以在Elasticsearch配置中禁用(这将禁用所有连接的这些查询,而不仅仅是代理)。一些查询类型根本不支持此代理。将来,代理可能可以通过配置参数和某些查询类型(如query_string)的更智能解析来尝试阻止更多昂贵的查询。

安装

在Debian/Ubuntu Linux系统上,最简单的方法是从https://archive.org/download/es-public-proxy-deb下载并安装一个未签名的.deb。这包括一个手册页、配置文件和systemd单元文件。安装后,编辑配置文件(/etc/es-public-proxy.toml)并启动服务,例如

sudo systemctl start es-public-proxy
sudo systemctl enable es-public-proxy

在其他平台上,您可以使用rust工具链以每个用户为基础安装和运行

cargo install es-public-proxy
es-public-proxy --example-config > example.toml

# edit the configuration file

es-public-proxy --config example.toml

还有一个Dockerfile,但它没有被积极使用,也没有推送到任何镜像仓库。例如,不确定如何最好地将配置注入到Docker镜像中。您可以使用以下命令构建镜像

docker build -f extra/Dockerfile .

配置

在所有情况下,您都希望明确列出所有具有公共访问权限的索引。有一个unsafe_all_indices是为了原型设计,但这可能允许访问额外的非索引API端点。

一种简单的部署模式是将nginxes-public-proxyelasticsearch都放在同一服务器上。在这个配置中,nginx将监听所有网络接口的80和443端口,处理从80到443的SSL升级重定向,以及添加传输压缩、限制客户端体负载限制等。es-public-proxy将监听localhost的9292端口,并通过localhost的9200端口连接到Elasticsearch。

限制

尚未实现所有Elasticsearch API。一般来说,此服务在解析和边缘情况上可能更加严格。例如

  • URL查询参数,如?human必须展开为布尔值,如?human=true
  • 在某些情况下,Elasticsearch允许将整个对象缩短为字符串,但此代理要求使用完整的对象格式
  • 配置中的索引模式不受支持

开发

要构建此软件包,您需要安装rust工具链。我们针对稳定的Rust,2018版,版本1.45+。

重新编译手册页需要scdoc

构建Debian软件包(.deb)需要cargo-deb插件,您可以使用以下命令安装:cargo install cargo-deb

Makefile包括用于包装常见开发命令的工具,例如

make test
make lint
make deb

欢迎贡献!我们更喜欢保持依赖crates的数量较低(例如,目前没有使用CLI参数解析库),但欢迎讨论。在发送补丁或合并请求时,如果您能够包括测试覆盖率、重新运行cargo fmt并提前认可许可条款,这将很有帮助(但不是必需的)。

依赖项

~9–20MB
~288K SLoC