更新节点安全证书

edit

如果您的当前节点证书即将过期,您正在向安全集群添加新节点,或者安全漏洞破坏了您的证书链的信任,您可能需要更新您的TLS证书。使用SSL证书 API检查您的证书何时过期。

在您可以访问用于签署现有节点证书的原始证书颁发机构(CA)密钥和证书(并且您仍然可以信任您的CA)的情况下,您可以使用该CA签署新的证书

如果您需要信任来自您组织的新CA,或者您需要自己生成一个新的CA,您需要使用这个新的CA来签署新的节点证书,并指示您的节点信任新的CA。在这种情况下,您将使用您的新CA签署节点证书,并指示您的节点信任此证书链。

根据哪些证书即将到期,您可能需要更新传输层的证书、HTTP层的证书或两者都需要更新。

无论在何种情况下,Elasticsearch 默认会每隔五秒监控 SSL 资源的更新。您只需将新的证书和密钥文件(或密钥库)复制到 Elasticsearch 配置目录中,您的节点将会检测到这些更改并重新加载密钥和证书。

因为 Elasticsearch 不会重新加载 elasticsearch.yml 配置文件, 如果你想利用自动证书和密钥重新加载功能,你必须使用 相同的文件名

如果您需要更新 elasticsearch.yml 配置或更改存储在 安全设置 中的密钥或密钥库的密码,则必须完成一次 滚动重启。Elasticsearch 不会自动重新加载存储在安全设置中的密码更改。

使用相同的CA更新证书

edit

此过程假设您可以访问最初生成(或由您的组织持有)并用于签署当前使用的节点证书的CA证书和密钥。还假设连接到HTTP层上的Elasticsearch的客户端已配置为信任该CA证书。

如果您有权访问用于签署现有证书的CA,您只需要替换集群中每个节点的证书和密钥。如果您在每个节点上替换现有的证书和密钥并使用相同的文件名,Elasticsearch将重新加载这些文件并开始使用新的证书和密钥。

您不必重新启动每个节点,但这样做会强制建立新的 TLS 连接,并且在更新证书时,推荐的做法。因此,以下步骤包括在更新每个证书后重新启动节点。

以下步骤提供了为传输层和HTTP层生成新节点证书和密钥的说明。您可能只需要替换其中一个层的证书,具体取决于哪些证书即将过期。

如果您的密钥库是受密码保护的,密码存储在Elasticsearch的安全设置中,并且需要更改密码,那么您必须在集群上执行滚动重启。您还必须为密钥库使用不同的文件名,以便在节点重启之前Elasticsearch不会重新加载该文件。

如果您的CA已更改,请完成使用不同的CA更新安全证书中的步骤。

为传输层生成新证书

edit

