Elasticsearch 单节点安全配置与用户认证

news2025/2/24 17:43:19

Elasticsearch 单节点安全配置与用户认证

安全扫描时发现了一个高危漏洞:Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时,需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤,为单节点 Elasticsearch 实现最基本的安全功能,包括启用 Elasticsearch 自带的安全功能和配置传输层 SSL,以确保数据传输的加密和访问权限的严格管理。 (elaticsearch版本7.9.2)


修改配置文件

编辑单节点的 elasticsearch.yml 文件,确保包含以下内容:

# 启用 Elasticsearch 的安全功能
xpack.security.enabled: true

# 启用传输层 SSL
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required

# 指定证书路径(使用默认生成的 P12 文件)
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

生成证书

在 Elasticsearch 安装目录中,使用 elasticsearch-certutil 工具生成证书

生成 CA 文件

cd /bin
./elasticsearch-certutil ca

# (设置证书密码)可以直接回车选择不设置密码
Please enter the desired output file [elastic-stack-ca.p12]: 
Enter password for elastic-stack-ca.p12 :
  • 输出文件:elastic-stack-ca.p12

  • 选择密码(可留空)

    image-20241203165352589

生成节点证书

cd /bin
./elasticsearch-certutil cert --ca elastic-stack-ca.p12

# (设置证书密码)可以直接回车选择不设置密码
Enter password for CA (elastic-stack-ca.p12) : 
Please enter the desired output file [elastic-certificates.p12]: 
Enter password for elastic-certificates.p12 : 
  • 输出文件:elastic-certificates.p12

  • 可选择为证书设置密码

    image-20241203165525302

将证书复制到配置目录

将生成的 elastic-certificates.p12 文件移动到 Elasticsearch 的配置目录(通常是 $ES_HOME/config)下:

mv elastic-certificates.p12 $ES_HOME/config
# 赋权为es用户权限
chown es:es elastic-certificates.p12

image-20241203165304163


(可选)存储证书密码

如果生成证书时设置了密码,需要将密码存储到 Elasticsearch 密钥库中:

./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

按照提示输入密码


启动 Elasticsearch

配置完成后,切换为 es 用户启动 Elasticsearch 或重启ES服务:

./elasticsearch

如果一切正常,日志中应显示以下内容:

[2024-12-03T14:27:33,401][INFO ][o.e.x.s.s.SecurityStatusChangeListener] [es-xcu-node] Active license is now [BASIC]; Security is enabled

验证安全配置

设置用户密码

默认情况下,Elasticsearch 启用了几个内置用户(例如 elastic)。运行以下命令设置密码:

cd /bin
./elasticsearch-setup-passwords interactive

按提示为用户设置密码,特别是 elastic 用户。

访问 REST 接口

使用 curl 或其他工具测试:

# 未带认证信息访问会提示报错
curl http://localhost:9200
# 提示 401 错误,表明未授权

# 带认证信息的请求
curl -u elastic:设置的密码 http://localhost:9200

如果返回正常的 Elasticsearch 信息,则配置成功。

浏览器访问

image-20241203170846599


Spring Boot 项目中配置 Elasticsearch 连接账户密码

1. 引入依赖

pom.xml 中添加 Elasticsearch 客户端依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.9.2</version>
</dependency>

2. 配置类

在 Spring Boot 项目中,通过 Java 配置类创建 RestHighLevelClient Bean:

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.nio.client.HttpAsyncClientBuilder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticsearchConfig {

    @Value("${elasticsearch.host}")
    private String host;

    @Value("${elasticsearch.port}")
    private int port;

    @Value("${elasticsearch.username}")
    private String username;

    @Value("${elasticsearch.password}")
    private String password;

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        // 配置用户名和密码
        BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(
                AuthScope.ANY,
                new UsernamePasswordCredentials(username, password)
        );

        // 构建 RestClient
        RestClientBuilder restClientBuilder = RestClient.builder(
                new HttpHost(host, port)
        ).setHttpClientConfigCallback(httpClientBuilder -> 
                httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
        );

        return new RestHighLevelClient(restClientBuilder);
    }
}

3. 配置文件

application.ymlapplication.properties 中添加 Elasticsearch 的相关配置:

elasticsearch:
  host: localhost
  port: 9200
  username: elastic
  password: elasticPWD

4. 使用示例

在需要使用 RestHighLevelClient 的地方直接注入并使用:

import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.MainResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ElasticsearchService {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public String getClusterInfo() {
        try {
            MainResponse response = restHighLevelClient.info(RequestOptions.DEFAULT);
            return response.getClusterName().toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "Error fetching cluster info";
        }
    }
}

5. 启动项目并验证

启动项目后,调用 ElasticsearchService 中的方法,验证是否成功连接到 Elasticsearch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…

用OpenCV改变图像的对比度和亮度

两个常用的函数是常数的乘法和加法&#xff1a; 参数α>0和β通常被称为增益和偏置参数&#xff1b;有时这些参数分别控制对比度和亮度。 你可以想到f(x)作为源图像像素和g(x)作为输出图像像素。那么&#xff0c;更方便的是&#xff0c;我们可以将表达式写为&#xff1a; 这…

基于阻塞队列的生产者消费者模型动画演示

一个基于阻塞队列的生产者消费者模型的动画演示&#xff1a; 这是打包好的程序。程序是用 QT 写的。 通过网盘分享的文件&#xff1a;CP模型.7z 链接: https://pan.baidu.com/s/1YjC7YiSqHGqdr6bbffaDWg?pwde6g5 提取码: e6g5 CP模型

李沐动手学深度学习无法动态绘制损失和准确率曲线,输出 <Figure size 350x250 with 1 Axes>

