ElasticSearch添加登录校验(仅供参考)

最近公司报出两个风险漏洞:

漏洞一:

漏洞名称:Elasticsearch未授权访问

漏洞级别:严重

漏洞描述:

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch的增删改查操作全部由http接口完。由于Elasticsearch授权模块需要付费,所以免费开源的Elasticsearch可能存在未授权访问漏洞。该漏洞导致,攻击者可以拥有Elasticsearch的所有权限。可以对数据进行任意操作。业务系统将面临敏感数据泄露、数据丢失、数据遭到破坏甚至遭到攻击者的勒索。 Elasticsearch默认9200端口对外开放且未进行验证,用于提供远程管理数据的功能,任何连接到服务器端口上的人,都可以调用相关API对服务器上的数据进行任意的增删改查。

修复方案:

1、9200端口不要对外开放,如需开放,建议在安全组限制只允许指定IP才能访问9200端口。

2、为elasticsearch增加登录验证。

3、使用Nginx搭建反向代理,通过配置Nginx实现对Elasticsearch的认证。

漏洞二:

漏洞名称:Elasticsearch ECE 信息泄露(CVE-2021-22146)

漏洞级别:高危

漏洞描述:

Elasticsearch是荷兰Elasticsearch公司的一套基于Lucene构建的开源分布式RESTful搜索引擎。该产品主要应用于云计算,并支持通过HTTP使用JSON进行数据索引。Elastic Cloud Enterprise存在安全漏洞,该漏洞源于在已部署的集群中,所有版本的Elastic Cloud Enterprise默认都启用了Elasticsearch匿名用户。在默认设置中,匿名用户没有权限,并且无法成功查询任何Elasticsearch api,攻击者可利用该漏洞可以利用匿名用户获取已部署集群的某些细节。

修复方案:

1.安全更新和补丁:及时安装软件和系统的安全更新和补丁,以修复已知的漏洞。保持软件和系统处于最新状态可以提高安全性。

2.访问控制:确保正确配置和限制对敏感文件的访问权限。只授予必要的用户和角色相应的权限,并禁止未经授权的访问。

3.安全审计和监控:实施适当的安全审计和监控措施,包括日志记录和事件监测。这样可以及时发现异常活动并采取行动。

4.错误处理和异常管理:正确处理错误和异常情况,避免显示敏感信息或详细错误消息,防止攻击者获取有关系统和文件的敏感信息。

我们本文只针对为elasticsearch增加登录验证。

由于elasticsearch不是我部署的,我刚拿到服务器先执行搜索命令,查找应用位置。

find / -name elasticsearch

一、进入es安装目录下的config目录

vim elasticsearch.yml

二、在其最下方添加:
复制代码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
三、重启:

ES不支持直接重启,只能先结束掉进程,在运行脚本重启。下面是操作的过程:

1.查找ES进程

ps -ef | grep elastic

然后可以看到如下的进程号,10965之类的,之后kill掉就可以啦。


2.启动ES (为安全考虑,ES不允许 root 启动,先切换到ES的账号 su es , root账号启动会报错)

切换到elasticsearch所在bin目录执行(-d 表示后台运行)

./elasticsearch -d

3.检查ES启动状态

curl 127.0.0.1:9200

如果启动报错jdk版本不匹配,那么切换es内置jdk即可。

四、执行设置用户名和密码的命令,需要为4个用户分别设置密码:elastic、kibana、logstash_system、beats_system

1.进入bin目录,执行命令:

./elasticsearch-setup-passwords interactive

注意这里是隐式输入。

五、JAVA代码里同步更改(如有)(代码示例仅供参考)
java 复制代码
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;

/**
 * 带用户名密码认证的 ES 客户端创建工具类
 */
public class EsClientUtil {

    // ES 配置(建议放到配置文件,如 application.yml)
    private static final String ES_HOST = "127.0.0.1";
    private static final int ES_PORT = 9200;
    private static final String ES_SCHEME = "http"; // 若开启HTTPS则改为https
    private static final String ES_USERNAME = "elastic"; // 你的ES用户名
    private static final String ES_PASSWORD = "your-es-password"; // 你的ES密码

    // 单例客户端(避免频繁创建连接)
    private static RestHighLevelClient client;

    // 创建带认证的 ES 客户端
    public static RestHighLevelClient getEsClient() {
        if (client == null) {
            // 1. 构建认证提供者(核心:添加用户名密码)
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(
                AuthScope.ANY, // 匹配所有ES节点的认证范围
                new UsernamePasswordCredentials(ES_USERNAME, ES_PASSWORD)
            );

            // 2. 构建 RestClientBuilder,添加认证配置
            RestClientBuilder builder = RestClient.builder(
                    new HttpHost(ES_HOST, ES_PORT, ES_SCHEME)
                )
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    // 将认证信息注入HTTP客户端
                    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
                );

            // 3. 创建带认证的 RestHighLevelClient
            client = new RestHighLevelClient(builder);
        }
        return client;
    }

    // 关闭客户端(程序退出/销毁时调用)
    public static void closeClient() {
        if (client != null) {
            try {
                client.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


#业务调用
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RestHighLevelClient;

public class EsBusinessService {

    public void queryEsData() {
        // 1. 获取带认证的客户端
        RestHighLevelClient client = EsClientUtil.getEsClient();

        // 2. 执行ES操作(和无认证时完全一致)
        try {
            GetRequest getRequest = new GetRequest("your-index", "1"); // 索引名+文档ID
            GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
            System.out.println("ES返回数据:" + response.getSourceAsString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 3. 建议在程序结束时关闭客户端(如Spring容器销毁时)
            // EsClientUtil.closeClient();
        }
    }
}
六、修改kibana配置文件(可选)

1.修改kibana.yml配置文件

cd /usr/local/kibana-7.2.0-linux-x86_64/config

vim kibana.yml

2.添加配置
elasticsearch.username: "elastic"
elasticsearch.password: "xxx"

3.重启kibana服务,bin目录下执行

nohup ./kibana &

4.登录kibana,访问5601端口登录即可。
Chinese-English Dictionary
Enable Select Search
My Words

相关推荐
步步为营DotNet2 小时前
深度剖析.NET中WeakReference的内存管理机制:优化资源使用与避免内存泄漏
java·jvm·.net
武子康2 小时前
Java-211 Spring Boot 2.4.1 整合 RabbitMQ 实战:DirectExchange + @RabbitListener 全流程
java·spring boot·分布式·消息队列·rabbitmq·rocketmq·java-rabbitmq
剽悍一小兔2 小时前
idea 执行测试类报错:failed to resolve org.junit.platform:junit-platform-launcher:1.8.2
java·ide·intellij-idea
Elastic 中国社区官方博客2 小时前
使用 Elasticsearch 的 Profile API 对比 dense vector 搜索性能
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
是Judy咋!2 小时前
Elasticsearch---集群部署(SSL + X-Pack)
大数据·elasticsearch·ssl
学海_无涯_苦作舟2 小时前
RabbitMQ Java Client源码解析——FrameHandler
java·rabbitmq·java-rabbitmq
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 果树的生长信息管理系统为例,包含答辩的问题和答案
java·spring boot
Dxy12393102162 小时前
Elasticsearch 8.13.4 常用搜索操作完全指南
大数据·elasticsearch
CodeCraft Studio2 小时前
国产化PDF处理控件Spire.PDF教程:在Java快速解析PDF文本、表格、图像和元数据
java·python·pdf·pdf解析·spire.pdf·元数据解析·java pdf解析