以下示例使用PKCS#12文件,但相同的步骤也适用于JKS密钥库。

  1. 打开 ES_PATH_CONF/elasticsearch.yml 文件并检查当前使用的密钥库的名称和位置。您将为新证书使用相同的名称。

    在这个例子中,密钥库和信任库指向不同的文件。 您的配置可能会使用包含证书和CA的同一个文件。 在这种情况下,请为密钥库和信任库都包含该文件的路径。

    这些说明假设提供的证书是由受信任的CA签名的,并且验证模式设置为certificate。此设置确保节点不会尝试执行主机名验证。

    xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12
    xpack.security.transport.ssl.keystore.type: PKCS12
    xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12
    xpack.security.transport.ssl.truststore.type: PKCS12
    xpack.security.transport.ssl.verification_mode: certificate
  2. 使用您现有的CA,为您的节点生成一个密钥库。您必须使用用于签署当前使用证书的CA。

    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    命令参数
    --ca
    用于签署您的证书的CA密钥库的名称。 如果您使用 elasticsearch-certutil 工具生成了现有的CA, 密钥库名称默认为 elastic-stack-ca.p12
    1. 输入输出文件的名称或接受默认的 elastic-certificates.p12
    2. 当提示时,输入节点密钥库的密码。
  3. 如果在创建节点密钥库时输入的密码与当前密钥库密码不同,请运行以下命令将密码存储在Elasticsearch密钥库中:

    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
  4. 在您正在更新密钥库的集群中的当前节点上,启动一个滚动重启

    停止在指示 执行任何需要的更改 的步骤,然后继续执行此过程中的下一步。

  5. 用新的密钥库替换现有的密钥库,确保文件名匹配。例如,elastic-certificates.p12

    如果你的 密钥库密码正在更改,那么请使用新文件名保存密钥库,以便 Elasticsearch 不会在您更新密码之前尝试重新加载该文件。

  6. 如果你需要用新文件名保存新的密钥库,请更新 ES_PATH_CONF/elasticsearch.yml 文件以使用新密钥库的文件名。 例如:

    xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12
    xpack.security.transport.ssl.keystore.type: PKCS12
    xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12
    xpack.security.transport.ssl.truststore.type: PKCS12
  7. 启动您更新了密钥库的节点。
  8. (可选) 使用 SSL证书API 验证Elasticsearch是否加载了新的密钥库。

    GET /_ssl/certificates
  9. 如果您仅更新传输层的证书(而不是HTTP层),则一次一个节点完成步骤4步骤8,直到您更新了集群中所有密钥库。然后,您可以完成剩余的步骤以进行滚动重启

    否则,不要完成滚动重启。相反,继续执行为HTTP层生成新证书的步骤。

下一步是什么?

edit

干得好!您已经更新了传输层的密钥库。如果需要,您还可以更新HTTP层的密钥库。如果您不更新HTTP层的密钥库,那么您已经全部设置好了。

为HTTP层生成新证书

edit

其他组件,如Kibana或任何Elastic语言客户端,在连接到Elasticsearch时会验证此证书。

如果您的组织有自己的CA,您需要 生成证书签名请求(CSRs)。CSRs包含 您的CA用于生成和签署证书的信息。

  1. 在安装了 Elasticsearch 的集群中的任何节点上,运行 Elasticsearch HTTP 证书工具。

    ./bin/elasticsearch-certutil http

    此命令生成一个包含证书和密钥的 .zip 文件,用于与 Elasticsearch 和 Kibana 一起使用。每个文件夹都包含一个 README.txt 文件,解释如何使用这些文件。

    1. 当被问到是否要生成一个 CSR 时,输入 n
    2. 当被问到是否要使用现有 CA 时,输入 y
    3. 输入您的 CA 的绝对路径,例如 elastic-stack-ca.p12 文件的路径。
    4. 输入您的 CA 的密码。
    5. 输入您的证书的过期值。您可以输入有效期(以年、月或天为单位)。例如,输入 1y 表示一年。
    6. 当被问到是否要为每个节点生成一个证书时,输入 y

      每个证书将拥有自己的私钥,并且将为特定的主机名或IP地址颁发。

    7. 当被提示时,输入集群中第一个节点的名称。使用与 elasticsearch.yml 文件中 node.name 参数相同的节点名称会很有帮助。
    8. 输入用于连接到您的第一个节点的所有主机名。这些主机名将作为DNS名称添加到您的证书的Subject Alternative Name (SAN)字段中。

      列出通过HTTPS连接到您的集群所使用的每个主机名和变体。

    9. 输入客户端可以用来连接到您的节点的IP地址。
    10. 为集群中的每个附加节点重复这些步骤。
  2. 为每个节点生成证书后,当被提示时,输入您的私钥的密码。
  3. 解压生成的 elasticsearch-ssl-http.zip 文件。这个压缩文件包含两个目录;分别用于 Elasticsearch 和 Kibana。在 /elasticsearch 目录中,每个你指定的节点都有一个对应的目录,并且每个目录中都有自己的 http.p12 文件。例如:

    /node1
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
    /node2
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
    /node3
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
  4. 如果需要,将 http.p12 文件重命名为与现有的HTTP客户端通信证书名称匹配。例如,node1-http.p12
  5. 在您正在更新密钥库的集群中的当前节点上,启动一个滚动重启

    停止在指示 执行任何需要的更改 的步骤,然后继续执行此过程中的下一步。

  6. 用新的密钥库替换现有的密钥库,确保文件名匹配。例如,node1-http.p12

    如果你的 密钥库密码正在更改,那么请使用新文件名保存密钥库,以便 Elasticsearch 不会在你更新密码之前尝试重新加载该文件。

  7. 如果你需要用新文件名保存新的密钥库,请更新 ES_PATH_CONF/elasticsearch.yml 文件以使用新密钥库的文件名。 例如:

    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.keystore.path: node1-http.p12
  8. 如果您的密钥库密码正在更改,请将您的私钥密码添加到 Elasticsearch 的安全设置中。

    ./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
  9. 从您更新了密钥库的节点开始。

    使用 cat nodes API 确认节点已加入集群:

    GET _cat/nodes
  10. (可选) 使用 SSL证书API 来验证Elasticsearch是否加载了新的密钥库。

    GET /_ssl/certificates
  11. 一次一个节点,完成 步骤5步骤10,直到您更新了集群中所有节点的密钥库。
  12. 完成剩余的步骤以进行 滚动重启, 从 重新启用分片分配 的步骤开始。

