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 被其他用户窃取。并且最终用户可以在忘记密码时重置控制台密码。

提议的变更

  • 将在 nova API 中提供一个新的 microversion (nova get-*-console 子命令),并且 OSC 需要提供一个特定的版本来重置远程控制台密码。

  • nova API 将扩展以支持在创建远程控制台时使用控制台密码。有两个 create console API。第一个仅用于旧的 nova-consoles 服务(仅限 XenAPI),并在 Ussuri 版本中被移除 [1]。第二个,我们将对其进行更改以支持控制台密码,仍然有效 [2]。并且其他控制台的服务器操作 [3],控制台输出服务器操作仍然需要保护,并且当实例设置了密码时,也需要阻止已弃用的操作。

  • 将向 nova-compute 和 virt 驱动程序提出更改,以处理 Reset Remote Console Password 请求。并且这仅针对 libvirt 驱动程序实现。对于其他 virt 驱动程序,将引发 NotImplement。

  • 将向 nova-novncproxy 提出更改:将添加身份验证方案(例如:rfb.VNC)。由于项目 noVNC 已经提供了对密码身份验证的本机支持(RFB 版本协商、握手和密码身份验证),因此 rfb.VNC 可以逃避这些任务。

备选方案

将向启动实例添加新的启动参数 console_password。密码将用于组装 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 和 (protocol, type),并且协议/类型不在支持列表中,将返回 HttpBadRequest 400

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

安全影响

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

如果强制重启实例,则在启动时将重新创建 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 身份验证方案。

[vnc]
auth_schemes = none,vnc,vencrypt

开发人员影响

升级影响

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

实现

负责人

主要负责人

brinzhang

其他贡献者

songwenping

功能联络人

功能联络人

brinzhang

工作项

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

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

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

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

依赖项

测试

添加相关的单元测试

文档影响

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

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

  • Configuration Reference & Deployment Guides 需要进行一些更新。在 nova.conf 中添加了一个更改以启用 rfb.VNC 身份验证方案(nova -novncproxy 关心)。

参考资料

历史

修订

发布名称

描述

Ussuri

已批准

Victoria

重新提出

Wallaby

重新提出