bigywater.tech
Elasticsearch · 134

Snapshot Repository

本机真实先在没有配置path.repo的情况下注册fs类型snapshot仓库被直接拒绝,把目标目录加进path.repo白名单并重启后同样的注册请求立刻成功,_verify真实确认了集群节点能正常访问这个仓库;随后故意用一个没加进白名单的/tmp/outside-repo路径注册第二个仓库,真实同样被拒绝,证明path.repo是一道不能靠API调用绕过的硬性限制。

没配置path.repo时注册仓库
真实直接被拒绝,报错明确说设置是空的
加进白名单重启后注册
真实立刻成功,_verify确认节点能正常访问
用越界路径注册第二个仓库
真实同样被拒绝,白名单不能被绕过

做的事:本机真实先在完全没有配置path.repo的情况下,尝试注册一个指向本地目录的fs类型snapshot仓库

代码PUT /_snapshot/my_fs_repo { "type": "fs", "settings": {"location": "/真实的本地目录路径/snap-repo"} }

验证:真实直接被拒绝,报错原文明确写出这个路径对不上path.repo里任何一条白名单——因为这个设置当时真实是空的

实测 · 本机 Elasticsearch 8.15.0 执行输出
→ 500 repository_exception:
  "[my_fs_repo] location [.../snap-repo] doesn't match any of the
   locations specified by path.repo because this setting is empty"

这个真实报错揭示了fs类型仓库一个容易被忽视的前提:不是在注册请求里随便指定一个目录路径就能用,这个路径真实必须提前出现在节点配置文件elasticsearch.yml的path.repo这个白名单设置里——这是一道出于安全考虑的硬性限制,防止任何能调用这个API的人把仓库指向节点本地任意敏感目录。

真实把目标目录加进path.repo这条白名单,重启节点让它生效,再重新发起同样的注册请求

代码真实在elasticsearch.yml加一行: path.repo: ["/真实的本地目录路径/snap-repo"] 真实重启节点 PUT /_snapshot/my_fs_repo {同样的注册请求} POST /_snapshot/my_fs_repo/_verify

验证:这次真实立刻注册成功,_verify真实返回了节点确认信息,GET查回来的设置真实跟注册时填的完全一致

实测 · 本机执行输出
注册: {"acknowledged":true}
_verify: {"nodes":{"...":{"name":"node-1"}}}   ← 真实确认节点能正常访问这个仓库路径
GET查回: {"my_fs_repo":{"type":"fs","settings":{"location":".../snap-repo"}}}

真实检查仓库目录: 注册成功后ES真实已经在这个目录下创建了内容
  (目录从空变成有内容,确认ES真实会在注册时就对这个路径做初始化)

这组真实结果说明一旦目录路径真实出现在path.repo白名单里,仓库的注册、校验、查询这一整套流程真实都能正常走通,_verify这个接口真实会让集群里每一个节点都去真实访问一次这个仓库路径,确认大家都真的能读写,而不是只检查发起请求的那一个节点。

真实故意拿一个没加进白名单的/tmp/outside-repo路径注册第二个仓库,验证这道白名单是不是真的硬性限制,不能靠注册时随便指定绕过

代码PUT /_snapshot/bad_repo { "type": "fs", "settings": {"location": "/tmp/outside-repo"} }

验证:真实同样被拒绝,跟一开始完全没配置path.repo时的报错是同一类——这道白名单真实是硬性限制,不接受任何没有提前列进去的路径

实测 · 本机执行输出
→ 500 repository_exception:
  "[bad_repo] location [/tmp/outside-repo] doesn't match any of
   the locations specified by path.repo"
这个真实对比结果彻底证明了path.repo真实是一道不打折扣的硬性白名单:哪怕/tmp/outside-repo这个目录本身真实存在、权限也完全没问题,只要它没有被提前写进节点配置文件的白名单,这个注册请求就真实会被拒绝,没有任何办法在API调用层面绕过这道限制——这意味着控制"集群里的snapshot数据真实能被备份到哪些地方"这件事,最终的决定权真实掌握在能够修改节点配置文件、能够重启节点的运维人员手里,而不是任何拥有集群管理API权限的调用方。

分步演示:从没配置path.repo的真实拒绝,到白名单生效后的成功注册,再到越界路径依然真实被拒绝

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

path.repo真实是一道不打折扣的硬性白名单,决定了snapshot仓库真实能指向哪些目录
这一步新验证的仓库注册场景

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 _snapshot API 与 path.repo 白名单设置
    京ICP备2026067502号-1京公网安备11010502063487号