使用不同的CA更新安全证书

edit

如果您需要信任来自您组织的新CA,或者您需要自己生成一个新的CA,请使用这个新CA来签署新的节点证书,并指示您的节点信任这个新CA。

为传输层生成新证书

edit

创建一个新的CA证书,或者获取您组织的CA证书,并将其添加到现有的CA信任库中。在您为所有节点完成证书更新后,您可以从信任库中移除旧的CA证书(但不是在此之前!)。

以下示例使用PKCS#12文件,但相同的步骤也适用于JKS密钥库。

  1. 打开 ES_PATH_CONF/elasticsearch.yml 文件并检查当前使用的密钥库的名称和位置。您将为新的密钥库使用相同的名称。

    在这个例子中,密钥库和信任库使用了不同的文件。 您的配置可能会为密钥库和信任库使用相同的文件。

    这些说明假设提供的证书是由受信任的CA签名的,并且验证模式设置为certificate。此设置确保节点不会尝试执行主机名验证。

    xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12
    xpack.security.transport.ssl.keystore.type: PKCS12
    xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12
    xpack.security.transport.ssl.truststore.type: PKCS12
    xpack.security.transport.ssl.verification_mode: certificate
  2. 在集群中的任何节点上,生成一个新的CA证书。您只需完成此步骤一次。如果您使用的是您组织的CA证书,则跳过此步骤。

    ./bin/elasticsearch-certutil ca --pem
    命令参数
    --pem
    生成一个包含CA证书和密钥的目录,格式为PEM,而不是PKCS#12。
    1. 输入一个压缩输出文件的名称,该文件将包含您的证书和密钥,或接受默认名称 elastic-stack-ca.zip
    2. 解压缩输出文件。生成的目录包含一个CA证书(ca.crt)和一个私钥(ca.key)。

      将这些文件保存在安全的位置,因为它们包含您的CA的私钥。

  3. 在集群中的每个节点上,将新的ca.crt证书导入到现有的CA信任库中。此步骤确保您的集群信任新的CA证书。此示例使用Java keytool实用程序将证书导入到elastic-stack-ca.p12 CA信任库中。

    keytool -importcert -trustcacerts -noprompt -keystore elastic-stack-ca.p12 \
    -storepass   -alias new-ca -file ca.crt
    命令参数
    -keystore
    您正在导入新CA证书的信任库的名称。
    -storepass
    CA信任库的密码。
    -alias
    您希望在密钥库中分配给新CA证书条目的名称。
    -file
    要导入的新CA证书的名称。
  4. 检查新的CA证书是否已添加到您的信任库中。

    keytool -keystore config/elastic-stack-ca.p12 -list

    当提示时,输入CA信任库的密码。

    输出应包含现有的CA证书和您的新证书。如果您之前使用elasticsearch-certutil工具生成了密钥库,旧CA的别名默认为ca,条目类型为PrivateKeyEntry