在网上搜了两个解决方案 1.这个方法我试了不好用 d2l.plt.savefig(E:\pycharmProject) 2 修改封装好的函数 &#xff0c;ctrl加鼠标左键点击进入Animator类&#xff0c;修改里面的add函数 def add(self, x, y):# Add multiple data points into the figureif not hasattr(y,…

在idea中使用mysql(超详细)

一、连接mysql 在IDE开发工具中也是可以使用mysql的&#xff0c;这里以开发java常用的IntelliJ IDEA为例。 1. 打开idea&#xff0c;右上角有数据库侧边栏&#xff0c;打开侧边栏点击加号->数据源&#xff0c;可以看到支持很多数据库&#xff0c;选择mysql。 2. 首次使用需…

scss文件内引入其他scss文件报错

1、今天在编译一些老项目的时候&#xff0c;老是提示下面信息 2、而且有很多Sass import rules are deprecated and will be removed in Dart Sass 3.0.0.警告 3、用npm view sass versions看&#xff0c;其中sass的最新版本是1.82.0 4、经过测试"sass": "1.75…

【Linux】基础IO-----文件详解

目录 一、文件理解&#xff1a; 二、C语言的文件操作&#xff1a; 1、fopen&#xff1a; 什么是当前路径&#xff1a; 2、fclose&#xff1a; 3、fwrite&#xff1a; 4、默认打开的三个流&#xff1a; 三、系统文件&#xff1a; 1、open&#xff1a; 2、close&#xf…

AI开发:卷积神经网络CNN原理初识,简易例程 - 机器学习

一 、卷积神经网络是什么 &#xff08;1&#xff09;印象 今天说的CNN&#xff0c;并不是我们熟知的美国有线电视新闻网。 那什么是CNN呢&#xff1f; Convolutional Neural Networks, CNN&#xff09;简单来说&#xff0c;就是用一个筛子来筛面粉的。 筛子就是卷积核&…

Nginx基础学习——介绍、安装与常用命令(windows/linux安装详细攻略)

目录 前言&#xff1a; 一、 Nginx 基本概念 &#xff08;1&#xff09; Nginx 是什么&#xff0c; 做什么事情 &#xff08;2&#xff09; 反向代理 &#xff08;3&#xff09; 负载均衡 &#xff08;4&#xff09; 动静分离​编辑 二、 Nginx安装、常用命令和配置文件…

人脸识别Adaface之libpytorch部署

目录 1. libpytorch下载2. Adaface模型下载3. 模型转换4. c推理4.1 前处理4.2 推理4.3 编译运行4.3.1 写CMakeLists.txt4.3.2 编译4.3.3 运行 1. libpytorch下载 参考&#xff1a; https://blog.csdn.net/liang_baikai/article/details/127849577 下载完成后&#xff0c;将其解…

Windows电脑伪关机(快速启动模式),怎么真关机

Windows电脑在关机的时候&#xff0c;进入到一个伪关机的状态&#xff0c;也就是并没有真正的关机&#xff0c;但是在一些系统更新、变更了一些设置&#xff0c;进行重启等操作也会进入到真关机状态 这种一般是开启快速启动模式&#xff0c;开启了快速启动模式功能会在关机的时…

Bellman-Ford 算法详解及应用

Bellman-Ford 算法详解及应用 图24-4 的结构(假设)Bellman-Ford 算法步骤伪代码C 语言实现 Bellman-Ford 算法运行结果分析输出示例(部分)Bellman-Ford 算法是一种用于计算单源最短路径的算法,即从给定的源节点到其他所有节点的最短路径。它可以处理带有负权重的边,但不适…

92.插入排序

一.什么是插入排序 把数据分为有序和无序俩个部分&#xff0c;将无序部分中的一个数据插入到已排好的有序部分中&#xff0c;有序部分从而变成一个新的、排好数据数量增1的有序数据&#xff0c;直到数据全部排序完成。 插入排序一般适用于小型数据。大型数据性能较差。 二.实…

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…

A1017 基于Java+JSP+SQL Server+servlet的二手购物平台的设计与实现

二手购物平台 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 计算机以及网络技术的飞速发展&#xff0c;网络的应用在全国乃至全球日益普及&#xff0c;随着人们的思想水平和生活水平的提高&#xff0c;网络已经是人们必不可少的一部分。人们的…

力扣-图论-6【算法学习day.56】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

使用PHPUnit使用本地调试代替远程调试,快速提高开发效率

Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架&#xff0c;但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…

动态规划 - 4( 背包问题 10000 字详解 )

一&#xff1a; 背包问题 1.1 01 背包 题目链接&#xff1a;01 背包 import java.util.Scanner;public class Main {public static void main(String[] args) {// 不做空间优化&#xff0c;用 dp 表存下所有状态Scanner sc new Scanner(System.in);// 读入 n 和 Vint n sc.…

关于利用 EtherNet/IP 转 Profinet 网关模块实现罗克韦尔变频器接入西门子 PLC 的配置范例

在现代工业自动化领域&#xff0c;不同品牌设备之间的通信兼容性问题一直是企业面临的挑战之一。某智能工厂为了优化生产流程&#xff0c;提高设备的协同工作效率&#xff0c;决定对其生产线上的控制系统进行升级改造。该生产线中&#xff0c;AB罗克韦尔PowerFlex变频器作为关键…

论文研读|信息科技风险管理模型的主要内容、定位、目标企业、风险管理机制, 以及相应的风险评估流程和风险应对策略

文献来源&#xff1a;[1]李政.商业银行数据中心风险管理研究[D].合肥工业大学[2024-12-08]. 内容总结&#xff1a;风险管理是一项不断发展完善的体系化工作。本章研究了国际上普遍使用的风险管理基本模型、并针对主流的信息科技风险管理的框架进行研究、分析&#xff0c;重点研…