SSL PKI

https://blueprints.launchpad.net/tripleo/+spec/tripleo-juno-ssl-pki

我们的每个云环境都需要多个 SSL 证书才能运行。我们需要支持在开发测试环境中生成这些证书,使其尽可能地模拟实际部署的需求。我们还需要支持与现有组织的 PKI(公钥基础设施)进行接口。本规范概述了我们将如何解决这些需求。

问题描述

我们有一些服务需要 SSL 证书

  • Keystone

  • 公共 API

  • Galera 复制

  • RabbitMQ 复制

开发人员需要自动生成这些证书,而组织可能希望使用他们现有的 PKI。我们尚未明确在哪个级别管理这些证书和/或其 CA(证书颁发机构),以及在哪个级别用户将负责它们。公共 API 可能与仅面向内部的服务使用不同的 CA,这进一步增加了复杂性。

提议的变更

这些服务中的每一个都将接受其 SSL 证书、密钥和 CA,通过环境 JSON(用于 over/undercloud 的 heat 模板,用于 seed 的 config.json)。

在最精细的级别,用户可以通过编辑 over/undercloud-env.json 或 config.json 文件来指定这些值。如果为某个服务指定了证书和密钥,那么我们将不会尝试为该服务自动生成一个。如果仅指定了证书或密钥,则被认为是一个错误。

如果未为某个服务指定证书和密钥,我们将尝试生成证书和密钥,并使用我们生成的自签名 CA 对证书进行签名。在这种情况下,undercloud 和 seed 将共享一个自签名 CA,而每个 overcloud 将拥有一个单独的自签名 CA。我们还将此自签名 CA 添加到使用正在创建的云的服务的主机信任链中。

未来迭代将解决使用自定义 CA 对自动生成的证书进行签名的方案。

替代方案

目前尚未提出。

安全影响

此更改具有高度的安全影响,因为它会影响我们的 PKI。我们目前没有任何 SSL 支持,因此实施此功能应该可以提高我们的安全性。我们应该确保我们在此更改中创建的所有密钥文件都具有 0600 的文件权限,并且它们所在的目录具有 0700 的权限。

SSL 密钥生成有很多安全隐患(包括熵可用性),我们将其推迟到 OpenStack 安全指南[1] 中处理。

其他最终用户影响

用户可以通过编辑 under/overcloud-env.json 文件和 seed config.json 文件与此功能进行交互。此外,当前用于指定 keystone CA 和证书的属性将被更改,以支持更通用的命名方案。

性能影响

我们将执行密钥生成,这可能需要相当多的资源,包括熵源。

其他部署者影响

开发人员影响

将为开发人员生成更多的 SSL 密钥。一旦采用 SSL,通过监控网络流量进行调试也可能更加困难。生产环境还需要 SSL 解包来调试网络流量,因此这将使我们能够更接近地模拟生产环境(开发人员现在可以发现缺失的 SSL 包装)。

实现

os-cloud-config 中 generate-keystone-pki 背后的代码将被泛化,以支持单独创建 CA 和证书,并支持使用单个 CA 创建多个证书。将创建一个名为“generate-ssl-cert”的新脚本,该脚本接受 heat 环境 JSON 文件和服务名称。这将添加 ssl.certificate 和 ssl.certificate_key 属性在 servicename 属性下(如下例所示)。如果未定义 ssl.ca_certificate 和 ssl.ca_certificate_key 属性,则此脚本将执行自签名证书的生成。

示例 heat 环境输出

{
  "ssl": {
    "ca_certificate": "<PEM Data>",
    "ca_key": "<PEM Data>"
  },
  "horizon" {
    "ssl": {
      "ca_certificate": "<PEM Data>",
      "ca_certificate_key": "<PEM Data>"
    },
  ...
  },
...
}

负责人

主要负责人

greghaynes

工作项

  • 泛化 os-cloud-config 中的 CA/证书创建。

  • 添加在 -env.json 文件中检测证书密钥对的逻辑,用于开发测试

  • 如果未找到服务的证书,则使开发测试脚本调用 CA/证书创建脚本

依赖项

上述服务尚未全部设置为使用 SSL 证书。在我们能够为所有服务添加用户指定证书的检测逻辑之前,这是必需的。

测试

将为 os-cloud-config 中的新功能创建测试。开发测试的默认行为旨在密切模拟生产设置,使我们能够最好地利用我们的 CI。

文档影响

我们需要记录“其他最终用户影响”中描述的新接口。

参考资料

  1. Openstack 安全指南:https://docs.openstack.org/security-guide/content/