Yoga 系列 (19.0.0 - 20.1.x) 发行说明¶
20.1.3-14¶
升级说明¶
升级 Ironic 以解决
qemu-img镜像转换安全问题时,还需要升级ironic-python-agentramdisk。
作为对
qemu-img镜像转换安全问题进行修复的结果,Ironic 添加了一个新的配置参数[conductor]permitted_image_formats,默认值为“raw,qcow2,iso”。 Raw 和 qcow2 格式的磁盘镜像是在 Ironic 社区始终声明允许并期望与 Ironic 一起使用的镜像格式。 这些格式也与社区测试的格式相匹配。 如果利用其他磁盘镜像格式的操作员,可能需要进一步修改此设置。
安全问题¶
Ironic 现在检查提供的镜像格式值与镜像文件的检测格式是否匹配,如果值不匹配,将阻止部署。 如果与 Glance 一起使用并且检测到元数据不匹配,则需要重新上传镜像,以表示更正后的元数据。 这是由跟踪的 CVE-2024-44082 引起的 bug 2071740。
Ironic 始终 检查通过 conductor 传递的提供的用户镜像内容是否安全,然后再部署节点,即使镜像以
raw格式提供。 这用于识别镜像的格式和镜像的整体安全性,以便明确拒绝具有未知或不安全功能使用的源镜像。 可以通过将[conductor]disable_deep_image_inspection设置为True来禁用此功能。 这是由跟踪的 CVE-2024-44082 引起的 bug 2071740。
Ironic 还会检查通常作为直接下载 URL 提供的镜像,由
ironic-python-agentramdisk 提供。默认情况下启用此功能,会增加导管的网络流量和磁盘空间利用率。可以通过将[conductor]conductor_always_validates_images设置为False来禁用此级别的检查。不建议这样做,因为 Zed 版本及更早版本的ironic-python-agentramdisk 将无法使用,原因是存在回退回归风险。这是由 CVE-2024-44082 跟踪的 bug 2071740 导致的。
Ironic 现在显式执行
[conductor]permitted_image_formats设置中允许的镜像类型列表,默认值为“raw”、“qcow2”和“iso”。 虽然该项目历来一直声明允许的镜像为“qcow2”和“raw”,但之前可以提供其他qemu-img已知的镜像格式,并且该实用程序会尝试转换镜像。 需要“iso”支持才能支持“从 ISO 启动”ramdisk。
Ironic 现在显式将源输入格式传递给
qemu-img的执行,以限制可能评估镜像的允许 qemu 磁盘镜像驱动程序,以防止针对qemu-img的不匹配格式攻击。
ansible部署接口示例 playbook 现在为qemu-img的执行提供输入格式。 如果您正在使用自定义 playbook,请将“-f {{ ironic.image.disk_format }}”添加到对qemu-img的调用中。 如果您没有这样做,qemu-img将自动尝试猜测,这可能导致已知的不安全问题,因为源格式驱动程序不正确。
已经实施任何自定义部署驱动程序或附加功能的运营商应审查他们的下游代码,以确保他们正确调用
qemu-img。 如果有任何问题或疑虑,请联系 Ironic 项目开发人员。
提醒操作员,他们应在其环境中利用清理。 禁用任何安全功能,例如清理或镜像检查,是您自己承担风险。 如果您在使用安全相关功能时遇到任何问题,请不要犹豫,向项目提交错误报告。
[conductor]disable_deep_image_inspection设置会自动传递给ironic-python-agentramdisk,并将阻止这些运行 ramdisk 在写入镜像之前执行深度检查。
[conductor]permitted_image_formats设置会自动传递给ironic-python-agentramdisk。 如果需要显式允许其他格式,则应在 Ironic 服务配置中进行设置。
Ironic 中的一个问题已得到解决,即在将镜像转换为
raw格式镜像之前,不会检查提供的镜像校验和。在默认设置下,这通常不会发生,但是
image_download_source选项,该选项可设置为节点级别进行单个部署,默认情况下,对于该裸机节点在所有情况下,或者通过[agent]image_download_source配置选项设置为local。 默认设置是http。这与
[DEFAULT]force_raw_images设置为True结合使用,导致 Ironic 下载并转换文件。在 Ironic 在更大的 OpenStack 部署中使用时,镜像来自 Glance 镜像服务,之前的模式没有问题。 该问题是由于能够提供、缓存和转换由经过身份验证的用户提供的 URL 提供的磁盘镜像而引入的。
Ironic 现在将在镜像转换之前验证 conductor 提供的用户提供的校验和。 可以通过设置
[conductor]disable_file_checksum配置选项来禁用此功能。
修复了 OSSA-2025-001,其中 Ironic 在用作镜像源时,没有正确过滤 file:// 路径。 这将允许 conductor 可以访问的任何文件被用作镜像来尝试部署。
添加了
CONF.conductor.file_url_allowed_paths,这是一个允许列表配置,默认值为/var/lib/ironic、/shared/html、/opt/cache/files、/vagrant和/templates,允许操作员进一步限制导管在提供 file:// URL 时获取镜像的位置。此默认值是根据 Ironic 下游项目(包括 Metal3、Bifrost 和 OpenShift)的已知用法选择的。这些默认值可能会在以后更改为更严格。鼓励使用 file:// URL 的操作员即使当前默认值足够,也显式设置此值。希望完全禁用使用 file:// URL 的能力的操作员应将此配置设置为 “” (空字符串)。希望恢复原始不安全行为的操作员应将
CONF.conductor.file_url_allowed_paths设置为/。 请注意,在 2025.2 版本及更高版本中,/dev、/sys、/proc、/run和/etc将作为一项安全措施被无条件阻止。此问题仅在 Ironic 的自动清理过程被禁用并且服务配置为允许不受信任的 API 用户直接部署的情况下,才构成重大的安全风险,例如独立 Ironic 安装或将节点所有权授予项目的环境。
错误修复¶
修复了与
qemu-img工具的执行相关的图像处理中的多个问题,该工具用于图像格式转换,恶意用户可以制作磁盘镜像以潜在地从ironic-conductor进程的操作系统环境中提取信息。Ironic 现在明确地强制执行批准的图像格式列表,作为
[conductor]permitted_image_formats列表,该列表反映了 Ironic 项目历史上测试过的图像格式,并被认为是可用的。测试不基于文件扩展名,而是基于对磁盘镜像文件的内容指纹识别。这被跟踪为 CVE-2024-44082,通过 bug 2071740。
修复了一个安全问题,即 Ironic 在下载磁盘镜像文件时不会对其进行校验和检查,而 Ironic 被要求下载并将镜像转换为原始镜像格式。 这需要将
image_download_source显式设置为local,这不是默认设置。可以通过将
[conductor]disable_file_checksum设置为True来禁用此修复,但是此选项将在新的 Ironic 主要版本中删除。因此,已经引入了与 Ironic-Python-Agent 对
standaloneIronic 用户使用的校验和的支持相一致。 这包括支持通过 URL 提供远程校验和文件,以防止破坏可能无意中利用先前代码路径的现有用户。 可以通过将[conductor]disable_support_for_checksum_files设置为True来禁用此支持。
修复了 Lenovo 硬件的问题,在代理以 UEFI 引导模式将镜像写入主机后,系统固件可能会显示一个蓝色的“Boot Option Restoration”屏幕,需要手动干预才能引导已部署的节点。 该问题源于对节点的基础 NVRAM 配置进行了多次更改。 Lenovo 工程师建议仅更改 UEFI NVRAM,不要通过 BMC 进行任何进一步的更改来配置下一次引导。 Ironic 现在在 Lenovo 硬件上这样做。 有关此问题的更多信息和背景,请参阅 bug 2053064。
20.1.3¶
错误修复¶
修改 iRMC 驱动程序以使用 ironic.conf [deploy] default_boot_mode 来确定默认 boot_mode。
20.1.2¶
升级说明¶
添加了
sha256、sha384和sha512作为 iRMC 驱动程序支持的 SNMPv3 身份验证协议。
错误修复¶
修复了 Ironic 与 Cinder 的集成,因为最近与安全相关的修复导致了更改,详情请参见 bug 2004555。Ironic 中跟踪此修复的工作记录在 bug 2019892 中。Ironic 现在将服务令牌发送到 Cinder,这允许绕过原始 CVE-2023-2088 修复添加的访问限制。Ironic 本身不受影响,但由此添加的限制确实影响了 Ironic 的使用。这是因为 Ironic 卷附件不在共享“计算节点”上,而是映射到物理机器,并且 Ironic 在初始附件之后处理附件生命周期。
在中止清理时,
last_error字段不再最初为空。它现在在状态转换为clean failed时填充。
在清理或部署失败时,
last_error字段不再临时设置为None,而是在断电操作运行时。
修复了一个问题,如果启用了 selinux 并强制执行,并且发布的镜像是一个硬链接,则会保留源 selinux 上下文,导致在使用硬链接 URL 检索镜像时访问被拒绝。
修复了 iRMC 驱动程序在 parse_driver_info 中的错误,如果启用了 FIPS,即使 iRMC 驱动程序的 xxx_interface 实际上不使用 SNMP,SNMP 版本也始终需要为版本 3。
修复了
'NoneType' object is not iterable在redfish和idrac-redfishRAID 清理和部署步骤中的导管日志。该消息不再出现。对于受影响的节点,请重新创建节点或从driver_internal_info字段中删除raid_configs条目。
修复了在线升级逻辑中的一个问题,Node Traits 和 BIOS Settings 的数据库模型在执行在线数据迁移时导致错误。这是因为这些表最初是作为 Nodes 数据库表的扩展创建的,并且数据库的模式略有不同,导致如果在这些表中存在要迁移的数据(如果早期 BIOS 设置采用者在升级到 Ironic 的 Yoga 版本之前在数据库中拥有数据),则会发生错误。
在线升级参数现在在适用时替换备用主键名称。
修复了 iRMC 驱动程序的 SNMPv3 消息身份验证和加密功能。iRMC 驱动程序和 iRMC 之间的 SNMPv3 身份验证仅通过安全名称进行,没有密码和加密。为了提高安全性,现在将以下参数添加到节点的
driver_info中,可用于身份验证irmc_snmp_userirmc_snmp_auth_passwordirmc_snmp_priv_passwordirmc_snmp_auth_proto(可选,默认值为sha)irmc_snmp_priv_proto(可选,默认值为aes)
irmc_snmp_user替换了irmc_snmp_security。如果设置了irmc_snmp_user,则将忽略irmc_snmp_security。irmc_snmp_auth_proto和irmc_snmp_priv_proto也可以通过[irmc]部分的以下选项在/etc/ironic/ironic.conf中设置snmp_auth_protosnmp_priv_proto
修复了 PXE 初始化中的一个竞争条件,其中重试我们怀疑可能是失败的 PXE 启动操作的逻辑没有检查是否已建立
agent token,这是代理初始化的第一步。
修复了一个问题,如果在清理操作期间节点超时,代理令牌将被孤立,导致在某些情况下,节点无法在将来与 Ironic 建立新的令牌。现在,在这种情况下,我们始终擦除令牌。
其他说明¶
将
python-scciclient库的最低版本更新到0.12.2。
20.1.1¶
已知问题¶
在使用
jsonschema4.0.0 或更高版本时,请确保在自定义网络数据或 RAID 模式中包含适当的$schema字段。
安全问题¶
修改了
irmc硬件类型,以包含控制 HTTPS 证书验证强制执行的能力。默认情况下强制执行。python-scciclient 版本必须是 >=0.8.2,<0.9.0、>=0.9.4,<0.10.0、>=0.10.1,<0.11.0、>=0.11.3,<0.12.0 或 >=0.12.0,<0.13.0,否则将不会进行证书验证。
错误修复¶
修复了在仅提供
ValueDisplayName时,在redfishBIOS 接口中检测 BIOS 设置枚举的允许值的问题。
组合的
ironic可执行文件现在仅在内置的导管启动后才启动 API。这避免了导管启动时请求的 500 错误。
修复了由于数据库中查询到的当前导管被检测为离线而导致的导管尝试本地接管的问题,原因是资源匮乏导致的心跳失败。在这种情况下,导管会强制删除自己的预留并启动接管。当前导管现在从离线导管列表中排除,因此不会发生本地接管。会记录警告以突出潜在的资源匮乏问题。请参阅 bug:2010016。
修复了在快速跟踪模式下使用
redfish-virtual-media启动接口更改 BIOS 设置后重启到代理的问题。以前,未配置 ISO。
修复了
OSError: [Errno 36] File name too long,当从长内核、ramdisk 或 ESP URL 构建虚拟媒体 ISO 时出现。
修复了
redfish和idrac-redfishRAIDcreate_configuration、apply_configuration、delete_configuration清理和部署步骤,以在步骤结束时更新节点的raid_config字段。
修复了
redfish-virtual-mediaboot接口,允许它与 iDRAC 固件从 6.00.00.00(2022 年 6 月发布)一起使用,因为它修复了阻止 iDRAC 固件在使用redfish-virtual-media之前工作的虚拟媒体启动问题。如果尚未完成,请考虑升级 iDRAC 固件,否则在使用redfish-virtual-media时仍然会收到错误。
添加了
driver_info/irmc_verify_ca选项以指定证书文件。driver_info/irmc_verify_ca 的默认值为 True。
修复了一个在配置 RAID 时由于在由 irmc 硬件类型管理的节点中未将端口值转换为 int 类型而导致的问题。
修复了带有 jsonschema>=4.8 的 API 错误消息。现在可以检测到通用模式错误的潜在根本原因。
修复了与
jsonschema包版本 4.0.0 或更高版本兼容的问题,方法是提供适当的模式版本(当前为 Draft-07)。
当使用
ramdisk部署接口并且禁用自动清理时,pxe、ipxe和redfish-virtual-media启动接口不再需要提供部署内核/ramdisk。
修复了一个问题,即 Redfish 会话缓存会在更改 Redfish BMC 的密码时继续使用旧会话。现在,在这种情况下,旧会话将不再被找到,并且将使用最新的凭据信息创建新的会话。
解决了 clear_job_queue 和 reset_idrac 验证步骤失败的问题,这些问题发生在 iDRAC 不支持该功能时。当检测到此条件时,步骤中的代码会处理异常并记录警告,并在验证步骤中成功完成,但在清理步骤中失败。
其他说明¶
已知问题:在使用 iDRAC 与 Swift 暂存固件更新文件在 Management 接口
firmware_update清理步骤的redfish或idrac硬件类型中时,清理会因 iDRAC 中的错误“发生内部错误。无法完成指定的操作。”而失败。在解决此问题之前,请使用 HTTP 服务暂存 iDRAC 固件文件。
20.1.0¶
序言¶
Ironic 社区很高兴地宣布发布 Ironic 20.1。
在 Yoga 周期中,我们有四十三位贡献者。他们负责超过 35,000 行代码和超过二十个新功能,这些功能将改善我们最终用户的体验!如果您有任何问题或反馈,请联系我们的社区!
新特性¶
对于
redfish和idrac-redfish管理接口firmware_update清理步骤,添加了 Swift、HTTP 服务和文件系统支持以提供服务,以及 Ironic 的 HTTP 和 Swift 服务以暂存文件。还添加了用于文件校验和验证的强制参数checksum。
添加了对
idrac-wsmanRAID、BIOS 和管理清理步骤的支持,以便在禁用清理期间 ramdisk 时运行,无需 IPA。
支持在 Unix 套接字而不是正常的 TCP 套接字上侦听。这在使用代理模式的 HTTP 服务器(如 nginx)时很有用。
已知问题¶
在使用 iDRAC 与 Swift 暂存固件更新文件在 Management 接口
firmware_update清理步骤的redfish或idrac硬件类型中时,清理会因 iDRAC 中的错误“发生内部错误。无法完成指定的操作。”而失败。在解决此问题之前,请使用 HTTP 服务暂存 iDRAC 固件文件。
升级说明¶
对于
redfish和idrac-redfish管理接口的firmware_update清理步骤,现在强制需要checksum参数。请更新现有的清理步骤以包含它,否则清理步骤将因错误“‘checksum’ 是必需的属性”而失败。
弃用说明¶
通过网络启动最终实例(而不是通过本地引导程序)现在已被弃用,除非是从卷或 ramdisk 部署接口启动的情况。
仅针对传统 (BIOS) 引导,才能可靠地通过网络启动整个磁盘镜像。对于分区镜像,无法更新内核,这使得这种方法不安全。
使用分区镜像的用户必须确保它们包含
grub-install二进制文件、足够的 EFI 工件以引导操作系统,或传统引导分区。
错误修复¶
anaconda 部署接口将 config drive 视为字典,而它实际上可以是字典或 iso6600 格式,gzip 压缩并 base64 编码。此问题已修复。
anaconda 部署接口将处理 config drive 的命令添加到 kickstart 配置文件末尾。这意味着这些命令在向 conductor 发送 ironic API 请求以指示节点已配置并准备好重新启动之后处理。这意味着这些命令在节点关机之前完成存在潜在的竞争条件。添加了一个同步操作,以确保所有修改都已写入磁盘,然后才发送 API 请求——作为最后一步。
错误地在用户数据内容中添加了额外的换行符(‘n’)。这破坏了 content-type 解码,cloud-init 无法处理它们。这些额外的换行符已被删除。
修复了 anaconda 部署接口的逻辑。如果 ironic 节点的 instance_info 没有同时指定 ‘stage2’ 和 ‘ks_template’,我们就根本没有使用 instance_info。现在已修复,如果指定了 instance_info,则使用它。否则,‘stage2’ 将从镜像的属性中获取(假设在那里设置)。‘ks_template’ 值如果镜像属性中指定了,则从镜像属性中获取(因为它是可选的);否则,我们使用配置设置 ‘[anaconda] default_ks_template’。
对于 anaconda 部署接口,stage2 目录不正确地使用 stage2 文件的完整路径创建;此问题已修复。
anaconda 部署接口期望节点的 instance_info 填充 ‘image_url’;现在通过 PXEAnacondaDeploy 的 prepare() 方法填充了它。
对于 anaconda 部署接口,当部署完成并且 bm 节点正在重新启动时,节点的配置状态不正确地设置为 ‘active’——配置状态机机制现在处理该问题。
对于 anaconda 部署接口,用于验证 kickstart 文件的代码不正确并导致错误;此问题已得到解决。
对于 anaconda 部署接口,打包的 ‘ks.cfg.template’ 文件中的 ‘%traceback’ 部分已被弃用并导致验证失败,因此已将其删除。
anaconda 部署接口将内部信息保存在节点的
instance_info中,在用户可见的stage2和ks_template字段中。这破坏了使用不同镜像和不同stage2或模板(在镜像属性中指定)进行重建。已通过将信息保存在节点的driver_internal_info中来修复此问题。
修复了
redfish硬件类型 RAID 设备创建和删除问题,当在需要重新启动且不允许在 RAID 控制器上运行多个任务的 RAID 控制器上创建或删除多个逻辑磁盘时出现问题。在此修复之前,第二个逻辑磁盘将无法创建或删除。通过此更改,现在可以在 iDRAC 系统上使用redfishraid接口。