TLS

本指南描述了如何配置 Kolla Ansible 以启用 TLS 的 OpenStack 部署。在提供的内部和/或外部 VIP 地址上启用 TLS 允许 OpenStack 客户端验证并加密与 OpenStack 服务的网络通信。

当 OpenStack 服务暴露 API 端点时,Kolla Ansible 将为该服务配置 HAProxy,使其监听内部和/或外部 VIP 地址。HAProxy 容器将 VIP 上的请求负载均衡到运行该服务容器的节点。

OpenStack API 有两种不同的 TLS 配置层

  1. 在内部和/或外部 VIP 上启用 TLS,从而确保 OpenStack 客户端与监听 VIP 的 HAProxy 之间的通信安全。

  2. 在后端网络上启用 TLS,从而确保 HAProxy 与后端 API 服务之间的通信安全。

注意

TLS 身份验证基于由受信任的证书颁发机构 (CA) 签名的证书。商业 CA 的示例包括 Comodo、Symantec、GoDaddy 和 GlobalSign。Letsencrypt.org 是一个可以免费提供受信任证书的 CA。如果无法为您的项目使用受信任的 CA,可以使用私有 CA(例如 Hashicorp Vault)为您的域创建证书,或参阅 生成私有证书颁发机构 以使用 Kolla Ansible 生成的私有 CA。

有关支持 ACME 的 CA(例如 letsencrypt.org)的详细信息,请参阅 ACME http-01 挑战支持

快速入门

注意

Kolla Ansible 生成的证书使用简单的证书颁发机构设置,不适合生产部署。仅应在生产部署中使用由受信任的证书颁发机构签名的证书。

要使用 TLS 启用外部、内部和后端 API 部署 OpenStack,请在 globals.yml 中配置以下内容

kolla_enable_tls_internal: "yes"
kolla_enable_tls_external: "yes"
kolla_enable_tls_backend: "yes"
kolla_copy_ca_into_containers: "yes"

如果正在 Debian 或 Ubuntu 上部署

openstack_cacert: "/etc/ssl/certs/ca-certificates.crt"

如果正在 CentOS 或 Rocky 上部署

openstack_cacert: "/etc/pki/tls/certs/ca-bundle.crt"

Kolla Ansible certificates 命令会生成一个私有的测试证书颁发机构,然后使用该 CA 签署为启用的 VIP(s) 生成的证书,以测试 OpenStack 部署中的 TLS。假设您使用的是 multinode 库存

kolla-ansible certificates -i ~/multinode

内部/外部 VIP 的 TLS 配置

控制内部和/或外部 VIP 的 TLS 的配置变量是

  • kolla_enable_tls_external

  • kolla_enable_tls_internal

  • kolla_internal_fqdn_cert

  • kolla_external_fqdn_cert

注意

如果 TLS 仅在内部或外部网络上启用,则 kolla_internal_vip_addresskolla_external_vip_address 必须不同。

如果您的拓扑中仅配置了一个网络(而不是单独的内部和外部网络),则只能使用内部网络配置变量启用 TLS。

TLS 网络的默认状态是禁用的。要启用外部 TLS 加密

kolla_enable_tls_external: "yes"

要启用内部 TLS 加密

kolla_enable_tls_internal: "yes"

为了安全地使用身份验证的 TLS,需要两个证书文件,这些文件将由您的证书颁发机构提供

  • 带有私钥的服务器证书

  • 带有任何中间证书的 CA 证书

组合的服务器证书和私钥需要提供给 Kolla Ansible,其路径通过 kolla_external_fqdn_certkolla_internal_fqdn_cert 配置。这些路径默认为 {{ kolla_certificates_dir }}/haproxy.pem{{ kolla_certificates_dir }}/haproxy-internal.pem 分别,其中 kolla_certificates_dir 默认为 /etc/kolla/certificates

如果提供的服务器证书尚未受到客户端的信任,则需要将 CA 证书文件分发给客户端。在 配置 OpenStack 客户端以使用 TLS将 CA 证书添加到服务容器 中对此进行了更详细的讨论。

配置 OpenStack 客户端以使用 TLS

