实验目的

  1. 了解TPM安全芯片的组成和作用
  2. 掌握计算平台信任链扩展的原理及作用
  3. 掌握IMA的工作原理及作用

实验内容

扩展Linux系统增加IMA功能,使信任链由OS层扩展到用户应用层。运行三类程序,观察IMA的作用:用户应用程序、共享库、内核模块。

实验过程、结果

  1. 实验使用的是 Ubuntu16.04 操作系统
  2. 在该版本内核中,已默认勾选IMA功能,并挂载了 securityfs 文件系统
  3. 为系统启用 IMA 功能,编辑引导文件 /etc/default/grub,增加启用选项:
    即在 GRUB_CMDLINE_LINUX 一项中加入 ima_tcb 即可
  4. 更新引导文件, sudo update-grub2,重启系统
  5. 查看IMA记录的应用度量值
    1
  6. 运行程序观察IMA的作用

    1. 用户应用程序
      编写任意C应用程序hello.c,编译并运行,观察观察ima securityfs的变化。程序的编译和运行参考如下命令:

      $ gcc hello.c -o hello
      $ ./hello

      hello.c

      #include <stdio.h>
      
      int main() {
        printf("Hello World\n");
      } 

      运行 cat/sys/kernel/security/ima/ascii_runtime_measurements 命令后,结果如下图所示。可以看到运行应用程序之后 /home/dreamer/codes/hello 出现在 IMA 度量值中。
      2

    2. 共享库

      编写任意Linux共享库(*.so),并编写任意c应用链接此共享库,编译并运行,观察 ima securityfs 的变化,参考以下命令

      $ gcc -o libhello.so -fPIC -shared hello.c
      $ cp libhello.so /lib
      $ gcc -o main -lhello main.c
      $ ./main

      hello.c

      #include <stdio.h>
      
      void print_hello() {
        printf("Hello World\n");
      }

      main.c

      extern void print_hello();
      
      int main(int argc, char argv[]) {
        print_hello();
        return 0;
      }

      运行 cat /sys/kernel/security/ima/ascii_runtime_measurements 命令后,观察到结果如下图所示,/lib/libhello.so/home/dreamer/codes/2/main 出现在 IMA 度量值中。

      3

    3. 内核模块

      编写任意 Linux 内核模块,编译并加载,观察 ima securityfs 的变化。命令参考如下

      $ make
      $ insmod hello.ko
      $ dmesg
      $ rmmod hello.ko
      $ dmesg

      hello.c

      #include <linux/module.h> 
      #include <linux/kernel.h>   
      #include <linux/init.h> 
      
      /*用于告诉内核该模块拥有GPL license*/
      MODULE_LICENSE("GPL");
      
      /*执行模块初始化工作*/ 
      static int __init hello_init(void) { 
         printk(KERN_INFO "Hello,module\n"); 
         return 0; 
      } 
      
      /*执行模块析构工作*/ 
      static void __exit hello_exit(void) { 
         printk(KERN_INFO "Goodbye,module\n"); 
      } 
      
      /*该函数注册模块的构造函数*/ 
      module_init(hello_init); 
      /*该函数注册模块的析构函数*/ 
      module_exit(hello_exit);

      Makefile

      obj-m := hello.o 
      
      all: 
         make -C /lib/modules/$(shell uname –r)/build M=$(PWD) modules
      
      clean:
         make -C /lib/modules/$(shell uname –r)/build M=$(PWD) clean 

      查看 kernel message 可以发现程序的打印信息。

      4

      运行 cat /sys/kernel/security/ima/ascii_runtime_measurements 命令后,观察到结果如下图所示 /home/dreamer/codes/3 目录下的各文件出现在 IMA 度量值中。

      5

实验总结

实验收获

学到了IMA方面的知识,对Linux操作系统有了进一步的了解。

遇到的问题和解决办法

IMA 功能虽默认编译进内核,但默认情况下不会启用,执行 cat /sys/kernel/security/ima/ascii_runtime_measurements 命令得不到正确的结果,解决办法已记录在上面三、实验过程中的第3、4步骤。

在使用共享库时,无法编译 main.c ,错误提示为“未声明的函数”,这其实是 gcc 的特性,需要将依赖项写在后面,源码写在前面,即编译命令应该为 gcc -o main main.c -lhello

总结实验的不足,及进一步的改进措施

最后修改:2020 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