将您自己的 SSL 证书添加到 Open Distro for Elasticsearch

作者: 777SSL证书_便宜ssl证书申请_便宜ssl证书购买 | 日期: 2020-02-11 | 标签: ssl证书,申请ssl证书,免费ssl证书

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.pem 和 root-ca.pem 复制到 setup-ssl 目录。

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


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

将文件传送到您的计算机上。将 <container ID> 替换为某个 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