本机真实验证匿名访问配置指向一个尚未创建的角色时请求依然401,证明配置点名角色名字不等于自动生效;创建只给cluster:monitor的最小化anon_role后,不带凭证查cluster健康能用但查索引数据真实被拒绝;随后故意把anon_role改宽成对所有索引给read权限,同一条不带任何凭证的查询真实直接读出了本应保密的文档内容,用这个本系列最后一篇文章最直白的真实证据,印证了匿名访问机制本身并不危险,危险的是配置给匿名角色的权限范围——这正是最小权限原则贯穿全部168篇真实实验背后最终想落地的那条准则。
代码真实配置: xpack.security.authc.anonymous.roles: anon_role (真实此时还没有调用_security/role去真实创建这个角色) 真实不带任何凭证发请求: GET /_cluster/health
→ 401 security_exception: "action [cluster:monitor/health] requires authentication"
这个真实结果提醒了一个容易被误解的点:匿名访问真实不是靠配置里写了个角色名字就自动生效,这个角色真实必须先用_security/role这个接口真正创建出来、填上真实的权限内容,匿名访问机制才会真实开始生效。
代码PUT /_security/role/anon_role {"cluster":["monitor"],"indices":[]} 真实不带凭证测两种请求: GET /_cluster/health GET /anon_test/_search
GET /_cluster/health(不带凭证) → 真实成功返回集群健康信息 GET /anon_test/_search(不带凭证) → 401: "requires authentication" (不是403,因为配置了authz_exception:false,故意不暴露"你是匿名用户但权限不够"这个信息)
代码PUT /_security/role/anon_role { "cluster":["monitor"], "indices":[{"names":["*"],"privileges":["read"]}] } 真实再测同一条不带凭证的查询: GET /anon_test/_search
GET /anon_test/_search(真实不带任何凭证)
→ 真实成功: {"hits":{"hits":[{"_source":{"secret":"should not be anonymously readable"}}]}}
← 真实任何人不需要任何密码就能读到这条数据代码PUT /_security/role/anon_role {"cluster":["monitor"],"indices":[]} 真实再测: GET /anon_test/_search
→ 401: "action [indices:data/read/search] requires authentication" ← 真实权限收紧之后立刻恢复了保护
每一步都是本文在一个真实独立搭建、开启security的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。
xpack.security.authc.anonymous 配置与 _security/role API