单机多节点 elasticsearch 集群安全认证

news/2024/12/2 16:33:57/

es 版本:7.6.2
部署环境:CentOS Linux release 7.6.1810 (Core)

一:生成 ca 证书

cd 到 es 的安装目录,并执行下面的命令来生成 ca 证书:

./bin/elasticsearch-certutil ca Elasticsearch

碰到第一个直接回车,不用管。

碰到第二个输入密码,例如 123456。

完成后会在当前目录生成一个文件:elastic-stack-ca.p12

二:用 ca 证书签发节点证书

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

需要输入密码时就直接输入刚才的密码,需要输入路径的地方不要输入地址,就直接回车,之后会生成一个 elastic-certificates.p12 文件。

三:将节点证书迁移到指定目录

先创建目录用于存放节点证书:

mkdir ./config/certificates

移动节点证书到该目录:

mv ./elastic-certificates.p12 ./config/certificates/

赋值权限给非 root 用户(如自己创建的 es 用户),不然会出现无法操作的问题:

chmod 777 ./config/certificates/elastic-certificates.p12
chown -R es:es ./config/certificates

四:将凭证复制到集群中的每一个 es 节点

就是在每个 es 节点都创建 certificates 目录,并将之前生成的 elastic-certificates.p12 证书复制到该目录(不再需要重新生成啦)。

五:修改 es 配置文件

每一个 es 节点都需要修改

下面是我创建的 3 个节点的配置文件:

es-9200 节点:

# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: es-cluster
# 节点名称
node.name: es-9200
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
#最⼤集群节点数,为了避免脑裂,集群节点数最少为 半数+1
node.max_local_storage_nodes: 3
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 192.168.1.101
# 设置对外服务http端口,默认为9200
http.port: 9200
# 内部节点之间沟通端口
transport.tcp.port: 9901
# 候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.1.101:9901","192.168.1.101:9902","192.168.1.101:9903"]
# 初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["es-9200"]
# 数据和日志目录
#path.data: /data/es/data
#path.logs: /data/es/logs
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 #bootstrap.memory_lock: true
#bootstrap.system_call_filter: false# 跨域,如果安装了 elasticsearch-head 插件,那么前两个配置也会用到
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
# 安全认证
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /opt/module/es-9200/config/certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /opt/module/es-9200/config/certificates/elastic-certificates.p12

es-9300 节点:

# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: es-cluster
# 节点名称
node.name: es-9300
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
#最⼤集群节点数,为了避免脑裂,集群节点数最少为 半数+1
node.max_local_storage_nodes: 3
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 192.168.1.101
# 设置对外服务http端口,默认为9200
http.port: 9300
# 内部节点之间沟通端口
transport.tcp.port: 9902
# 候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.1.101:9901","192.168.1.101:9902","192.168.1.101:9903"]
# 初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["es-9200"]
# 数据和日志目录
#path.data: /data/es/data
#path.logs: /data/es/logs
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 #bootstrap.memory_lock: true
#bootstrap.system_call_filter: false# 跨域,如果安装了 elasticsearch-head 插件,那么前两个配置也会用到
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
# 安全认证
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /opt/module/es-9300/config/certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /opt/module/es-9300/config/certificates/elastic-certificates.p12

es-9400 节点

# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: es-cluster
# 节点名称
node.name: es-9400
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
#最⼤集群节点数,为了避免脑裂,集群节点数最少为 半数+1
node.max_local_storage_nodes: 3
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 192.168.1.101
# 设置对外服务http端口,默认为9200
http.port: 9400
# 内部节点之间沟通端口
transport.tcp.port: 9903
# 候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.1.101:9901","192.168.1.101:9902","192.168.1.101:9903"]
# 初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["es-9200"]
# 数据和日志目录
#path.data: /data/es/data
#path.logs: /data/es/logs
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 #bootstrap.memory_lock: true
#bootstrap.system_call_filter: false# 跨域,如果安装了 elasticsearch-head 插件,那么前两个配置也会用到
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
# 安全认证
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /opt/module/es-9400/config/certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /opt/module/es-9400/config/certificates/elastic-certificates.p12

需要注意的点:

xpack.security.transport.ssl.keystore.pathxpack.security.transport.ssl.truststore.path 替换为自己的 es 安装路径。

六:添加密码

每一个 es 节点都需要

./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
# 输入密码:第一步中设置的密码,例如本样例中的123456
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
# 输入密码:第一步中设置的密码,例如本样例中的123456

ps: 如果询问你是否要创建 elasticsearch.keystore 文件,输入 y 后按回车即可。

七:逐个启动节点

./bin/elasticsearch

后续确认没问题的话可以改成后台启动:

./bin/elasticsearch -d

八:设置密码

在第一个节点设置即可,会自动同步到其他节点

./bin/elasticsearch-setup-passwords  interactive
# 下面会要输入很多密码,都要自己能记住,以后要用
# 需要设置 elastic,apm_system,kibana,kibana_system,logstash_system,beats_system

