通过 java 代理保护 AWS ES kibana

secure AWS ES kibana through java proxy

我正在使用 spring 应用程序进行 POC,我试图通过该应用程序通过代理保护 AWS kibana。我只想允许我的登录用户访问我的 Kibana。

所以我已将我的 IAM 设置为仅 ip,并且我能够 运行 我的 ES 查询没有问题。现在我使用 RESTTemplate class 构建了一个 class,其中我复制了一些必需的 headers 并将请求推送到 kibana。

我现在可以为登录用户加载 kibana。但是我无法 运行 来自开发工具的任何查询和/或显示任何仪表板。

我有一个索引数据剪辑。

当我运行查询

GET datacuts/datacuts/_search

我收到找不到索引的错误。但同时如果只是说

GET datacuts

我可以看到我的索引的映射细节。不确定这里发生了什么。

这是我写的代理代码

 HttpHeaders headers = new HttpHeaders();
            headers.add("Access-Control-Allow-Origin", "https://my-es-server"+restOfTheUrl);
            headers.add("content-type", request.getContentType());
            headers.add("kbn-version", "5.5.2");
            HttpEntity<String> httpEntity = (body==null)?new HttpEntity<>(headers):
                new HttpEntity<String>(body,headers);
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
            ResponseEntity<String> resp = restTemplate.exchange(uri.toString(), HttpMethod.valueOf(request.getMethod()), httpEntity, String.class);
switch(resp.getHeaders().getContentType().getType()) {
            case "text" :
                String responseBody = resp.getBody().toString();
                logger.debug("index count" + responseBody.indexOf("/_plugin/kibana"));
                responseBody = responseBody.replaceAll("_plugin/kibana","myApp/_plugin/kibana");
                return new ResponseEntity<String>(responseBody.toString(), resp.getHeaders(), HttpStatus.OK);
            }
            return resp;

失败的请求是

proxy call _plugin/kibana/api/console/proxy?path=datacuts%2Fdatacuts%2F_search&method=GET 在我得到的响应中没有按名称 datacuts 索引。

我做错了什么?

添加权限 headers 并检查内容类型解决了我的问题。

我在现有代码中添加了以下代码

            headers.add(accessCtrl, url_to_host);
            headers.add(connect, keepAlive);
            headers.add(proxyConn, keepAlive);
            headers.add(contentType, request.getContentType());
            headers.add(kbn, kbnVerion);
            headers.add(cluster , cluster_key);
            request.setAttribute(presigned, false);
            headers.add(host, host);

            body=(body!=null && !body.equals(FieldNameConstant.BLANK) && "application/x-ndjson".equals(request.getContentType()))?body+"/n":body;

这解决了我的问题。现在我可以使用 spring!

实现完整的 kibana java 代理