为集群中的每个节点生成一个新的证书

edit

现在您的CA信任库已更新,请使用新的CA证书为您的节点签署证书。

如果您的组织有自己的CA,您需要 生成证书签名请求(CSRs)。CSRs包含 您的CA用于生成和签署安全证书的信息。

  1. 使用新的CA证书和密钥,为您的节点创建一个新的证书。

    ./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key
    命令参数
    --ca-cert
    指定您的新的CA证书(ca.crt)的路径,格式为PEM。您还必须指定--ca-key参数。
    --ca-key
    指定您的CA证书的私钥(ca.key)的路径。您还必须指定--ca-cert参数。
    1. 输入输出文件的名称,或接受默认的elastic-certificates.p12
    2. 当提示时,输入您的节点证书的密码。
  2. 在您正在更新密钥库的集群中的当前节点上,启动一个滚动重启

    停止在指示 执行任何需要的更改 的步骤,然后继续执行此过程中的下一步。

  3. 用新的密钥库替换现有的密钥库,确保文件名匹配。例如,elastic-certificates.p12

    如果你的 密钥库密码正在更改,那么请使用新文件名保存密钥库,以便 Elasticsearch 不会在您更新密码之前尝试重新加载该文件。

  4. 如果你需要用新文件名保存新的密钥库,请更新 ES_PATH_CONF/elasticsearch.yml 文件以使用新密钥库的文件名。 例如:

    xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12
    xpack.security.transport.ssl.keystore.type: PKCS12
    xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12
    xpack.security.transport.ssl.truststore.type: PKCS12
  5. 启动您更新了密钥库的节点。
  6. (可选) 使用 SSL证书API 验证Elasticsearch是否加载了新的密钥库。

    GET /_ssl/certificates
  7. 如果您仅更新传输层的证书(而不是HTTP层),那么请依次完成步骤2步骤6,一次更新一个节点的密钥库,直到您更新了集群中所有节点的密钥库。然后,您可以完成剩余的步骤以进行滚动重启

    否则,不要完成滚动重启。相反,继续执行为HTTP层生成新证书的步骤。

  8. (可选) 在集群中的每个节点上替换密钥库后, 列出信任库中的证书,然后删除旧的CA证书。

    如果您之前使用 elasticsearch-certutil 工具生成了您的密钥库,旧 CA 的别名默认为 ca,条目类型为 PrivateKeyEntry

    keytool -delete -noprompt -alias ca  -keystore config/elastic-stack-ca.p12 \
    -storepass 
    命令参数
    -alias
    您希望从信任库中删除的旧CA证书的密钥库别名的名称。

下一步是什么?

edit

干得好!您已经更新了传输层的密钥库。如果需要,您还可以更新HTTP层的密钥库。如果您不更新HTTP层的密钥库,那么您已经全部设置好了。

为HTTP层生成新证书

edit

您可以使用新的CA证书和私钥为HTTP层生成证书。其他组件,如Kibana或任何Elastic语言客户端,在连接到Elasticsearch时会验证此证书。

