密码轮换

本指南描述了如何更改 Kolla-Ansible 使用的 passwords.yml 文件中的内部密钥。它不涵盖每个可能的 passwords.yml 变量,仅涵盖最常见的变量。

警告

在进行任何更改之前,请务必备份您的 passwords.yml 文件。否则,很容易犯下无法恢复的错误。

警告

本指南依赖于 Kolla 和 Kolla-Ansible 的最新更改。如果将本指南应用于较旧的部署,您可能会遇到错误。建议在继续操作之前,将您的容器和 kolla-ansible 更新到最新版本。

重新生成密钥

可以使用 kolla-genpwd 快速重新生成密码。

假设存在一个 /etc/kolla/passwords.yml 文件,请进行备份

cp /etc/kolla/passwords.yml ./passwords.yml.bak

编辑 passwords.yml 文件,以删除需要重新生成的任何密钥的密码字符串,例如,将 foo: "bar" 更改为 foo:

重新生成已删除的密码

kolla-genpwd -p /etc/kolla/passwords.yml

应用重新生成的密钥

大多数密钥可以通过使用 kolla-ansible reconfigure 重新配置服务来应用。以下是可以通过这种方式应用密钥的列表。

  • *_keystone_password

  • *_database_password(不包括 nova_database_password

  • *_ssh_key(不包括 kolla_ssh_key

  • keystone_admin_password

  • designate_rndc_key

  • keepalived_password

  • libvirt_sasl_password

  • metadata_secret

  • opensearch_dashboards_password

  • osprofiler_secret

  • prometheus_alertmanager_password

  • qdrouterd_password

  • valkey_master_password

可以更改更多密钥,但有些需要手动步骤。手动步骤因密钥而异。它们按应更改它们的时间顺序在下面列出。完成所有手动步骤后,重新配置服务(kolla-ansible reconfigure)。

为了简单起见,本指南假定正在使用 Docker。通过将所有相关命令中的 docker 实例替换为 podman,相同的命令也应适用于 Podman 部署。

Kolla SSH 密钥

目前,Kolla-Ansible 中没有机制可以轮换 kolla_ssh_key。但是,使用标准的 Ansible playbook 执行此任务相对简单,或者可以在较小的部署中手动执行。

Horizon 密钥

Horizon 密钥(horizon_secret_key)是唯一的,因为它明确支持轮换。实际上,它是一个 Django 密钥,用于加密签名,例如生成密码恢复链接。为了最大限度地减少对用户的影响,可以一次设置两个密钥。新的密钥将用于生成新的工件,而旧的密钥仍将接受现有工件。

记下旧密码,生成新密码,并记下它。

将其添加到 passwords.yml 文件中,以及旧密钥,格式如下(包括中间的引号)

horizon_secret_key: newsecret' 'oldsecret

重要的是要记住,在所有旧工件过期后(例如,大约一到两周后),删除旧密钥并再次重新配置服务。

Grafana 管理员密码

Grafana 管理员密码(grafana_admin_password)必须手动轮换。

  1. 生成新的 Grafana 管理员密码。

  2. passwords.yml 中替换旧密码。

  3. 执行到任何 Grafana 容器

    docker exec -it grafana bash
    
  4. 运行密码重置命令,然后输入新密码

    grafana-cli admin reset-admin-password --password-from-stdin
    

数据库密码

数据库管理员密码(database_password)必须手动轮换。

  1. 生成新的数据库密码。

  2. passwords.yml 中替换旧密码,记下新旧密码。

  3. SSH 到运行 MariaDB 容器的主机。

  4. 执行到 MariaDB 容器

    docker exec -it mariadb bash
    
  5. 登录到数据库。系统将提示您输入密码。使用 database_password 的旧值

    mysql --batch -uroot -p
    
  6. 检查 root 用户的当前状态

    SELECT Host,User,Password FROM mysql.user WHERE User='root';
    
  7. 更新 root 用户的密码

    SET PASSWORD FOR 'root'@'%' = PASSWORD('newpassword');
    
  8. 检查用户列表中密码哈希是否已更改

    SELECT Host,User,Password FROM mysql.user WHERE User='root';
    
  9. 如果有任何剩余的 root 用户使用旧密码,例如 root@localhost,也更改他们的密码。

Nova 数据库密码

nova 数据库管理员用户密码(nova_database_password)必须手动轮换。

警告

从此时开始,API 服务可能会中断。

  1. 生成新的 Nova 数据库密码。

  2. passwords.yml 中替换旧密码。

  3. 执行到 nova_conductor 容器

    docker exec -it nova_conductor bash
    
  4. 列出单元

    nova-manage cell_v2 list_cells --verbose
    
  5. 找到 cell0 的条目,复制数据库连接值,将字符串中的密码替换为新值,并使用以下命令更新它

    nova-manage cell_v2 update_cell --cell_uuid 00000000-0000-0000-0000-000000000000 --database_connection "CONNECTION WITH NEW PASSWORD HERE" --transport-url "none:///"
    

    (如果 cell0cell_uuid 不是 00000000-0000-0000-0000-000000000000,请相应地更改上述命令)

Heat 域管理员密码

keystone 中 heat 域管理员服务用户的密码(heat_domain_admin_password)必须手动轮换。

它可以由管理员像任何其他标准的 OpenStack 用户密码一样更改。生成新密码,替换 passwords.yml 中的旧密码,然后手动应用更改

openstack user set --password <password> heat_domain_admin --domain heat_user_domain

RabbitMQ 密钥

RabbitMQ 使用两个主要密钥。用于集群成员资格的 Erlang cookie(rabbitmq_cluster_cookie),以及 RabbitMQ 管理用户密码(rabbitmq_password)。目前没有记录的流程可以无缝轮换这些密钥。许多 OpenStack 服务使用 RabbitMQ 进行通信,并使用新凭据重新配置它们可能需要一些时间,从而导致相对较长的 API 中断。

建议先停止所有服务,然后停止并销毁 RabbitMQ 容器和卷。由于销毁了 RabbitMQ 容器,应使用 kolla-ansible deploy 重新启动服务,而不是 kolla-ansible reconfigure。详细步骤如下

  1. 生成新的 rabbitmq_cluster_cookierabbitmq_password

  2. 替换 passwords.yml 中的旧值。

  3. 停止 OpenStack 服务

    kolla-ansible stop -i inventory
    
  4. 在每个运行 RabbitMQ 的节点上,销毁其容器和卷

    docker stop rabbitmq
    docker rm rabbitmq
    docker volume rm rabbitmq
    
  5. 重新部署服务

    kolla-ansible deploy -i inventory
    

重新部署后的更改

服务重新部署后,应刷新现有的 Memcached 数据。旧的 Memcached 密码将不再使用,因此使用它存储的任何数据都将无法访问。

以下说明必须从可以访问 Memcached 容器的网络的主机运行。如果您不确定,请从正在运行 Memcached 的主机运行它们。

  1. 安装 telnet 客户端

    apt/dnf install telnet
    
  2. 检查 Memcached 使用的 IP 和端口的配置(在每个运行 Memcached 的主机上)

    sudo grep command /etc/kolla/memcached/config.json
    

    IP 和端口将分别在 -l-p 之后打印

  3. 对于每个容器,启动 Telnet 会话,清除所有数据,然后退出

    telnet <ip> <port>
    flush_all
    quit
    

已知超出范围的密钥

以下是已知超出本指南范围的密码列表。

  • docker_registry_password - kolla-ansible 无法管理 docker 注册表。