Nova 提供带有密码身份验证的远程控制台

https://blueprints.launchpad.net/nova/+spec/nova-support-webvnc-with-password-authentication

该特性旨在提供更安全的带有密码身份验证的远程控制台。最终用户可以为他们的实例设置控制台密码。任何试图访问密码加密的实例控制台的用户都会从 Web 控制台获得一个锁定的窗口,提示输入 密码,这提供了与使用 VNC 客户端(例如 vncviewer)访问需要密码身份验证的 VNC 服务器几乎相同的体验。

问题描述

目前 nova novncproxy 仅使用 token 进行身份验证,将 token 参数附加到请求的 access_url。虽然这很方便,但任何获得 access_url 信息的人(例如,对租户业务过于好奇的云管理员)都可以直接通过 Web 控制台操作实例,这并不安全。

现在,远程控制台密码身份验证的实现将阻止恶意用户在密码身份验证失败时使用实例,即使他们获得了 access_url。

用例

最终用户可以设置远程控制台密码,以避免控制台访问 URL 被其他用户窃取。并且最终用户可以在忘记密码时重置控制台密码。

提议的变更

  • 将对 python-novaclient (nova get-*-console 子命令) 和 python-openstackclient 中的等效代码进行补丁,以提供 --password 用于重置远程控制台密码。

  • 将对 nova-api 进行补丁,在创建远程控制台时:将添加额外的逻辑来处理两种情况(提供控制台密码和未提供)。如果未提供密码,则将其视为现有的 Create Remote Console 操作,然后跳转到旧逻辑。或者,我们知道这是一个重置 Remote Console 密码的请求,并将 RPC 调用发送到计算服务以重置控制台密码。

  • 将对 nova-compute 和 virt 驱动程序进行补丁,以处理 Reset Remote Console Password 请求。并且此实现仅针对 libvirt 驱动程序。对于其他 virt 驱动程序,将引发 NotImplement 异常。

  • 将对 nova-novncproxy 进行补丁:将添加身份验证方案(例如:rfb.VNC)。由于项目 noVNC 已经提供了对密码身份验证的本机支持(RFB 版本协商、握手和密码身份验证),因此 rfb.VNC 可以跳过这些工作。

备选方案

将向启动实例添加新的启动参数 console_pasword。密码将用于组装 libvirt XML 中的 graphics 标签。这样,就可以实现密码加密的远程控制台。此实现的缺点是实例启动后没有提供 API 来重置控制台密码。

数据模型影响

REST API 影响

将添加新的 microversion,为 Create Remote Console API 提供额外的 password 参数。

URL: /servers/{server_id}/remote-consoles

  • 请求方法: POST(更新远程控制台密码)将 password 参数添加到请求体中

  • 更新 Create-Remote-Console API

    {
       "remote_console": {
           "protocol": "vnc",
           "type": "novnc",
           "password": "newpass"
       }
    }
    

    密码采用常见的密码格式(不超过 8 个字符,请参阅 vnc security)。password 参数是可选的

    • 如果存在 password,在获取新的 access_url 时将更新控制台密码。

    • 只有 vncspice 控制台协议/类型支持重置密码。如果同时提供了 password 和(protocoltype),并且协议/类型不在支持列表中,将返回 HttpBadRequest 400

    • 对于不支持的 virt 驱动程序,将返回 HttpNotImplemented 501

安全影响

这肯定会使 Web 控制台更安全。请注意,控制台密码将仅由 libvirtd 安全地保存,并且不会显示在 virsh dumpxml <instance UUID> 或 libvirt /qemu 在本地文件系统管理的定义 XML 中,除了。简而言之,不会引入潜在的安全风险。

通知影响

其他最终用户影响

这会对最终用户产生影响

  • 受益于此功能的 Web GUI 允许最终用户为他们的实例设置/重置控制台密码。

  • 当最终用户通过 Web GUI 访问密码加密的实例控制台时,Web 控制台将提示输入控制台密码。

  • 新的 get-*-console CLI 可能如下所示(使用 nova 命令)

    $ nova get-vnc-console --vnc-password='newpasswd' <VM UUID> ...
    $ nova get-spice-console --vnc-password='newpasswd' <VM UUID> ...
    

性能影响

其他部署者影响

nova.confvnc 段中,将新的选项 vnc 添加到 auth_schemes 列表中。这允许 nova-novncproxy 检测并加载 rfb.VNC auth 方案。

[vnc]
auth_schemes = none,vnc,vencrypt

开发人员影响

升级影响

我们应该升级服务对象版本和 rpc 版本,用于 ‘get_*_console’ rpc 调用。只有当集群完全升级到 Victoria 版本时,调用才能成功。否则,返回失败请求。

实现

负责人

主要负责人

pandatt

其他贡献者

brinzhang

功能联络人

功能联络人

Alex Xu

工作项

  • python-novaclient(以及 openstackclient):将在 get-*-console 命令中添加新的 --password 选项,并添加一些处理此值的代码。

  • nova-api:一些代码用于判断是否调用旧的 get-*-console API,或者调用远程计算服务以重置远程控制台密码。

  • nova-compute:处理重置控制台密码请求的一些代码:使用密码重新组装图形标签并将其更新到 libvirt XML。

  • nova-novncproxy:一些代码用于实现 rfb auth 方案、安全类型协商(在当前版本中,novncproxy 告诉 tenant_sock 在作为客户端和 vnc 服务器之间的中介时使用硬编码的 vnc.AuthType.NONE,尽管 noVNC 客户端提供对带有密码安全握手的 vnc.AuthType.VNC 的本机支持)和 security handshake(无操作,让 noVNC/websockify 完成工作)。

依赖项

测试

添加相关的单元测试

文档影响

  • 操作指南 需要进行一些更新,在 #User-Facing Operations# 部分。 nova get-*-console(或使用 openstack CLI 的等效命令)为用户提供 --vnc-password 选项以重置控制台密码。

  • API 指南 不需要更新。但是,应该发布一些文本,通知开发人员如何从这项功能中受益。

  • 配置参考 & 部署指南 需要进行一些更新。添加了 nova.conf 中的一项更改,以启用 rfb.VNC auth 方案(nova -novncproxy 关心)。

参考资料

历史

修订版

发布名称

描述

Ussuri

已批准

Victoria

Reposeposed