OpenSearch只读用户无法获取有权限索引列表问题排查
一、配置误解或遗漏排查
do_not_fail_on_forbidden配置未正确加载
仅修改opensearch-security/config.yml并构建镜像不足以让配置生效,必须通过securityadmin.sh工具将配置推送至OpenSearch集群。Docker环境下需确保容器启动时执行配置初始化步骤,比如在启动脚本中加入:./plugins/opensearch-security/tools/securityadmin.sh -cd /usr/share/opensearch/config/opensearch-security/ -icl -nhnv -cacert /usr/share/opensearch/config/root-ca.pem -cert /usr/share/opensearch/config/admin-cert.pem -key /usr/share/opensearch/config/admin-key.pem若未执行此步骤,集群仍使用旧配置,
do_not_fail_on_forbidden不会生效,导致GET _all返回403。配置节点位置错误
do_not_fail_on_forbidden和do_not_fail_on_forbidden_empty需放在config.yml的opensearch_security.dynamic节点下,正确配置格式应为:opensearch_security: dynamic: do_not_fail_on_forbidden: true do_not_fail_on_forbidden_empty: true # 其他配置项...若放置位置错误(如根节点),配置不会被Security插件识别。
角色权限冲突
检查ROLE_RO是否继承了拒绝访问_all的角色,或存在集群层面的权限限制。确保角色仅包含test-read*索引的read和indices:admin/get权限,无额外拒绝规则。
二、验证do_not_fail_on_forbidden生效的方法
直接请求验证
使用USER_RO执行GET _cat/indices?v,若配置生效,将仅返回test-read*前缀的索引列表,无403错误;若仍返回403,说明配置未生效。查看集群生效配置
使用管理员用户执行:curl -XGET -u admin:admin_password https://<opensearch-host>:9200/_plugins/_security/api/config检查返回结果中是否包含
"do_not_fail_on_forbidden": true,确认配置已加载至集群。日志排查
查看OpenSearch容器日志(路径通常为/usr/share/opensearch/logs/opensearch.log),搜索关键词do_not_fail_on_forbidden,若出现Loaded dynamic config: do_not_fail_on_forbidden=true类日志,说明配置已生效;若搜索到forbidden相关报错,可进一步定位权限拦截原因。
三、其他实现方式
直接指定索引前缀请求
让用户直接执行GET test-read*或GET _cat/indices/test-read*,无需依赖_all,这是最直接且符合需求的方式,避免复杂的权限配置问题。使用索引别名
创建包含所有test-read*索引的别名:curl -XPOST -u admin:admin_password https://<opensearch-host>:9200/_aliases -d ' { "actions": [ { "add": { "index": "test-read*", "alias": "test-read-alias" } } ] }' -H "Content-Type: application/json"赋予
ROLE_RO对test-read-alias的read和indices:admin/get权限,用户只需请求GET test-read-alias即可获取所有目标索引的信息。调整角色权限范围(谨慎使用)
若必须使用_all,可给ROLE_RO添加indices:admin/get权限至_all索引,但需注意:此配置仅允许用户查看所有索引的元数据(如名称),无法访问无read权限的索引内容,需根据业务需求评估是否适用。
内容的提问来源于stack exchange,提问作者buddemat

