亚马逊AWS官方博客
将您自己的 SSL 证书添加到 Open Distro for Elasticsearch
Open Distro for Elasticsearch 的安全插件自带即开即用的身份验证和访问控制功能。为方便上手,二进制发行版包含密码和 SSL 证书,供您试用插件。请先更改默认密码和证书,然后再添加任何私人数据。在上一篇文章中,我们向您展示了如何在 Open Distro for Elasticsearch 中更改管理员密码。在本文中,我们将介绍如何更改 SSL 证书。
要更改 SSL 证书,您需要将证书文件复制到此发行版中,并修改 elasticsearch.yml
来使用这些文件。我将介绍如何更改 Elasticsearch 节点到节点通信证书、REST API,以及如何将 Kibana 的后端通信更改为 Elasticsearch。我将介绍 Open Distro for Elasticsearch 的 RPM 和 Docker 发行版。
收集文件
在更改证书之前,您需要为证书和密钥生成(或配置)以下 .pem
文件:
- Elasticsearch 管理员
- Elasticsearch 节点
- Kibana 节点
- 证书颁发机构
如果您想要支持 Kibana 连接 SSL,还需向 Kibana 添加证书。您可以使用 Elasticsearch 节点证书和 Kibana 密钥文件,或者使用单独的证书。
您可以使用多种方法创建 CA 和证书。您可能配有证书颁发机构 (CA),用于在您的组织中发放证书。如果是这样,请善加利用。如果您无权访问自己的 CA,可以使用 Open Distro for Elasticsearch 随带的演示文件。您也可以使用 OpenSSL,创建 CA,然后使用 CA 来创建和签署证书。在本文中,我将介绍如何复制演示文件,以及如何使用 OpenSSL 创建 CA 和证书。
首先,创建目录来保存要构建的各种资产:
使用演示 .pem
文件
下载并安装 Open Distro for Elasticsearch RPM,或者在 Docker 中运行 Open Distro for Elasticsearch(参阅启动并运行 Open Distro for Elasticsearch,了解如何在本地运行 Docker 的相关说明)。演示 .pem
文件位于不同的目录中,具体取决于您所运行的发行版:
- Docker:
/usr/share/elasticsearch/config
- RPM:
/etc/elasticsearch
将 kirk.pem
、kirk-key.pem
、esnode.pem
、esnode-key.pem
和 root-ca.pem
复制到 setup-ssl
目录。
如果您运行的是 Docker,请使用:
将文件传送到您的计算机上。将 <container ID>
替换为某个 Elasticsearch 容器的 ID。将 filename.pem
和 filename2.pem
替换为上述文件。
如果您运行的是 RPM,只需将文件复制
到 setup-ssl
目录。
创建新的证书颁发机构 (CA)、节点和管理员证书
若要创建 CA 和新证书,请使用 OpenSSL 创建本地自签名证书颁发机构 (CA)。您还可以创建服务器和管理员证书。然后,使用 CA 签署证书。
要安装 OpenSSL,请运行以下命令。您可以在 OpenSSL 网站找到最新版本:
首先,为 CA 创建私有密钥:
$ openssl genrsa -out MyRootCA.key 2048
Generating RSA private key, 2048 bit long modulus
................+++
...............................+++
e is 65537 (0x10001)
创建 CA 并输入组织详细信息:
$ openssl req -x509 -new -key MyRootCA.key -sha256 -out MyRootCA.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Corp
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Example Corp CA Root
Email Address []:
针对服务器和管理员证书,创建密钥、证书签名请求 (CSR) 和
CA 签署的证书。在以下示例中,我将逐个执行一个服务器的
命令 – “odfe-node1”。您需要对 odfe-node2、
管理员证书和 kibana 证书重复这一流程:
重要提示:将其转换为 PKCS#5 v1.5,以正确使用 JDK。此命令的输出
将用于所有配置文件。
创建 CSR 并输入组织和服务器详细信息:
$ openssl req -new -key odfe-node1.key -out odfe-node1.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value, If you enter '.', the field will
be left blank.
----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Corp
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:odfe-node1.example.com
Email Address []:
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:
使用 CSR 生成签名证书:
$ openssl x509 -req -in odfe-node1.csr -CA MyRootCA.pem -CAkey MyRootCA.key -CAcreateserial -out odfe-node1.pem -sha256
Signature ok
subject=/C=GB/ST=Some-State/L=London/O=Example Corp/CN=odfe-node1.example.com
Getting CA Private Key
编辑 elasticsearch.yml 以添加证书
现在,您需要使用已创建或复制到 setup-ssl
的证书。无论您运行的是 Open Distro for Elasticsearch 的 .rpm 发行版,还是 Docker 发行版,您都要编辑 elasticsearch.yml
以添加证书信息。这会使 Open Distro for Elasticsearch 的安全插件接受 SSL 请求,还会实现点对点 SSL 通信。在 setup-ssl
目录中创建 elasticsearch.yml
副本。您可以在与 .pems
相同的目录中找到 elasticsearch.yml
。
使用您喜欢的编辑器打开 elasticsearch.yml
的本地副本。您将看到一系列以下列内容开头的设置:
######## Start OpenDistro for Elasticsearch Security Demo Configuration ########
# WARNING: revise all the lines below before you go into production
opendistro_security.ssl.transport.pemcert_filepath: esnode.pem
opendistro_security.ssl.transport.pemkey_filepath: esnode-key.pem
opendistro_security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
...
opendistro_security.ssl.transport.* 设置可实现节点间的 SSL 传输。opendistro_security.ssl.http.* 可为集群的 REST 请求启用 SSL。您需要用自己的证书文件替换这些变量的值。
请确保删除以下条目:
以使用您的证书替换演示证书。
您还可以添加可分辨名称 (DN) 验证设置来进一步提高安全性,如下所示。安全插件支持通配符和正则表达式:
opendistro_security.nodes_dn:
- 'CN=node2.example.com,OU=SSL,O=Example Corp,L=London,C=GB'
- 'CN=*.example.com,OU=SSL,O=Example Corp,L=London,C=GB'
- 'CN=odfe-cluster*'- '/CN=.*regex/'
如果您运行的是 .rpm 发行版,请将您的证书和 elasticsearch.yml 复制到 /etc/elasticsearch/config
目录。请更改文件名以匹配您的证书文件名称。
针对容器部署,通过修改 docker- composition .yml 可使用本地文件覆盖容器中的文件。在编辑器中打开此文件,找到 odfe-node1 和 odfe-node2 服务的“volumes”部分。在这些部分中添加其他行,将本地文件映射到容器的文件系统。完成后,应如下所示:
version: '3'
services:
odfe-node1:
image: amazon/opendistro-for-elasticsearch:0.7.0
container_name: odfe-node1
environment:
- cluster.name=odfe-cluster
- bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- odfe-data1:/usr/share/elasticsearch/data
- ./MyRootCA.pem:/usr/share/elasticsearch/config/MyRootCA.pem
- ./odfe-node1.pem:/usr/share/elasticsearch/config/odfe-node1.pem
- ./odfe-node1.key:/usr/share/elasticsearch/config/odfe-node1.key
- ./node1-elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
ports:
- 9200:9200
- 9600:9600 # required for Performance Analyzer
networks:
- odfe-net
odfe-node2:
image: amazon/opendistro-for-elasticsearch:0.7.0
container_name: odfe-node2
environment:
- cluster.name=odfe-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.zen.ping.unicast.hosts=odfe-node1
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- odfe-data2:/usr/share/elasticsearch/data
- ./MyRootCA.pem:/usr/share/elasticsearch/config/MyRootCA.pem
- ./odfe-node2.pem:/usr/share/elasticsearch/config/odfe-node2.pem
- ./odfe-node2.key:/usr/share/elasticsearch/config/odfe-node2.key
- ./node2-elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
networks:
- odfe-net
.....
对 Kibana 的访问权限进行加密
通过在 kibana.yml
中设置以下 server.ssl
选项,您可以在浏览器和 Kibana 服务器之间启用 TLS / SSL 加密。具体位置取决于您所运行的发行版:
- Docker:
/usr/share/kibana/config
- RPM:
/etc/kibana
server.ssl.enabled: true
server.ssl.key: <full path to your key file>
server.ssl.certificate: <full path to your certificate>
如果您运行的是 .rpm 发行版,请将证书复制到 /etc/kibana/
目录并在 kibana.yml
中更新 ssl 设置。
针对容器部署,通过在 volumes
部分添加文件映射,同时在环境
部分添加 SERVER_SSL 选项,来更新 docker-compose.yml 文件中的 Kibana 部分。
.....
kibana:
image: amazon/opendistro-for-elasticsearch-kibana:0.7.0
container_name: odfe-kibana
ports:
- 5601:5601
expose:
- "5601"
environment:
ELASTICSEARCH_URL: https://odfe-node1:9200
SERVER_SSL_ENABLED: "true"
SERVER_SSL_KEY: /usr/share/kibana/config/odfe-node2.key
SERVER_SSL_CERTIFICATE: /usr/share/kibana/config/odfe-node2.pem
volumes:
- ./MyRootCA.pem:/usr/share/kibana/config/MyRootCA.pem
- ./odfe-node2.pem:/usr/share/kibana/config/odfe-node2.pem
- ./odfe-node2.key:/usr/share/kibana/config/odfe-node2.key
networks:
- odfe-net
.....
重启您的环境
现在,您需要重启 Elasticsearch。您需要删除现有卷,才能从安全插件的 Elasticsearch 索引中删除演示证书。从包含 docker-compose.yml 的目录中,发出以下命令:
NOTE! the following commands will erase all data that you have in Elasticsearch!
docker-compose down -v
docker-compose up
您应该能够浏览 https://<localhost or FQDN of kibana>:5601/
。您可能需要注销 Kibana 的 UI,才能在登录之前删除任何浏览器缓存的证书。
要在浏览器中禁用安全警告,您可以使用其设置面板将自签名 MyRootCA 证书添加到可信证书颁发机构。
小结
通过添加自己的 SSL 证书,您现已提高 Open Distro for Elasticsearch 集群的安全性。您的证书包括(可选)从浏览器到 Kibana 的通信、到 Elasticsearch 终端节点的通信,以及节点间的集群内通信。
有问题或疑问? 希望参与讨论? 您可以在我们的论坛上获得帮助并讨论 Open Distro for Elasticsearch。您可以在这里提出问题。