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 文件:
您可以使用多种方法创建 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,请使用:
$ docker exec <container id> cat /usr/share/elasticsearch/config/filename.pem > filename2.pem
复制代码
将文件传送到您的计算机上。将 替换为某个 Elasticsearch 容器的 ID。将 filename.pem 和 filename2.pem 替换为上述文件。
如果您运行的是 RPM,只需将文件复制到 setup-ssl 目录。
创建新的证书颁发机构 (CA)、节点和管理员证书
若要创建 CA 和新证书,请使用 OpenSSL 创建本地自签名证书颁发机构 (CA)。您还可以创建服务器和管理员证书。然后,使用 CA 签署证书。
要安装 OpenSSL,请运行以下命令。您可以在 OpenSSL 网站找到最新版本:
$ sudo yum -y install 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 证书重复这一流程:
$ openssl genrsa -out odfe-node1-pkcs12.key 2048
复制代码
重要提示:将其转换为 PKCS#5 v1.5,以正确使用 JDK。此命令的输出
将用于所有配置文件。
$ openssl pkcs8 -v1 "PBE-SHA1-3DES" -in "odfe-node1-pkcs12.key" -topk8 -out "odfe-node1.key" -nocrypt
复制代码
创建 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。您需要用自己的证书文件替换这些变量的值。
请确保删除以下条目:
opendistro_security.allow_unsafe_democertificates: true
复制代码
以使用您的证书替换演示证书。
您还可以添加可分辨名称 (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://:5601/。您可能需要注销 Kibana 的 UI,才能在登录之前删除任何浏览器缓存的证书。
要在浏览器中禁用安全警告,您可以使用其设置面板将自签名 MyRootCA 证书添加到可信证书颁发机构。
小结
通过添加自己的 SSL 证书,您现已提高 Open Distro for Elasticsearch 集群的安全性。您的证书包括(可选)从浏览器到 Kibana 的通信、到 Elasticsearch 终端节点的通信,以及节点间的集群内通信。
有问题或疑问? 希望参与讨论? 您可以在我们的论坛上获得帮助并讨论 Open Distro for Elasticsearch。您可以在这里提出问题。
作者介绍:
agadeesh Pusapadi
Jagadeesh Pusapadi 是 AWS 的解决方案架构师,负责与客户就其战略计划进行合作。他通过提供架构指导,帮助客户在 AWS 云上构建创新解决方案,以实现预期的业务成果。
Jon Handler
Jon Handler (@_searchgeek) 是总部位于加利福尼亚州帕罗奥图市的 Amazon Web Services 的首席解决方案架构师。Jon 与 CloudSearch 和 Elasticsearch 团队密切合作,为想要将搜索工作负载迁移到 AWS 云的广大客户提供帮助和指导。在加入 AWS 之前,Jon 作为一名软件开发人员,曾为某个大型电子商务搜索引擎编写代码长达四年。Jon 拥有宾夕法尼亚大学的文学学士学位,以及西北大学计算机科学和人工智能理学硕士和博士学位。
本文转载自 AWS 技术博客。
原文链接:
https://amazonaws-china.com/cn/blogs/china/add-ssl-certificates-open-distro-for-elasticsearch/
评论