使用 docker 来构建 Elasticsearch 集群为开发者们带来了极大的方便。在我之前的文章中:
我详细地描述了如何使用 Elastic 所提供的 docker 镜像来安装 Elasticsearch。在今天的文章中,我来详述如何来构建一个带有安全配置的 docker 镜像。希望这对你的开发有帮助。
Elasticsearch 是一个功能强大且流行的搜索引擎,被许多公司所使用。 但是,如果 Elasticsearch 实例没有得到适当的保护,它们可能容易受到安全威胁。 确保 Elasticsearch 实例安全的一种方法是使用证书。 在本文中,我们将讨论如何使用带有证书的 Elasticsearch Docker Image 来保护您的 Elasticsearch 实例。
第 1 部分:使用证书设置 Elasticsearch
首先,我们将使用已经包含证书的 Elasticsearch Docker 镜像。 我们将使用的 Docker Image 是最新的 Elasticsearch 8.6.2 版本,它预装了 Elasticsearch-certutil 工具。 该工具使我们能够为我们的 Elasticsearch 实例创建证书。
创建 Dockerfile:
我们使用如下的代码来创建一个 Dockerfile:
Dockerfile
-
FROM docker.elastic.co
/elasticsearch
/elasticsearch:
8.6.2
-
RUN bin
/elasticsearch-certutil ca --out config
/elastic-stack-ca.p
12 --pass
""
-
RUN bin
/elasticsearch-certutil cert --pass
"" --days
1825 --ca config
/elastic-stack-ca.p
12 --ca-pass
"" --out config
/elastic-certificates.p
12
-
$ pwd
-
/Users
/liuxg
/
data
/sec_elasticsearch
-
$ ls
-
Docker
file
构建 Docker 镜像
我们使用如下的命令来构建 Docker 镜像:
docker build -t elasticsearch-with-certs .
我们可以打开 Docker Desktop 来进行查看:
我们创建了一个名字称作为 elasticsearch-with-certs 的镜像。
运行 Docker 容器
我们使用如下的命令来启动 docker 容器:
docker run -p 9200:9200 -p 9300:9300 -it --name elasticsearch elasticsearch-with-certs
在启动的过程中,我们可以看到 elastic 用户的密码及其他信息:
我们可以通过如下的命令来查看正在运行的容器:
docker ps
-
$ docker ps
-
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
-
2dbc39f
48668 elasticsearch-with-certs
"/bin/tini -- /usr/l…" About a minute ago
Up About a minute
0.0.0.0:
9200-
>
9200
/tcp,
0.0.0.0:
9300-
>
9300
/tcp elasticsearch
我们可以通过如下的命令来查看 elasticsearch 容器的日志信息:
docker logs -f elasticsearch
这个命令也可以让我们查看到 elastic 用户的密码:
在浏览器中验证 Elasticsearch 的运行
我们在 浏览器中输入 https://localhost:9200,并以上面所提供的 elastic 用户密码进行登录:
显然我们的登录是成功的。我们也可以使用如下的命令来进行验证:
curl -k -u elastic:v35KytDBs_2BLB4NSz2B https://localhost:9200
-
$ curl -k -u elastic:v
35KytDBs_
2BLB
4NSz
2B https:
/
/localhost:
9200
-
{
-
"name" :
"2dbc39f48668",
-
"cluster_name" :
"docker-cluster",
-
"cluster_uuid" :
"4WtDSp8AQROd3lxNGjkEiQ",
-
"version" : {
-
"number" :
"8.3.3",
-
"build_flavor" :
"default",
-
"build_type" :
"docker",
-
"build_hash" :
"801fed82df74dbe537f89b71b098ccaff88d2c56",
-
"build_date" :
"2022-07-23T19:30:09.227964828Z",
-
"build_snapshot" :
false,
-
"lucene_version" :
"9.2.0",
-
"minimum_wire_compatibility_version" :
"7.17.0",
-
"minimum_index_compatibility_version" :
"7.0.0"
-
},
-
"tagline" :
"You Know, for Search"
-
}
请注意:针对你的情况,你需要修改上面的 elastic 用户密码进行验证。
现在我们已经启动并运行了带有证书的 Elasticsearch 实例,让我们更深入地了解证书的工作原理以及为什么它们对 Elasticsearch 安全很重要。
证书是验证服务器或客户端身份的数字文档。 在 Elasticsearch 中,证书用于在客户端和 Elasticsearch 集群之间建立安全连接。 通过使用证书,我们可以保证客户端和 Elasticsearch 集群之间传输的数据是加密的和安全的。
第 2 部分:了解 Elasticsearch 证书
证书在保护 Elasticsearch 实例方面起着至关重要的作用。 在本节中,我们将讨论与 Elasticsearch 证书相关的一些关键概念。
- 证书颁发机构 (CA):证书颁发机构负责颁发和管理证书。 在 Elasticsearch 中,我们使用 CA 创建根证书,用于签署和验证其他证书。
- 根证书:根证书是验证服务器或客户端身份的数字文档。 在 Elasticsearch 中,我们使用根证书在客户端和 Elasticsearch 集群之间建立信任。
- 服务器证书:服务器证书是验证 Elasticsearch 节点身份的数字文档。 在 Elasticsearch 中,我们使用服务器证书在客户端和 Elasticsearch 集群之间建立安全连接。
- 客户端证书:客户端证书是一种数字文档,用于验证连接到 Elasticsearch 集群的客户端的身份。 在 Elasticsearch 中,我们使用客户端证书在客户端和 Elasticsearch 集群之间建立安全连接。
第 3 部分:创建 Elasticsearch 证书
现在我们了解了与 Elasticsearch 证书相关的关键概念,让我们使用 Elasticsearch-certutil 工具创建我们自己的证书。
创建 CA 证书
第一步是通过运行以下命令创建 CA 证书:
bin/elasticsearch-certutil ca --out config/elastic-stack-ca.p12 --pass "”
此命令在 config/elastic-stack-ca.p12 文件中创建一个 CA 证书。 --pass 标志用于为 CA 证书指定空密码。 不建议在生产环境中这样做,但在测试和开发环境中是可以接受的。
创建服务器及客户端证书
下一步是通过运行以下命令创建服务器和客户端证书:
bin/elasticsearch-certutil cert --pass "" --days 1825 --ca config/elastic-stack-ca.p12 --ca-pass "" --out config/elastic-certificates.p12
此命令创建两个证书:服务器证书和客户端证书。 --days 标志用于指定证书的有效期,设置为1825天(5年)。 --ca 标志用于指定 CA 证书文件的位置,--ca-pass 标志用于指定 CA 证书的密码。 最后,--out 标志用于指定包含服务器和客户端证书的输出文件的位置和名称。
第 4 部分:将 Elasticsearch 与证书结合使用
现在我们已经创建了我们的证书,我们可以使用它们来保护我们的 Elasticsearch 实例。 要使用证书,我们需要配置 Elasticsearch 以使用它们。 这可以通过将以下行添加到 elasticsearch.yml 配置文件来完成:
-
xpack.security.enabled:
true
-
xpack.security.transport.ssl.enabled:
true
-
xpack.security.transport.ssl.verification_
mode: certificate
-
xpack.security.transport.ssl.keystore.path: elastic-certificates.p
12
-
xpack.security.transport.ssl.truststore.path: elastic-certificates.p
12
xpack.security.transport.ssl.enabled 设置启用 Elasticsearch 中的安全功能,xpack.security.transport.ssl.enabled 设置启用传输层通信的 SSL/TLS 加密。
xpack.security.transport.ssl.verification_mode 设置指定 Elasticsearch 应验证客户端提供的证书。 xpack.security.transport.ssl.keystore.path 设置指定服务器证书的位置,xpack.security.transport.ssl.truststore.path 设置指定 CA 证书的位置。
我们可以通过如下的命令登录正在运行的 Elasticsearch 容器,并查看 elasticsearch.yml 文件:
-
$ docker ps
-
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
-
2dbc39f
48668 elasticsearch-with-certs
"/bin/tini -- /usr/l…"
22 minutes ago
Up
22 minutes
0.0.0.0:
9200-
>
9200
/tcp,
0.0.0.0:
9300-
>
9300
/tcp elasticsearch
-
$ docker exec -it elasticsearch
/bin
/bash
-
elasticsearch@
2dbc
39f
48668:~$ pwd
-
/usr
/share
/elasticsearch
-
elasticsearch@
2dbc
39f
48668:~$ cat config
/elasticsearch.yml
-
cluster.name:
"docker-cluster"
-
network.host:
0.0.0.0
-
-
#----------------------- BEGIN SECURITY AUTO
CONFIGURATION -----------------------
-
#
-
# The following settings, TLS certificates,
and keys have been automatically
-
# generated
to configure Elasticsearch security features
on
27-
02-
2023
05:
34:
22
-
#
-
# --------------------------------------------------------------------------------
-
-
# Enable security features
-
xpack.security.enabled:
true
-
-
xpack.security.enrollment.enabled:
true
-
-
# Enable encryption
for HTTP API client connections, such
as Kibana, Logstash,
and Agents
-
xpack.security.http.ssl:
-
enabled:
true
-
keystore.path: certs
/http.p
12
-
-
# Enable encryption
and mutual authentication between cluster nodes
-
xpack.security.transport.ssl:
-
enabled:
true
-
verification_
mode: certificate
-
keystore.path: certs
/transport.p
12
-
truststore.path: certs
/transport.p
12
-
# Create a new cluster
with the current node only
-
# Additional nodes can still join the cluster later
-
cluster.
initial_master_nodes: [
"2dbc39f48668"]
-
-
#-----------------------
END SECURITY AUTO
CONFIGURATION -------------------------
你也可以直接使用如下的命令来进行查看:
-
$ docker ps
-
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
-
2dbc39f
48668 elasticsearch-with-certs
"/bin/tini -- /usr/l…"
26 minutes ago
Up
25 minutes
0.0.0.0:
9200-
>
9200
/tcp,
0.0.0.0:
9300-
>
9300
/tcp elasticsearch
-
$ docker exec elasticsearch cat
/usr
/share
/elasticsearch
/config
/elasticsearch.yml
-
cluster.name:
"docker-cluster"
-
network.host:
0.0.0.0
-
-
#----------------------- BEGIN SECURITY AUTO
CONFIGURATION -----------------------
-
#
-
# The following settings, TLS certificates,
and keys have been automatically
-
# generated
to configure Elasticsearch security features
on
27-
02-
2023
05:
34:
22
-
#
-
# --------------------------------------------------------------------------------
-
-
# Enable security features
-
xpack.security.enabled:
true
-
-
xpack.security.enrollment.enabled:
true
-
-
# Enable encryption
for HTTP API client connections, such
as Kibana, Logstash,
and Agents
-
xpack.security.http.ssl:
-
enabled:
true
-
keystore.path: certs
/http.p
12
-
-
# Enable encryption
and mutual authentication between cluster nodes
-
xpack.security.transport.ssl:
-
enabled:
true
-
verification_
mode: certificate
-
keystore.path: certs
/transport.p
12
-
truststore.path: certs
/transport.p
12
-
# Create a new cluster
with the current node only
-
# Additional nodes can still join the cluster later
-
cluster.
initial_master_nodes: [
"2dbc39f48668"]
-
-
#-----------------------
END SECURITY AUTO
CONFIGURATION -------------------------
结论
Elasticsearch 是一个强大的搜索引擎,被许多公司广泛使用。 但是,保护 Elasticsearch 实例以防止安全威胁非常重要。 通过使用带有证书的 Elasticsearch Docker Image,我们可以轻松地保护我们的 Elasticsearch 实例。 证书在保护 Elasticsearch 实例方面起着至关重要的作用,我们已经讨论了与 Elasticsearch 证书相关的一些关键概念。 我们还介绍了如何使用 elasticsearch-certutil 工具创建证书以及如何使用它们来保护我们的 Elasticsearch 实例。
转载:https://blog.csdn.net/UbuntuTouch/article/details/129239072