最近公司报出两个风险漏洞:
漏洞一:
漏洞名称: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