admin-openrc.sh 文件中配置 CA 证书的位置使用 kolla_admin_openrc_cacert 变量配置,默认情况下未设置此变量。这必须是在使用 admin-openrc.sh 的所有主机上的有效路径。

当 VIP 上启用 TLS 并且 kolla_admin_openrc_cacert 设置为 /etc/pki/tls/certs/ca-bundle.crt 时,OpenStack 客户端将通过 admin-openrc.sh 配置类似以下设置

export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=demoPassword
export OS_AUTH_URL=https://mykolla.example.net:5000
export OS_INTERFACE=internal
export OS_ENDPOINT_TYPE=internalURL
export OS_MISTRAL_ENDPOINT_TYPE=internalURL
export OS_IDENTITY_API_VERSION=3
export OS_REGION_NAME=RegionOne
export OS_AUTH_PLUGIN=password
# os_cacert is optional for trusted certificates
export OS_CACERT=/etc/pki/tls/certs/ca-bundle.crt

将 CA 证书添加到服务容器

要将 CA 证书文件复制到服务容器

kolla_copy_ca_into_containers: "yes"

kolla_copy_ca_into_containers 配置为“yes”时,/etc/kolla/certificates/ca 中的 CA 证书文件将被复制到服务容器中,以启用对这些 CA 证书的信任。这对于任何自签名或由私有 CA 签名的证书以及尚未存在于服务镜像信任存储中的证书都是必需的。Kolla 会在容器启动时将这些证书安装到容器的系统范围信任存储中。

所有证书文件名都将在复制到容器时在它们前面加上 kolla-customca- 前缀。例如,如果证书文件名是 internal.crt,则它在容器中将被命名为 kolla-customca-internal.crt

对于 Debian 和 Ubuntu 容器,证书文件将被复制到 /usr/local/share/ca-certificates/ 目录。

对于 CentOS 和 Rocky 容器,证书文件将被复制到 /etc/pki/ca-trust/source/anchors/ 目录。

在两种情况下,有效的证书都将被添加到系统信任存储中 - Debian 和 Ubuntu 上的 /etc/ssl/certs/ca-certificates.crt,以及 CentOS 和 Rocky 上的 /etc/pki/tls/certs/ca-bundle.crt

配置 CA 捆绑包

OpenStack 服务默认情况下并不总是信任系统信任存储中的 CA 证书。为了解决这个问题,应使用 openstack_cacert 变量配置容器中 CA 证书的路径。

要在 Debian 或 Ubuntu 上使用系统信任存储

openstack_cacert: /etc/ssl/certs/ca-certificates.crt

对于 CentOS 或 Rocky

openstack_cacert: /etc/pki/tls/certs/ca-bundle.crt

后端 TLS 配置

在后端服务上启用 TLS 可以保护监听内部/外部 VIP 的 HAProxy 与 OpenStack 服务之间的通信。它还能够实现支持 TLS 终止的 OpenStack 服务之间的安全端到端通信。在 Victoria 中支持后端 TLS 终止的 OpenStack 服务包括:Nova、Ironic、Neutron、Keystone、Glance、Heat、Placement、Horizon、Barbican 和 Cinder。

控制服务端点后端 TLS 的配置变量是

  • kolla_enable_tls_backend

  • kolla_tls_backend_cert

  • kolla_tls_backend_key

  • haproxy_backend_cacert

  • haproxy_backend_cacert_dir

后端 TLS 的默认状态是禁用的。要为后端通信启用 TLS

kolla_enable_tls_backend: "yes"

也可以为每个服务启用后端 TLS。例如,要为 Keystone 启用后端 TLS,请将 keystone_enable_tls_backend 设置为 yes

如果证书位于系统信任存储中,则 haproxy_backend_cacerthaproxy_backend_cacert_dir 的默认值应该足够。否则,它们应配置为安装在服务容器中的 CA 证书的位置。

每个后端服务都需要一个证书和一个私钥。在许多情况下,有必要为每个主机甚至每个服务使用单独的证书和密钥。使用以下优先级来确定证书

  • {{ kolla_certificates_dir }}/{{ inventory_hostname }}/{{ project_name }}-cert.pem

  • {{ kolla_certificates_dir }}/{{ inventory_hostname }}-cert.pem

  • {{ kolla_certificates_dir }}/{{ project_name }}-cert.pem

  • {{ kolla_tls_backend_cert }}