九:通过浏览器 or 终端访问 es

image-20230612223553713

实际上第一次访问的时候会要求输入账号密码(如下图),我这里已经不是第一次了,因此不再需要输入。

通过终端来查看是否成功:

curl --user elastic:<自己设置的密码> http://192.168.1.101:9200
image-20230612223718459

十:通过 Java API 来操作 es 集群

  1. 配置 pom 文件,引入相关依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.rainfall</groupId><artifactId>es-secure</artifactId><version>0.0.1-SNAPSHOT</version><name>es-secure</name><description>es7.6.2 安全认证</description><properties><java.version>1.8</java.version></properties><dependencies><!--es 授权--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>x-pack-transport</artifactId><version>7.8.1</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.6.2</version></dependency><!-- elasticsearch 的客户端 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.2</version></dependency><!-- elasticsearch 依赖 2.x 的 log4j --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version></dependency><!-- junit 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
  1. 例子:添加 doc
public class DocInsert {public static void main(String[] args) throws IOException {CredentialsProvider credentialsProvider = new BasicCredentialsProvider();// 设置用户名以及密码UsernamePasswordCredentials usernamePasswordCredentials = new UsernamePasswordCredentials("elastic", "123456");credentialsProvider.setCredentials(AuthScope.ANY, usernamePasswordCredentials);RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.1.101", 9200, "http")).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));RestHighLevelClient client = new RestHighLevelClient(builder);// 插入数据IndexRequest indexRequest = new IndexRequest();indexRequest.index("user1").id("1003");User user = new User("xiao li","男",22);// 向es插入数据必须将数据转换成JSON格式ObjectMapper objectMapper = new ObjectMapper();String userJson = objectMapper.writeValueAsString(user);indexRequest.source(userJson, XContentType.JSON);IndexResponse res = client.index(indexRequest, RequestOptions.DEFAULT);System.out.println(res.getResult());client.close();}
}
  1. 例子:查询刚才添加的 doc 数据
public class DocGet {public static void main(String[] args) throws IOException {CredentialsProvider credentialsProvider = new BasicCredentialsProvider();// 设置用户名以及密码UsernamePasswordCredentials usernamePasswordCredentials = new UsernamePasswordCredentials("elastic", "123456");credentialsProvider.setCredentials(AuthScope.ANY, usernamePasswordCredentials);RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.1.101", 9200, "http")).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));RestHighLevelClient client = new RestHighLevelClient(builder);// 查询数据GetRequest getRequest = new GetRequest();getRequest.index("user1");getRequest.id("1003");GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);System.out.println(response.getSourceAsString());client.close();}
}

十一:Kibana 访问带有安全认证的 es 集群

从官网下载与 es 版本一致的 Kibana,下载完成后上传到 linux 服务器,进行安装。

接着对config 目录下的 kibana.yml 配置文件进行修改:

#配置端口号
server.port: 5601
#配置网络访问地址,建议使用内网 ip 或 0.0.0.0 表示谁都可以访问
server.host: "0.0.0.0"
#配置es链接地址(es集群,可以用逗号分隔)
elasticsearch.hosts: ["http://192.168.1.101:9200","http://192.168.1.101:9300","http://192.168.1.101:9400"]
# kibana 在 es 中的索引
kibana.index: ".kibana"
##明文认证 es 账户密码,要用的账户为 kibana。(不过更加推荐密文设置,下面会提到)
#elasticsearch.username: "kibana"
#elasticsearch.password: "123456"
# 不增加下面会导致 kibana 启动失败,字符串内容是什么无所谓,保证不少于 32 个字符就行。
xpack.encryptedSavedObjects.encryptionKey: "something_at_least_32_characters_123123"
xpack.reporting.encryptionKey: "something_at_least_32_characters_12312345"
xpack.security.encryptionKey: "something_at_least_32_characters_658568"
#配置中文语言界面
i18n.locale: "zh-CN"

密文认证方式为:

/usr/share/kibana/bin/kibana-keystore --allow-root create
/usr/share/kibana/bin/kibana-keystore --allow-root add elasticsearch.username # 输入kibana
/usr/share/kibana/bin/kibana-keystore --allow-root add elasticsearch.password # 输入自己配置的密码,我这是 123456

启动 kibana:

./bin/kibana --allow-root # 要关闭服务的话输入 exit 后回车。

此外,也可以选择后台启动:

nohup ./bin/kibana --allow-root &

要关闭服务的话,查找 Kibana 进程,找到对应的 Kibana 进程号,然后 kill 掉即可。

ps -ef | grep '.*node/bin/node.*src/cli' # 查找方式

之后访问 kibana 就需要输入账号和密码了。

image-20230612222750297

十三:可能会遇到的坑

1.不要用 root 用户去启动 es,需要切换到其他用户,记得事先赋予相应的权限。

chown -R es:es /opt/module/es-9200 # 如将 es-9200 目录属于的用户和用户组都指定为 es

2.集群成功启动,但是浏览器即使输入账户密码也无法成功登录。具体而言报错为:failed to authenticate user [elastic]

可能原因是一开始部署了安全认证的单节点 es,并在登录后做了增删改查。

解决办法是重新生成节点证书和账户、密码。可以参考:链接。

3.es 启动时报异常:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

原因是系统虚拟内存默认最大映射数为 65530,无法满足 es 系统要求,需要调整为 262144 以上。

解决办法是设置 vm.max_map_count 参数:

# 修改文件
sudo vim /etc/sysctl.conf
# 添加参数
vm.max_map_count = 262144

重新加载/etc/sysctl.conf配置:

sysctl -p

4.es 启动时报异常:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

解决办法:

sudo vi /etc/security/limits.conf

将下面这行代码添加到这个配置文件的末尾就好:

es soft nofile 65536 # es 是自己的用户名
es hard nofile 65536

5.如果啥也不配置,上来直接启动 es,会报如下错误:

ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
ERROR: Elasticsearch did not exit normally - check the logs at /opt/module/elasticsearch-7.6.2/logs/elasticsearch.log

这点和 windows 上的 es 不同,windows 可以直接成功运行。

解决办法是做相应的配置。

6.kibana 启动报错 socket hang up 错误

原因是配置文件中的 elasticsearch.hosts 需要的是 ip 地址 + es 中的 http 端口号,错写成 ip 地址 + tcp 端口号就会出现端口访问不到的问题。


http://www.ppmy.cn/news/352771.html

相关文章

谷歌身份验证器 手表_6条使您的三星手表更加Google-y的提示

谷歌身份验证器 手表 Samsung 三星 Samsung Galaxy watches are, arguably, the best smartwatches for Android phones. However, they lack one major thing that people who use Android love: Google. There are a few ways you can make your Samsung watch a bit more Go…

多媒体展厅中控APP

多媒体展厅中控APP通过局域网WIFI控制展厅内软硬件&#xff1b;如展厅内播放软件的播放、暂停、停止、切换场景&#xff1b;展厅内主机开关机、投影机开关机、灯光开关&#xff08;多路继电器控制&#xff09;。 多媒体展厅中控APP需配置PC中控的IP和端口&#xff08;7001&…

车载安卓系统如何刷linux,手把手教你如何在车载中控上安装软件

2、手机B(安卓机)装悟空遥控&#xff0c;这个在各大软件商店都可以直接下载安装 3、打开软件&#xff0c;会看到下方灰色提示未链接设备&#xff0c;点击进入 4、搜索到我们的车机&#xff0c;显示为智能电视&#xff0c;如果搜索不到&#xff0c;下面我会说一说今天我自己碰到…

中控门禁控制器接玻璃移动门

前言 工作日志 切记请勿带电操作 今天安调试一台移动玻璃门没发现用原来接入电磁锁的接法&#xff0c;控制器信号可以传输但是控制不了门的移动。研究一下发现应该移动门不需要电源去控制。本身只需要信号传输就行。 如图所示一下的接线图。把原来接入点NC------GND 接到磁锁…

小车跟随行驶系统(基于MSP-EXP430F5529LP系统板)

选用材料&#xff1a;主控板MSP-EXP430F5529LP、陀螺仪、直流减速电机&#xff08;可以选用光电编码器&#xff0c;霍尔电机不好调节PID&#xff09;、TB6612电机驱动、超声波测距模块、灰度传感器、无线透传/蓝牙模块&#xff08;便于两辆小车相互发送信息&#xff09;、OLED屏…

汽车中控IVI及解决方案

中控IVI(In-Vehicle Infotainment )过去常称为车载信息娱乐系统,前装选配或后装加装,现在还有个智能座舱系统的名字,也有叫cluster IVI,IVI的作用可以说是越来越强大,人送新绰号:车机。想想手机,就知道车机有多强大了。它都涉及哪些功能呢? 1、音频:麦克风输入、扬声…

迅为RK3568核心板车载中控AVM一体机应用

RK3568M车载中控&AVM一体机方案搭载4核A55 CPU&#xff0c;G52-2EE GPU架构&#xff0c;1Tops算力NPU&#xff0c;支持1路4K 60fps或8路1080P 30fps的多格式解码和高达1080P 100fps的H.265编码&#xff0c;具备双千兆GMAC、三路CAN以及USB3.0/SATA3.0/PCIE3.0等丰富接口&am…

汽车中控芯片开发板入门及开发进阶

后续将会在中控开发板上研究一些具体应用,现罗列如下: 中控屏显示摄像头视频:这个应用也是很平常的,将涉及不同格式的视频解码和大屏显示。利用蓝牙模块实现中控屏的手机投屏功能:很多车机靠这个应用增加用户粘性,比如鸿蒙车机投屏效果就不错,如手机互连:HiCar、CarPla…