签署压缩内核模块以与安全启动一起使用

签署压缩内核模块以与安全启动一起使用

我在使用 UEFI/安全启动在 Fedora 27 中签署我的 zfs 模块时遇到了一些问题,我希望这里有人能够提供帮助。

作为我通常如何执行此操作的快速说明,我使用已经生成并通过 efibootmgr 注册的密钥对 VirtualBox 模块进行签名,命令如下:

# /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./key.priv ./key.der $(modinfo -n vboxdrv)

它工作得很好,因为 vboxdrv 作为普通内核模块存在,并且我为每次内核更新成功地执行相同的操作,并且该过程足够通用,我应该能够使用 zfs 执行相同的操作。但尝试这样做失败了。检查# modinfo -n zfs,我发现 zfs 内核模块似乎作为压缩文件存在 - /lib/modules/4.15.17-300.fc27.x86_64/extra/zfs.ko.xz(这是正确的当前内核版本)。

为了查看其他地方是否存在另一个模块,我运行了# find / -name zfs.ko它,但没有返回任何内容,因此这个 .xz 文件是唯一可用的 zfs 模块。好吧,所以我运行 # xz --decompress zfs.ko.xz。这告诉我数据已损坏(xz 实用程序返回此错误,表明它不是 xz 压缩文件,或者至少以某种方式进行了修改,否则无法由内置 xz 处理) 。

# modinfo zfs只返回 zfs.ko.xz 的路径和 modinfo 错误。

所以我现在很茫然。禁用安全启动并不是我真正想要考虑的选项。如果我无法先解压缩文件,我该如何签署压缩模块?或者它是否已经用可供我下载的密钥进行了签名,我应该注册?

答案1

您可以将压缩模块解压,签名,然后重新压缩

unxz zfs.ko.xz
sign-file sha1 "${key}" "${x509}" "zfs.ko"
xz -f zfs.ko

或者更通用一点(我将其用于 evdi,灵感来自https://gist.github.com/dop3j0e/2a9e2dddca982c4f679552fc1ebb18df

for module in $(dirname $(modinfo -n evdi))/*.ko*; do
  module_basename=${module:0:-3}
  module_suffix=${module: -3}
  if [[ "$module_suffix" == ".xz" ]]; then
          unxz $module
          echo sign-file sha1 "${key}" "${x509}" "${module_basename}"
          sign-file sha1 "${key}" "${x509}" "${module_basename}"
          xz -f ${module_basename}
   elif [[ "$module_suffix" == ".gz" ]]; then
        gunzip $module
        sign-file sha1 "${key}" "${x509}" "${module_basename}"
        gzip -9f $module_basename
   else
        sign-file sha1 "${key}" "${x509}" "${module_basename}"
  fi
done

运行后就sudo depmod -a modprobe evdi可以了:)

相关内容