亚马逊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 和证书。

首先,创建目录来保存要构建的各种资产:

$ mkdir setup-ssl

使用演示 .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.pemkirk-key.pemesnode.pemesnode-key.pemroot-ca.pem 复制到 setup-ssl 目录。

如果您运行的是 Docker,请使用:


$ docker exec <container id> cat /usr/share/elasticsearch/config/filename.pem > filename2.pem

将文件传送到您的计算机上。将 <container ID> 替换为某个 Elasticsearch 容器的 ID。将 filename.pemfilename2.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://<localhost or FQDN of kibana>:5601/。您可能需要注销 Kibana 的 UI,才能在登录之前删除任何浏览器缓存的证书。

要在浏览器中禁用安全警告,您可以使用其设置面板将自签名 MyRootCA 证书添加到可信证书颁发机构。

小结

通过添加自己的 SSL 证书,您现已提高 Open Distro for Elasticsearch 集群的安全性。您的证书包括(可选)从浏览器到 Kibana 的通信、到 Elasticsearch 终端节点的通信,以及节点间的集群内通信。

有问题或疑问? 希望参与讨论? 您可以在我们的论坛上获得帮助并讨论 Open Distro for Elasticsearch。您可以在这里提出问题

本篇作者

Jagadeesh Pusapadi

Jagadeesh Pusapadi

Jagadeesh Pusapadi 是 AWS 的解决方案架构师,负责与客户就其战略计划进行合作。他通过提供架构指导,帮助客户在 AWS 云上构建创新解决方案,以实现预期的业务成果。

Jon Handler

Jon Handler

Jon Handler (@_searchgeek) 是总部位于加利福尼亚州帕罗奥图市的 Amazon Web Services 的首席解决方案架构师。Jon 与 CloudSearch 和 Elasticsearch 团队密切合作,为想要将搜索工作负载迁移到 AWS 云的广大客户提供帮助和指导。在加入 AWS 之前,Jon 作为一名软件开发人员,曾为某个大型电子商务搜索引擎编写代码长达四年。Jon 拥有宾夕法尼亚大学的文学学士学位,以及西北大学计算机科学和人工智能理学硕士和博士学位。