对于私钥

  • {{ kolla_certificates_dir }}/{{ inventory_hostname }}/{{ project_name }}-key.pem

  • {{ kolla_certificates_dir }}/{{ inventory_hostname }}-key.pem

  • {{ kolla_certificates_dir }}/{{ project_name }}-key.pem

  • {{ kolla_tls_backend_key }}

kolla_certificates_dir 的默认值是 /etc/kolla/certificates

kolla_tls_backend_certkolla_tls_backend_key 默认为 {{ kolla_certificates_dir }}/backend-cert.pem{{ kolla_certificates_dir }}/backend-key.pem 分别。

project_name 是 OpenStack 服务的名称,例如 keystonecinder

注意

后端 TLS 证书/密钥可以与用于 VIP 的证书相同,只要这些证书配置为允许来自 VIP 和内部网络的请求即可。

默认情况下,TLS 证书将由 OpenStack 服务验证为可信。虽然不建议用于生产环境,但可以禁用后端证书的验证

kolla_verify_tls_backend: "no"

使用 Let’s Encrypt 生成 TLS 证书

Let’s Encrypt 是一个免费、自动化和开放的证书颁发机构。

要启用 OpenStack 部署 Let’s Encrypt 容器以从 Let’s Encrypt 证书颁发机构获取证书,必须在 globals.yml 中配置以下内容

enable_letsencrypt: "yes"
letsencrypt_email: "<The email used for registration and recovery contact>"

Let’s Encrypt 容器将尝试每 12 小时更新您的证书。如果证书已更新,它们将使用 SSH 自动部署到 HAProxy 容器。

注意

如果 letsencrypt_email 不是有效的电子邮件,则 letsencrypt 角色将无法正常工作。

注意

如果将 enable_letsencrypt 设置为 true,则 haproxy 的 socket 将以管理员访问级别运行。这是 Let’s Encrypt 与 HAProxy 交互所必需的。

可以通过在 letsencrypt_internal_cert_serverletsencrypt_external_cert_server 上设置服务器 URL,为内部和外部证书请求配置单独的 ACME 服务器。默认的外部证书 ACME 服务器设置为 https://acme-v02.api.letsencrypt.org/directory

Let’s Encrypt 管理

期望的结果

设置

仅外部(默认)

启用 Let’s Encrypt;无需进行其他更改。

外部 + 内部

设置 letsencrypt_internal_cert_server 并确保可以从控制器访问它。

仅内部

设置 letsencrypt_external_cert_server: "" 并设置 letsencrypt_internal_cert_server

生成私有证书颁发机构

注意

Kolla Ansible 生成的证书使用简单的证书颁发机构设置,不适合生产部署。仅应在生产部署中使用由受信任的证书颁发机构签名的证书。

并非总是可以获得受信任的 CA 签名的证书。在开发或内部测试 OpenStack 部署中,本地生成证书以启用 TLS 可能会很有用。

为了方便起见,kolla-ansible 命令将基于 globals.yml 配置文件的信息和库存文件生成必要的证书文件

kolla-ansible certificates -i multinode

certificates 角色执行以下操作

  1. 生成测试根证书颁发机构

  2. 生成由根 CA 签名的内部/外部证书。

  3. 如果启用了后端 TLS,则生成由根 CA 签名的后端证书。

组合的证书和密钥文件 haproxy.pem(这是 kolla_external_fqdn_cert 的默认值)将被生成并存储在 /etc/kolla/certificates/ 目录中,并且 CA 证书 (root.crt) 的副本将被存储在 /etc/kolla/certificates/ca/ 目录中。

在 kolla-ansible 之外生成您的证书

如果您想直接在您的主机上通过 kolla-ansible 之外的方式管理您的 TLS 证书,可以通过将 kolla_externally_managed_cert 设置为 true 来实现。这将使 kolla-ansible 忽略操作员复制到 kolla-ansible 管理的主机的任何证书,并保持其他 TLS 配置选项不变。

如果使用此选项,请确保所有证书都存在于适当的主机上的适当位置。