通过docker启动ElasticSearch后为ElasticSearch设置用户和密码 ...

打印 上一主题 下一主题

主题 999|帖子 999|积分 2997

0. 媒介

之以是要为 ElasticSearch 设置用户名和访问密码,是为了提高服务器的安全性,假如你是使用 VMware 模拟出来的 Linux 系统,大概还没有什么关系,但假如你使用的是云服务器,开放了 9200 端口,又没有设置密码,就相当于在互联网上裸奔,最终的结果就是你的云服务器成了矿机

如何通过 docker 安装 ElasticSearch,可以检察我的另一篇博文:ElasticSearch快速入门(安装ElasticSearch、IK分词器、索引库操纵、文档操纵、在Java代码中操纵ElasticSearch、数据聚合)_安装摆设elasticsearch-CSDN博客
1. 没有设置用户名和密码的环境

访问 kibana 的 Dev Tools 控制台时会出现以下警告

Your data is not secure
Don’t lose one bit. Enable our free security features.
Don’t show again

在 kibana 的 Dev Tools 控制台向 ElasticSearch 发送 HTTP 请求时会出现以下警告
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html to enable security.
2. 为ElasticSearch设置用户名和密码

2.1 进入 ElasticSearch 容器内部

先检察当前有哪些容器正在运行,找到 ElasticSearch 容器
  1. sudo docker ps --format '{{.Names}}'
复制代码

接着运行以下指令进入 ElasticSearch 容器内部
  1. sudo docker exec -it elasticsearch bash
复制代码
2.2 修改 ElasticSearch 的配置文件

先进入配置文件所在的目录
  1. cd /usr/share/elasticsearch/config
复制代码
接着向 ElasticSearch 的配置文件(elasticsearch.yml)中追加以下内容(注意:不要使用 vi 或 vim 编辑器,由于构建容器的镜像都是阉割版的 Linux 系统,一般不会有 vi 或 vim 编辑器)
  1. echo "xpack.security.enabled: true
  2. xpack.license.self_generated.type: basic
  3. xpack.security.transport.ssl.enabled: true" >> elasticsearch.yml
复制代码
退出容器后重启容器
  1. exit
复制代码
  1. sudo docker restart elasticsearch
复制代码
2.3 设置用户名和密码

再次进入 ElasticSearch 容器内部
  1. sudo docker exec -it elasticsearch bash
复制代码
执行以下命令(elasticsearch-setup-passwords 文件是一个脚本)
  1. ./bin/elasticsearch-setup-passwords interactive
复制代码

root@f6b93f64adc4:/usr/share/elasticsearch# ./bin/elasticsearch-setup-passwords interactive

Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]

上述英文的大概意思就是
假如确定开启密码的话,需要设置以下六个账户的密码(建议设置成一样的)
我们输入 y,接着分别为六个用户设置密码

完成以上的设置后,退出容器,再次重启 ElasticSearch 容器
  1. exit
复制代码
  1. sudo docker restart elasticsearch
复制代码

3. 在 kibana 容器中指定访问 ElasticSearch 的用户名和密码

先进入 kibana 容器内部
  1. sudo docker exec -it kibana bash
复制代码
接着向 kibana 的配置文件(kibana.yml)中追加以下内容(注意:不要使用 vi 或 vim 编辑器,由于构建容器的镜像都是阉割版的 Linux 系统,一般不会有 vi 或 vim 编辑器)
   记得将 elasticsearch 的密码改为你的密码(\n 表现换行)
  1. echo -e '\nelasticsearch.username: "elastic"' >> /usr/share/kibana/config/kibana.yml
  2. echo -e 'elasticsearch.password: "tF8RGg2vd0FAzgkK"\n' >> /usr/share/kibana/config/kibana.yml
复制代码
退出容器,再次重启 kibana 容器
  1. exit
复制代码
  1. sudo docker restart kibana
复制代码
4. 设置用户名和密码后的环境

4.1 访问 ElasticSearch

我们再次访问 ElasticSearch,发现需要输入用户名和密码了

输入用户名和密码后的页面

4.2 访问 kibana

我们再次访问 kibana 的 Dev Tools 控制台,发现也需要填写用户名和密码了

其它的操纵基本稳定
5. 通过 Java 代码操纵 ElasticSearch 的变化


  1. import org.apache.http.HttpHost;
  2. import org.apache.http.auth.AuthScope;
  3. import org.apache.http.auth.UsernamePasswordCredentials;
  4. import org.apache.http.impl.client.BasicCredentialsProvider;
  5. import org.elasticsearch.client.RequestOptions;
  6. import org.elasticsearch.client.RestClient;
  7. import org.elasticsearch.client.RestClientBuilder;
  8. import org.elasticsearch.client.RestHighLevelClient;
  9. import org.elasticsearch.client.indices.GetIndexRequest;
  10. import org.elasticsearch.client.indices.GetIndexResponse;
  11. import org.junit.jupiter.api.AfterEach;
  12. import org.junit.jupiter.api.BeforeEach;
  13. import org.junit.jupiter.api.Test;
  14. import java.io.IOException;
  15. import java.util.Arrays;
  16. public class ElasticSearchTests {
  17.     private RestHighLevelClient restHighLevelClient;
  18.     @Test
  19.     public void testGetAllIndex() throws IOException {
  20.         // 获取所有索引
  21.         GetIndexRequest request = new GetIndexRequest("*");
  22.         GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
  23.         // 输出索引名称
  24.         String[] indices = response.getIndices();
  25.         System.out.println("Current indices:");
  26.         Arrays.stream(indices).forEach(System.err::println);
  27.     }
  28.     @BeforeEach
  29.     public void setUp() {
  30.         // 用户名和密码
  31.         String username = "elastic";
  32.         String password = "tF8RGg2vd0FAzgkK";
  33.         final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  34.         credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
  35.         RestClientBuilder restClientBuilder = RestClient
  36.                 .builder(new HttpHost("127.0.0.1", 9200, "http"))
  37.                 .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
  38.         restHighLevelClient = new RestHighLevelClient(restClientBuilder);
  39.     }
  40.     @AfterEach
  41.     public void tearDown() throws Exception {
  42.         restHighLevelClient.close();
  43.     }
  44. }
复制代码
6. 大概遇到的题目

假如为 ElasticSearch 设置用户和密码之后访问 kibana 的 Dev Tools 控制台出现以下错误

Kibana server is not ready yet
是由于没有在 kibana 容器中指定访问 ElasticSearch 的用户名和密码,办理方法可参考本文的 3. 在 kibana 容器中指定访问 ElasticSearch 的用户名和密码 部分

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表