centos内核编译与其签名机制



linux内核3.7引入的签名机制,极大地方便了对内核模块的安全认证,同时也为操作系统厂家提供了IP保护的技术手段。不过,凡事有利也有弊。对刚刚接触具有签名机制的内核的工程师而言,需要一段理解并适应新内核的过程。为此,小编结合自己的工作经历,总结了一些要点和大家一起分享 。


1.什么是内核签名机制?


内核签名就是内核利用公钥对驱动模块校验的过程,对检验通过的模块,准许加载,而对没有签名的内核驱动模块或者签名没有通过检验的模块,根据不同的内核选项,禁止或者允许加载。


2.如何使用内核签名?


内核签名可以使用的场合包括但不限定于:

1.和某个内核或者操作系统厂商紧密捆绑的驱动模块,包括仅仅限定于特定版本内核的内核驱动模块;

2.受限或者受控的驱动模块,包括在操作系统或者内核无法改变的情况下,只能在知道公钥和私钥的情况下生成可被加载的驱动模块。


3.签名校验可能带来哪些不便?


在使用了签名校验的操作系统上进行内核的重新编译和模块的二次开发时,如果不知道先前的私钥和公钥生成算法的话,就无法直接加载新编译出的内核二进制或者驱动模块。


4.如何规避可能的影响?


禁止内核签名检验,并重新生成对应的initramfs,修改boot memu,重新引导系统从自己新加的boot entry启动。


5.实战举例


下面以centos 7 (based on linux kernel 3.10)为例,介绍具体的操作步骤:


1.从官网下载和当前文件系统版本一致的Centos .DVD或者其他文件系统映像;




2. 把映像烧写到启动盘或者用UltraISO等启动盘制作软件打开,从其rpm仓库中中找到对应的内核二进制、confg配置文件(x86_64_config)、initramfs;




3.根据上面找到的内核二进制版本,去官网上下载对应的内核源代码rpm或者压缩文件,解压后,把上面找到的配置文件拷贝过来作为 .config。当然,默认的.config文件也可以来自待更新的系统的/boot/下自带的config文件;




4. make menuconfig查看默认的配置,重点检查sign相关的选项,如果:


  • 内核配置文件没有使用签名机制,所有的sign checking option都关掉:


说明没有使用签名检验,可以直接修改内核驱动或者内核以及配置文件,make 后生成新的内核活驱动,或者make modules_×××tall或者make ×××tall,生成的内核或者驱动可以替换之前的模块直接使用。


  • 内核已经使用内核签名校验,那么需要参考下面的步骤来制作可以启动的内核或驱动:


  1. 运行make menuconfig,务必去掉force module sign checking选项,否则生成的内核只会加载和当前公钥相匹配的驱动,而我们很难保证内核二进制的公钥、initramfs模块里的公钥和文件系统里面/lib/modules下面驱动模块里的公钥完全一致。

  2. 运行make

  3. 指定kernel ×××tall 路径 INSTALL_MOD_PATH

  4. make modules_×××tall

  5. 利用dracut -k  kernel.img $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE) 来生成和内核匹配的initramfs

  6. 把对应arch下面的bzImage和initramfs拷贝到/boot/

  7. 往/etc/grub.cfg里添加引导bzImage和initramfs的启动项,然后运行grub2-mkconfig

  8. 重启,然后在grub里选择自己刚添加的kernel entry,进入操作系统,使用并验证新的内核和驱动。