如果您的组织有自己的CA,您需要 生成证书签名请求(CSRs)。CSRs包含 您的CA用于生成和签署安全证书的信息,而不是使用elasticsearch-certutil工具 生成的自签名证书。

  1. 在安装了 Elasticsearch 的集群中的任何节点上,运行 Elasticsearch HTTP 证书工具。

    ./bin/elasticsearch-certutil http

    此命令生成一个包含证书和密钥的 .zip 文件,用于与 Elasticsearch 和 Kibana 一起使用。每个文件夹都包含一个 README.txt 文件,解释如何使用这些文件。

    1. 当被问到是否要生成一个 CSR 时,输入 n
    2. 当被问到是否要使用现有的 CA 时,输入 y
    3. 输入您的 CA 证书的绝对路径,例如 ca.crt 文件的路径。
    4. 输入您的新 CA 证书私钥的绝对路径,例如 ca.key 文件的路径。
    5. 输入您的证书的过期值。您可以输入有效期(以年、月或天为单位)。例如,输入 1y 表示一年。
    6. 当被问到是否要为每个节点生成一个证书时,输入 y

      每个证书将拥有自己的私钥,并且将为特定的主机名或IP地址颁发。

    7. 当被提示时,输入集群中第一个节点的名称。使用与 elasticsearch.yml 文件中 node.name 参数相同的值。
    8. 输入用于连接到您的第一个节点的所有主机名。这些主机名将作为DNS名称添加到您的证书的Subject Alternative Name (SAN)字段中。

      列出通过HTTPS连接到您的集群所使用的每个主机名和变体。

    9. 输入客户端可以用来连接到您的节点的IP地址。
    10. 为集群中的每个附加节点重复这些步骤。
  2. 为每个节点生成证书后,当被提示时,输入您的密钥库的密码。
  3. 解压缩生成的 elasticsearch-ssl-http.zip 文件。这个压缩文件包含一个目录,用于 Elasticsearch 和 Kibana。在 /elasticsearch 目录中,有一个为每个你指定的节点创建的目录,每个目录都有自己的 http.p12 文件。例如:

    /node1
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
    /node2
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
    /node3
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
  4. 如果需要,将每个 http.p12 文件重命名为与现有的HTTP客户端通信证书名称匹配。例如,node1-http.p12
  5. 在您正在更新密钥库的集群中的当前节点上,启动一个滚动重启

    停止在指示 执行任何需要的更改 的步骤,然后继续执行此过程中的下一步。

  6. 用新的密钥库替换现有的密钥库,确保文件名匹配。例如,node1-http.p12

    如果你的 密钥库密码正在更改,那么请使用新文件名保存密钥库,以便 Elasticsearch 不会在你更新密码之前尝试重新加载该文件。

  7. 如果你需要用新文件名保存新的密钥库,请更新 ES_PATH_CONF/elasticsearch.yml 文件以使用新密钥库的文件名。 例如:

    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.keystore.path: node1-http.p12
  8. 如果您的密钥库密码正在更改,请将您的私钥密码添加到 Elasticsearch 的安全设置中。

    ./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
  9. 从您更新了密钥库的节点开始。

    使用 cat nodes API 确认节点已加入集群:

    GET _cat/nodes
  10. (可选) 使用 SSL证书API 来验证Elasticsearch是否加载了新的密钥库。

    GET /_ssl/certificates
  11. 一次一个节点,完成 步骤5步骤10,直到您更新了集群中所有节点的密钥库。
  12. 完成剩余的步骤以进行 滚动重启, 从 重新启用分片分配 的步骤开始。

下一步是什么?

edit

干得好!您已经更新了HTTP层的密钥库。现在您可以 更新Kibana和Elasticsearch之间的加密

更新 Kibana 和 Elasticsearch 之间的加密

edit

当你使用http选项运行elasticsearch-certutil工具时,它创建了一个包含elasticsearch-ca.pem文件的/kibana目录。你使用此文件来配置Kibana以信任Elasticsearch CA用于HTTP层。

  1. elasticsearch-ca.pem 文件复制到 Kibana 配置目录, 由 KBN_PATH_CONF 路径定义。

    KBN_PATH_CONF 包含 Kibana 配置文件的路径。如果你使用归档分发版(ziptar.gz)安装 Kibana,路径默认为 KBN_HOME/config。如果你使用包分发版(Debian 或 RPM),路径默认为 /etc/kibana

  2. 如果您修改了elasticsearch-ca.pem文件的文件名,请编辑kibana.yml并更新配置以指定HTTP层的安全证书位置。

    elasticsearch.ssl.certificateAuthorities: KBN_PATH_CONF/elasticsearch-ca.pem
  3. 重启 Kibana。