实验目的
- 了解TPM安全芯片的组成和作用
- 掌握计算平台信任链扩展的原理及作用
- 掌握IMA的工作原理及作用
实验内容
扩展Linux系统增加IMA功能,使信任链由OS层扩展到用户应用层。运行三类程序,观察IMA的作用:用户应用程序、共享库、内核模块。
实验过程、结果
- 实验使用的是 Ubuntu16.04 操作系统
- 在该版本内核中,已默认勾选IMA功能,并挂载了 securityfs 文件系统
- 为系统启用 IMA 功能,编辑引导文件 /etc/default/grub,增加启用选项:
即在 GRUB_CMDLINE_LINUX 一项中加入 ima_tcb 即可 - 更新引导文件, sudo update-grub2,重启系统
- 查看IMA记录的应用度量值
运行程序观察IMA的作用
用户应用程序
编写任意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 度量值中。共享库
编写任意
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
度量值中。内核模块
编写任意
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
可以发现程序的打印信息。运行
cat /sys/kernel/security/ima/ascii_runtime_measurements
命令后,观察到结果如下图所示/home/dreamer/codes/3
目录下的各文件出现在IMA
度量值中。
实验总结
实验收获
学到了IMA方面的知识,对Linux操作系统有了进一步的了解。
遇到的问题和解决办法
IMA
功能虽默认编译进内核,但默认情况下不会启用,执行 cat /sys/kernel/security/ima/ascii_runtime_measurements
命令得不到正确的结果,解决办法已记录在上面三、实验过程中的第3、4步骤。
在使用共享库时,无法编译 main.c
,错误提示为“未声明的函数”,这其实是 gcc
的特性,需要将依赖项写在后面,源码写在前面,即编译命令应该为 gcc -o main main.c -lhello
总结实验的不足,及进一步的改进措施
无